diff src/misc2.c @ 3024:27d43855b723 v7.3.284

updated for version 7.3.284 Problem: The str2special() function doesn't handle multi-byte characters properly. Solution: Recognize multi-byte characters. (partly by Vladimir Vichniakov)
author Bram Moolenaar <bram@vim.org>
date Wed, 17 Aug 2011 20:33:22 +0200
parents aa40bddeea9a
children 6018c815e120
line wrap: on
line diff
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -2754,6 +2754,7 @@ find_special_key(srcp, modp, keycode, ke
     int		bit;
     int		key;
     unsigned long n;
+    int		l;
 
     src = *srcp;
     if (src[0] != '<')
@@ -2766,8 +2767,17 @@ find_special_key(srcp, modp, keycode, ke
 	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, ke
     {
 	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, ke
 	 */
 	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);