Hi, I'm observing the following bug under Ubuntu and FreeBSD, which
seems to have been introduced by this patch.

$ cd /tmp
$ seq 1 1000000 >file  # bug happens with any sufficiently large file
$ echo 'set nocompatible foldmethod=marker lazyredraw' >vimrc
$ vim -u vimrc --noplugin file

vim doesn't display the file's contents until any key is pressed.

On Thu, Dec 30, 2010 at 14:31, Bram Moolenaar <b...@moolenaar.net> wrote:
>
> Patch 7.3.091
> Problem:    "vim -w foo" writes special key codes for removed escape
>            sequences. (Josh Triplett)
> Solution:   Don't write K_IGNORE codes.
> Files:      src/getchar.c, src/misc1.c, src/term.c, src/vim.h
>
>
> *** ../vim-7.3.090/src/getchar.c        2010-10-27 17:39:00.000000000 +0200
> --- src/getchar.c       2010-12-30 12:16:36.000000000 +0100
> ***************
> *** 1506,1514 ****
>      }
>  }
>
> - #define KL_PART_KEY -1                /* keylen value for incomplete 
> key-code */
> - #define KL_PART_MAP -2                /* keylen value for incomplete 
> mapping */
> -
>  /*
>   * Get the next input character.
>   * Can return a special key or a multi-byte character.
> --- 1506,1511 ----
> ***************
> *** 2171,2177 ****
>                                        if (!timedout)
>                                        {
>                                            /* break at a partly match */
> !                                           keylen = KL_PART_MAP;
>                                            break;
>                                        }
>                                    }
> --- 2168,2174 ----
>                                        if (!timedout)
>                                        {
>                                            /* break at a partly match */
> !                                           keylen = KEYLEN_PART_MAP;
>                                            break;
>                                        }
>                                    }
> ***************
> *** 2192,2198 ****
>
>                        /* If no partly match found, use the longest full
>                         * match. */
> !                       if (keylen != KL_PART_MAP)
>                        {
>                            mp = mp_match;
>                            keylen = mp_match_len;
> --- 2189,2195 ----
>
>                        /* If no partly match found, use the longest full
>                         * match. */
> !                       if (keylen != KEYLEN_PART_MAP)
>                        {
>                            mp = mp_match;
>                            keylen = mp_match_len;
> ***************
> *** 2230,2236 ****
>                        }
>                        /* Need more chars for partly match. */
>                        if (mlen == typebuf.tb_len)
> !                           keylen = KL_PART_KEY;
>                        else if (max_mlen < mlen)
>                            /* no match, may have to check for termcode at
>                             * next character */
> --- 2227,2233 ----
>                        }
>                        /* Need more chars for partly match. */
>                        if (mlen == typebuf.tb_len)
> !                           keylen = KEYLEN_PART_KEY;
>                        else if (max_mlen < mlen)
>                            /* no match, may have to check for termcode at
>                             * next character */
> ***************
> *** 2238,2244 ****
>                    }
>
>                    if ((mp == NULL || max_mlen >= mp_match_len)
> !                                                    && keylen != KL_PART_MAP)
>                    {
>                        int     save_keylen = keylen;
>
> --- 2235,2241 ----
>                    }
>
>                    if ((mp == NULL || max_mlen >= mp_match_len)
> !                                                && keylen != KEYLEN_PART_MAP)
>                    {
>                        int     save_keylen = keylen;
>
> ***************
> *** 2264,2271 ****
>                            /* If no termcode matched but 'pastetoggle'
>                             * matched partially it's like an incomplete key
>                             * sequence. */
> !                           if (keylen == 0 && save_keylen == KL_PART_KEY)
> !                               keylen = KL_PART_KEY;
>
>                            /*
>                             * When getting a partial match, but the last
> --- 2261,2268 ----
>                            /* If no termcode matched but 'pastetoggle'
>                             * matched partially it's like an incomplete key
>                             * sequence. */
> !                           if (keylen == 0 && save_keylen == KEYLEN_PART_KEY)
> !                               keylen = KEYLEN_PART_KEY;
>
>                            /*
>                             * When getting a partial match, but the last
> ***************
> *** 2302,2308 ****
>                                    continue;
>                                }
>                                if (*s == NUL)      /* need more characters */
> !                                   keylen = KL_PART_KEY;
>                            }
>                            if (keylen >= 0)
>  #endif
> --- 2299,2305 ----
>                                    continue;
>                                }
>                                if (*s == NUL)      /* need more characters */
> !                                   keylen = KEYLEN_PART_KEY;
>                            }
>                            if (keylen >= 0)
>  #endif
> ***************
> *** 2339,2345 ****
>                        if (keylen > 0)     /* full matching terminal code */
>                        {
>  #if defined(FEAT_GUI) && defined(FEAT_MENU)
> !                           if (typebuf.tb_buf[typebuf.tb_off] == K_SPECIAL
>                                         && typebuf.tb_buf[typebuf.tb_off + 1]
>                                                                   == KS_MENU)
>                            {
> --- 2336,2343 ----
>                        if (keylen > 0)     /* full matching terminal code */
>                        {
>  #if defined(FEAT_GUI) && defined(FEAT_MENU)
> !                           if (typebuf.tb_len >= 2
> !                               && typebuf.tb_buf[typebuf.tb_off] == K_SPECIAL
>                                         && typebuf.tb_buf[typebuf.tb_off + 1]
>                                                                   == KS_MENU)
>                            {
> ***************
> *** 2381,2387 ****
>                        /* Partial match: get some more characters.  When a
>                         * matching mapping was found use that one. */
>                        if (mp == NULL || keylen < 0)
> !                           keylen = KL_PART_KEY;
>                        else
>                            keylen = mp_match_len;
>                    }
> --- 2379,2385 ----
>                        /* Partial match: get some more characters.  When a
>                         * matching mapping was found use that one. */
>                        if (mp == NULL || keylen < 0)
> !                           keylen = KEYLEN_PART_KEY;
>                        else
>                            keylen = mp_match_len;
>                    }
> ***************
> *** 2553,2559 ****
>  #endif
>                        && typebuf.tb_maplen == 0
>                        && (State & INSERT)
> !                       && (p_timeout || (keylen == KL_PART_KEY && 
> p_ttimeout))
>                        && (c = inchar(typebuf.tb_buf + typebuf.tb_off
>                                                     + typebuf.tb_len, 3, 25L,
>                                                 typebuf.tb_change_cnt)) == 0)
> --- 2551,2558 ----
>  #endif
>                        && typebuf.tb_maplen == 0
>                        && (State & INSERT)
> !                       && (p_timeout
> !                           || (keylen == KEYLEN_PART_KEY && p_ttimeout))
>                        && (c = inchar(typebuf.tb_buf + typebuf.tb_off
>                                                     + typebuf.tb_len, 3, 25L,
>                                                 typebuf.tb_change_cnt)) == 0)
> ***************
> *** 2783,2791 ****
>                            ? 0
>                            : ((typebuf.tb_len == 0
>                                    || !(p_timeout || (p_ttimeout
> !                                                  && keylen == KL_PART_KEY)))
>                                    ? -1L
> !                                   : ((keylen == KL_PART_KEY && p_ttm >= 0)
>                                            ? p_ttm
>                                            : p_tm)), typebuf.tb_change_cnt);
>
> --- 2782,2790 ----
>                            ? 0
>                            : ((typebuf.tb_len == 0
>                                    || !(p_timeout || (p_ttimeout
> !                                              && keylen == KEYLEN_PART_KEY)))
>                                    ? -1L
> !                                   : ((keylen == KEYLEN_PART_KEY && p_ttm >= 
> 0)
>                                            ? p_ttm
>                                            : p_tm)), typebuf.tb_change_cnt);
>
> *** ../vim-7.3.090/src/misc1.c  2010-12-02 16:01:23.000000000 +0100
> --- src/misc1.c 2010-12-30 12:28:59.000000000 +0100
> ***************
> *** 3114,3123 ****
>               && (!p_ttimeout || waited * 100L < (p_ttm < 0 ? p_tm : p_ttm)))
>            continue;
>
> !       /* found a termcode: adjust length */
> !       if (n > 0)
>            len = n;
> !       if (len == 0)       /* nothing typed yet */
>            continue;
>
>        /* Handle modifier and/or special key code. */
> --- 3114,3124 ----
>               && (!p_ttimeout || waited * 100L < (p_ttm < 0 ? p_tm : p_ttm)))
>            continue;
>
> !       if (n == KEYLEN_REMOVED)  /* key code removed */
> !           continue;
> !       if (n > 0)              /* found a termcode: adjust length */
>            len = n;
> !       if (len == 0)           /* nothing typed yet */
>            continue;
>
>        /* Handle modifier and/or special key code. */
> *** ../vim-7.3.090/src/term.c   2010-08-15 21:57:32.000000000 +0200
> --- src/term.c  2010-12-30 12:14:48.000000000 +0100
> ***************
> *** 3828,3833 ****
> --- 3831,3837 ----
>   * Check from typebuf.tb_buf[typebuf.tb_off] to typebuf.tb_buf[typebuf.tb_off
>   * + max_offset].
>   * Return 0 for no match, -1 for partial match, > 0 for full match.
> +  * Return KEYLEN_REMOVED when a key code was deleted.
>   * With a match, the match is removed, the replacement code is inserted in
>   * typebuf.tb_buf[] and the number of characters in typebuf.tb_buf[] is
>   * returned.
> ***************
> *** 3845,3850 ****
> --- 3849,3855 ----
>      int               slen = 0;       /* init for GCC */
>      int               modslen;
>      int               len;
> +     int               retval = 0;
>      int               offset;
>      char_u    key_name[2];
>      int               modifiers;
> ***************
> *** 4940,4945 ****
> --- 4945,4957 ----
>  #endif
>                string[new_slen++] = key_name[1];
>        }
> +       else if (new_slen == 0 && key_name[0] == KS_EXTRA
> +                                                 && key_name[1] == KE_IGNORE)
> +       {
> +           /* Do not put K_IGNORE into the buffer, do return KEYLEN_REMOVED
> +            * to indicate what happened. */
> +           retval = KEYLEN_REMOVED;
> +       }
>        else
>        {
>            string[new_slen++] = K_SPECIAL;
> ***************
> *** 4976,4982 ****
>                                                   (size_t)(buflen - offset));
>            mch_memmove(buf + offset, string, (size_t)new_slen);
>        }
> !       return (len + extra + offset);
>      }
>
>      return 0;                     /* no match found */
> --- 4988,4994 ----
>                                                   (size_t)(buflen - offset));
>            mch_memmove(buf + offset, string, (size_t)new_slen);
>        }
> !       return retval == 0 ? (len + extra + offset) : retval;
>      }
>
>      return 0;                     /* no match found */
> *** ../vim-7.3.090/src/vim.h    2010-12-17 20:23:56.000000000 +0100
> --- src/vim.h   2010-12-30 12:06:45.000000000 +0100
> ***************
> *** 2211,2214 ****
> --- 2211,2218 ----
>  #define MSCR_LEFT     -1
>  #define MSCR_RIGHT    -2
>
> + #define KEYLEN_PART_KEY -1    /* keylen value for incomplete key-code */
> + #define KEYLEN_PART_MAP -2    /* keylen value for incomplete mapping */
> + #define KEYLEN_REMOVED  9999  /* keylen value for removed sequence */
> +
>  #endif /* VIM__H */
> *** ../vim-7.3.090/src/version.c        2010-12-30 11:41:05.000000000 +0100
> --- src/version.c       2010-12-30 12:24:56.000000000 +0100
> ***************
> *** 716,717 ****
> --- 716,719 ----
>  {   /* Add new patch number below this line */
> + /**/
> +     91,
>  /**/
>
> --
> hundred-and-one symptoms of being an internet addict:
> 56. You leave the modem speaker on after connecting because you think it
>    sounds like the ocean wind...the perfect soundtrack for "surfing the net".
>
>  /// Bram Moolenaar -- b...@moolenaar.net -- http://www.Moolenaar.net   \\\
> ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
> \\\  an exciting new programming language -- http://www.Zimbu.org        ///
>  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///
>
> --
> You received this message from the "vim_dev" maillist.
> Do not top-post! Type your reply below the text you are replying to.
> For more information, visit http://www.vim.org/maillist.php
>

-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Raspunde prin e-mail lui