diff src/message.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 2e72d84e8965
children 61c5e1527bd8
line wrap: on
line diff
--- a/src/message.c
+++ b/src/message.c
@@ -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. */