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

Raspunde prin e-mail lui