diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-10-12 18:22:50 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-10-12 18:22:50 +0200 |
commit | d1e2f3984ae0b4e22ba6977eedcf05285819eea9 (patch) | |
tree | d114b8421d66467f89c4d4b9155995097280a2ed | |
parent | e8070987c6ca9b1e14c5305707c6d29c8e58e7c4 (diff) |
patch 8.1.2142: some key mappings do not work with modifyOtherKeysv8.1.2142
Problem: Some key mappings do not work with modifyOtherKeys.
Solution: Remove the Shift modifier if it is already included in the key.
-rw-r--r-- | src/term.c | 11 | ||||
-rw-r--r-- | src/testdir/test_termcodes.vim | 39 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 51 insertions, 1 deletions
diff --git a/src/term.c b/src/term.c index 27def15c6a..e30506bc42 100644 --- a/src/term.c +++ b/src/term.c @@ -4847,8 +4847,17 @@ not_enough: else key = arg[2]; - // insert modifiers with KS_MODIFIER modifiers = decode_modifiers(arg[1]); + + // Some keys already have Shift included, pass them as + // normal keys. + if (modifiers == MOD_MASK_SHIFT + && ((key >= '@' && key <= 'Z') + || key == '^' || key == '_' + || (key >= '{' && key <= '~'))) + modifiers = 0; + + // insert modifiers with KS_MODIFIER new_slen = modifiers2keycode(modifiers, &key, string); slen = csi_len; diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim index 0d157aeb42..1df9f7bf11 100644 --- a/src/testdir/test_termcodes.vim +++ b/src/testdir/test_termcodes.vim @@ -909,3 +909,42 @@ endfunc func Test_modifyOtherKeys_CSIu() call RunTest_modifyOtherKeys(function('GetEscCodeCSIu')) endfunc + +func RunTest_mapping_shift(key, func) + call setline(1, '') + if a:key == '|' + exe 'inoremap \| xyz' + else + exe 'inoremap ' .. a:key .. ' xyz' + endif + call feedkeys('a' .. a:func(a:key, 2) .. "\<Esc>", 'Lx!') + call assert_equal("xyz", getline(1)) + if a:key == '|' + exe 'iunmap \|' + else + exe 'iunmap ' .. a:key + endif +endfunc + +func RunTest_mapping_works_with_shift(func) + new + set timeoutlen=20 + + call RunTest_mapping_shift('@', a:func) + call RunTest_mapping_shift('A', a:func) + call RunTest_mapping_shift('Z', a:func) + call RunTest_mapping_shift('^', a:func) + call RunTest_mapping_shift('_', a:func) + call RunTest_mapping_shift('{', a:func) + call RunTest_mapping_shift('|', a:func) + call RunTest_mapping_shift('}', a:func) + call RunTest_mapping_shift('~', a:func) + + bwipe! + set timeoutlen& +endfunc + +func Test_mapping_works_with_shift() + call RunTest_mapping_works_with_shift(function('GetEscCodeCSI27')) + call RunTest_mapping_works_with_shift(function('GetEscCodeCSIu')) +endfunc diff --git a/src/version.c b/src/version.c index c92eb26a10..74126d2e24 100644 --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2142, +/**/ 2141, /**/ 2140, |