Mercurial > vim
changeset 22526:6325ef9143bc
patch 8.2.1811: mapping Ctrl-key does not work for '{', '}' and '|'
Commit: https://github.com/vim/vim/commit/9a033d7b18651acbb7eda4b7f39a27c01748fb70
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Oct 7 17:29:48 2020 +0200
patch 8.2.1811: mapping Ctrl-key does not work for '{', '}' and '|'
Problem: Mapping Ctrl-key does not work for '{', '}' and '|'.
Solution: Remove the shift modifier. (closes https://github.com/vim/vim/issues/6457)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 07 Oct 2020 17:30:03 +0200 |
parents | 12f44f93c583 |
children | c3e3c5707fe9 |
files | runtime/doc/map.txt src/misc2.c src/testdir/test_termcodes.vim src/version.c |
diffstat | 4 files changed, 36 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/doc/map.txt +++ b/runtime/doc/map.txt @@ -839,8 +839,15 @@ execute a shell command, e.g.: `!ls` Or When modifyOtherKeys is enabled you can map <C-[> and <C-S-{>: > imap <C-[> [[[ - imap <C-S-{> {{{ -Without modifyOtherKeys <C-[> and <C-S-{> are indistinguishable from Esc. + imap <C-{> {{{ +Without modifyOtherKeys <C-[> and <C-{> are indistinguishable from Esc. +Note that <C-{> is used and not <C-S-[> or <C-S-{>. This works on most +keyboards. Similarly, <C-}> is used instead of <C-S-]> or <C-S-}> and +<C-|> instead of <C-S-\> or <C-S-|>. Note that '|' has a special meaning in a +mapping, see |map-bar|. + +WARNING: if you map <C-[> you may very well break any key codes that start +with Esc. Make sure it comes AFTER other mappings. A known side effect is that in Insert mode the raw escape sequence is inserted after the CTRL-V key. This can be used to check whether modifyOtherKeys is
--- a/src/misc2.c +++ b/src/misc2.c @@ -2974,7 +2974,8 @@ may_adjust_key_for_ctrl(int modifiers, i /* * Some keys already have Shift included, pass them as normal keys. - * Not when Ctrl is also used, because <C-H> and <C-S-H> are different. + * When Ctrl is also used <C-H> and <C-S-H> are different, but <C-S-{> should + * be <C-{>. Same for <C-S-}> and <C-S-|>. * Also for <A-S-a> and <M-S-a>. * This includes all printable ASCII characters except numbers and a-z. */ @@ -2989,6 +2990,11 @@ may_remove_shift_modifier(int modifiers, || (key >= '[' && key <= '`') || (key >= '{' && key <= '~'))) return modifiers & ~MOD_MASK_SHIFT; + + if (modifiers == (MOD_MASK_SHIFT | MOD_MASK_CTRL) + && (key == '{' || key == '}' || key == '|')) + return modifiers & ~MOD_MASK_SHIFT; + return modifiers; }
--- a/src/testdir/test_termcodes.vim +++ b/src/testdir/test_termcodes.vim @@ -2126,6 +2126,24 @@ endfunc func Test_mapping_works_with_shift_ctrl() call RunTest_mapping_works_with_mods(function('GetEscCodeCSI27'), 'C-S', 6) call RunTest_mapping_works_with_mods(function('GetEscCodeCSIu'), 'C-S', 6) + + new + set timeoutlen=10 + + " Ctrl-Shift-[ actually produces CTRL-Shift-{ which is mapped as <C-{> + call RunTest_mapping_mods('<C-{>', '{', function('GetEscCodeCSI27'), 6) + call RunTest_mapping_mods('<C-{>', '{', function('GetEscCodeCSIu'), 6) + + " Ctrl-Shift-] actually produces CTRL-Shift-} which is mapped as <C-}> + call RunTest_mapping_mods('<C-{>', '{', function('GetEscCodeCSI27'), 6) + call RunTest_mapping_mods('<C-{>', '{', function('GetEscCodeCSIu'), 6) + + " Ctrl-Shift-\ actually produces CTRL-Shift-| which is mapped as <C-|> + call RunTest_mapping_mods('<C-\|>', '|', function('GetEscCodeCSI27'), 6) + call RunTest_mapping_mods('<C-\|>', '|', function('GetEscCodeCSIu'), 6) + + bwipe! + set timeoutlen& endfunc " Below we also test the "u" code with Alt, This works, but libvterm would not