forked from aniani/vim
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)
This commit is contained in:
43
src/misc2.c
43
src/misc2.c
@@ -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);
|
||||
|
Reference in New Issue
Block a user