From: Bram Moolenaar Date: Sat, 31 Oct 2020 15:33:47 +0000 (+0100) Subject: patch 8.2.1930: wrong input if removing shift results in special key code X-Git-Tag: v8.2.1930 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=749bc9521d9c1b3b3250faef25a3710206cf277d;p=vim patch 8.2.1930: wrong input if removing shift results in special key code Problem: Wrong input if removing shift results in special key code. Solution: Handle special key codes. (closes #7189) --- diff --git a/src/term.c b/src/term.c index 4d4cc589d..56f6e0a93 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 424e285ef..cfbb7ba3c 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\" .. GetEscCodeCSI27("\t", '2') .. "\", 'Lx!') + eval getline(1)->assert_equal('') + + call setline(1, '') + call feedkeys("a\\[Z\", 'Lx!') + eval getline(1)->assert_equal('') + + 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 9f23c1d2e..93de74dec 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1930, /**/ 1929, /**/