summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-10-12 18:22:50 +0200
committerBram Moolenaar <Bram@vim.org>2019-10-12 18:22:50 +0200
commitd1e2f3984ae0b4e22ba6977eedcf05285819eea9 (patch)
treed114b8421d66467f89c4d4b9155995097280a2ed
parente8070987c6ca9b1e14c5305707c6d29c8e58e7c4 (diff)
downloadvim-git-d1e2f3984ae0b4e22ba6977eedcf05285819eea9.tar.gz
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.c11
-rw-r--r--src/testdir/test_termcodes.vim39
-rw-r--r--src/version.c2
3 files changed, 51 insertions, 1 deletions
diff --git a/src/term.c b/src/term.c
index 27def15c6..e30506bc4 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 0d157aeb4..1df9f7bf1 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 c92eb26a1..74126d2e2 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,