]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.284 v7.3.284
authorBram Moolenaar <Bram@vim.org>
Wed, 17 Aug 2011 18:33:22 +0000 (20:33 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 17 Aug 2011 18:33:22 +0000 (20:33 +0200)
Problem:    The str2special() function doesn't handle multi-byte characters
            properly.
Solution:   Recognize multi-byte characters. (partly by Vladimir Vichniakov)

src/getchar.c
src/message.c
src/misc2.c
src/version.c

index 697eb3142e3667876dc267ef2622bee2eebab558..16bf65a0b94ca754bb4c878a7dd838aeca7d6906 100644 (file)
@@ -3964,7 +3964,17 @@ showmap(mp, local)
     if (*mp->m_str == NUL)
        msg_puts_attr((char_u *)"<Nop>", hl_attr(HLF_8));
     else
-       msg_outtrans_special(mp->m_str, FALSE);
+    {
+       /* Remove escaping of CSI, because "m_str" is in a format to be used
+        * as typeahead. */
+       char_u *s = vim_strsave(mp->m_str);
+       if (s != NULL)
+       {
+           vim_unescape_csi(s);
+           msg_outtrans_special(s, FALSE);
+           vim_free(s);
+       }
+    }
 #ifdef FEAT_EVAL
     if (p_verbose > 0)
        last_set_msg(mp->m_script_ID);
index 89248b4cf04d16fb476efad185f4ce4f4eeaa8ee..76bf69d6d7ba429583e965c950d08b3d5719c4dd 100644 (file)
@@ -1547,16 +1547,27 @@ str2special(sp, from)
        if (IS_SPECIAL(c) || modifiers) /* special key */
            special = TRUE;
     }
-    *sp = str + 1;
 
 #ifdef FEAT_MBYTE
-    /* For multi-byte characters check for an illegal byte. */
-    if (has_mbyte && MB_BYTE2LEN(*str) > (*mb_ptr2len)(str))
+    if (has_mbyte && !IS_SPECIAL(c))
     {
-       transchar_nonprint(buf, c);
-       return buf;
+        int len = (*mb_ptr2len)(str);
+
+       /* For multi-byte characters check for an illegal byte. */
+       if (has_mbyte && MB_BYTE2LEN(*str) > len)
+       {
+           transchar_nonprint(buf, c);
+           *sp = str + 1;
+           return buf;
+       }
+        /* Since 'special' is TRUE the multi-byte character 'c' will be
+         * processed by get_special_key_name() */
+        c = (*mb_ptr2char)(str);
+        *sp = str + len;
     }
+    else
 #endif
+       *sp = str + 1;
 
     /* Make unprintable characters in <> form, also <M-Space> and <Tab>.
      * Use <Space> only for lhs of a mapping. */
index f91a64aced12c6780f6f3d2a8a6a81744f70873a..dbcd653c1ff0acc2fad2bb895e7f04640421cc81 100644 (file)
@@ -2754,6 +2754,7 @@ find_special_key(srcp, modp, keycode, keep_x_key)
     int                bit;
     int                key;
     unsigned long n;
+    int                l;
 
     src = *srcp;
     if (src[0] != '<')
@@ -2766,8 +2767,17 @@ find_special_key(srcp, modp, keycode, keep_x_key)
        if (*bp == '-')
        {
            last_dash = bp;
-           if (bp[1] != NUL && bp[2] == '>')
-               ++bp;   /* anything accepted, like <C-?> */
+           if (bp[1] != NUL)
+           {
+#ifdef FEAT_MBYTE
+               if (has_mbyte)
+                   l = mb_ptr2len(bp + 1);
+               else
+#endif
+                   l = 1;
+               if (bp[l + 1] == '>')
+                   bp += l;    /* anything accepted, like <C-?> */
+           }
        }
        if (bp[0] == 't' && bp[1] == '_' && bp[2] && bp[3])
            bp += 3;    /* skip t_xx, xx may be '-' or '>' */
@@ -2777,15 +2787,6 @@ find_special_key(srcp, modp, keycode, keep_x_key)
     {
        end_of_name = bp + 1;
 
-       if (STRNICMP(src + 1, "char-", 5) == 0 && VIM_ISDIGIT(src[6]))
-       {
-           /* <Char-123> or <Char-033> or <Char-0x33> */
-           vim_str2nr(src + 6, NULL, NULL, TRUE, TRUE, NULL, &n);
-           *modp = 0;
-           *srcp = end_of_name;
-           return (int)n;
-       }
-
        /* Which modifiers are given? */
        modifiers = 0x0;
        for (bp = src + 1; bp < last_dash; bp++)
@@ -2804,11 +2805,27 @@ find_special_key(srcp, modp, keycode, keep_x_key)
         */
        if (bp >= last_dash)
        {
+           if (STRNICMP(last_dash + 1, "char-", 5) == 0
+                                                && VIM_ISDIGIT(last_dash[6]))
+           {
+               /* <Char-123> or <Char-033> or <Char-0x33> */
+               vim_str2nr(last_dash + 6, NULL, NULL, TRUE, TRUE, NULL, &n);
+               *modp = modifiers;
+               *srcp = end_of_name;
+               return (int)n;
+           }
+
            /*
             * Modifier with single letter, or special key name.
             */
-           if (modifiers != 0 && last_dash[2] == '>')
-               key = last_dash[1];
+#ifdef FEAT_MBYTE
+           if (has_mbyte)
+               l = mb_ptr2len(last_dash + 1);
+           else
+#endif
+               l = 1;
+           if (modifiers != 0 && last_dash[l + 1] == '>')
+               key = PTR2CHAR(last_dash + 1);
            else
            {
                key = get_special_key_code(last_dash + 1);
index b5fe5aa1a12b6f302a682e5ad57f215b26a8d792..650e99f7bfab1538a41417bdddb5c4c68f006c95 100644 (file)
@@ -709,6 +709,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    284,
 /**/
     283,
 /**/