summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-10-31 16:33:47 +0100
committerBram Moolenaar <Bram@vim.org>2020-10-31 16:33:47 +0100
commit749bc9521d9c1b3b3250faef25a3710206cf277d (patch)
tree6a40e4e5c2eee9012439dfe042cb4606613fa10f
parent0289065e41ce3148f929e16a55aa3b161c80576f (diff)
patch 8.2.1930: wrong input if removing shift results in special key codev8.2.1930
Problem: Wrong input if removing shift results in special key code. Solution: Handle special key codes. (closes #7189)
-rw-r--r--src/term.c11
-rw-r--r--src/testdir/test_termcodes.vim17
-rw-r--r--src/version.c2
3 files changed, 28 insertions, 2 deletions
diff --git a/src/term.c b/src/term.c
index 4d4cc589d9..56f6e0a93c 100644
--- a/src/term.c
+++ b/src/term.c
@@ -4462,7 +4462,8 @@ modifiers2keycode(int modifiers, int *key, char_u *string)
if (modifiers != 0)
{
// Some keys have the modifier included. Need to handle that here to
- // make mappings work.
+ // make mappings work. This may result in a special key, such as
+ // K_S_TAB.
*key = simplify_key(*key, &modifiers);
if (modifiers != 0)
{
@@ -4793,7 +4794,13 @@ handle_key_with_modifier(
// insert modifiers with KS_MODIFIER
new_slen = modifiers2keycode(modifiers, &key, string);
- if (has_mbyte)
+ if (IS_SPECIAL(key))
+ {
+ string[new_slen++] = K_SPECIAL;
+ string[new_slen++] = KEY2TERMCAP0(key);
+ string[new_slen++] = KEY2TERMCAP1(key);
+ }
+ else if (has_mbyte)
new_slen += (*mb_char2bytes)(key, string + new_slen);
else
string[new_slen++] = key;
diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim
index 424e285ef1..cfbb7ba3cd 100644
--- a/src/testdir/test_termcodes.vim
+++ b/src/testdir/test_termcodes.vim
@@ -2029,6 +2029,23 @@ func Test_modifyOtherKeys_mapped()
set timeoutlen&
endfunc
+" Whether Shift-Tab sends "ESC [ Z" or "ESC [ 27 ; 2 ; 9 ~" is unpredictable,
+" both should work.
+func Test_modifyOtherKeys_shift_tab()
+ set timeoutlen=10
+
+ call setline(1, '')
+ call feedkeys("a\<C-K>" .. GetEscCodeCSI27("\t", '2') .. "\<Esc>", 'Lx!')
+ eval getline(1)->assert_equal('<S-Tab>')
+
+ call setline(1, '')
+ call feedkeys("a\<C-K>\<Esc>[Z\<Esc>", 'Lx!')
+ eval getline(1)->assert_equal('<S-Tab>')
+
+ set timeoutlen&
+ bwipe!
+endfunc
+
func RunTest_mapping_works_with_shift(func)
new
set timeoutlen=10
diff --git a/src/version.c b/src/version.c
index 9f23c1d2e5..93de74dec0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1930,
+/**/
1929,
/**/
1928,