Mercurial > vim
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);