Mercurial > vim
changeset 35775:a20bd67056d7 v9.1.0611
patch 9.1.0611: ambiguous mappings not correctly resolved with modifyOtherKeys
Commit: https://github.com/vim/vim/commit/56904f90d15853085552470a2fedcb6cadb62309
Author: Oleg Goncharov <goncharovoi@yandex.ru>
Date: Tue Jul 23 20:34:15 2024 +0200
patch 9.1.0611: ambiguous mappings not correctly resolved with modifyOtherKeys
Problem: ambiguous mappings not correctly resolved with modifyOtherKeys
Solution: Check for termcode when an upper case mapping is received and
does not match (Oleg Goncharov)
Fix for mapping processing when capital leters are represented with terminal codes.
Problem: there are two mappings and
1) the first mapping is substring of the second,
2) the first non-matching letter is capital,
3) capital letters are represented with termcodes "ESC[27;2;<ascii code>~" in given system
then first mapping is applied instead of second.
Example:
:map B b
:map BBB blimp!
and then
BBB -> bbb
instead of
BBB -> blimp!
Solution: force termcodes check if capital letter does not match.
closes: #15251
Signed-off-by: Oleg Goncharov <goncharovoi@yandex.ru>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 23 Jul 2024 20:45:02 +0200 |
parents | 664aad1fef0b |
children | 6f302fc811fe |
files | src/getchar.c src/testdir/test_termcodes.vim src/testdir/view_util.vim src/version.c |
diffstat | 4 files changed, 24 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/getchar.c +++ b/src/getchar.c @@ -2935,8 +2935,11 @@ handle_mapping( } } else + { // No match; may have to check for termcode at next - // character. If the first character that didn't match is + // character. + + // If the first character that didn't match is // K_SPECIAL then check for a termcode. This isn't perfect // but should work in most cases. if (max_mlen < mlen) @@ -2946,6 +2949,12 @@ handle_mapping( } else if (max_mlen == mlen && mp->m_keys[mlen] == K_SPECIAL) want_termcode = 1; + + // Check termcode for uppercase character to properly + // process "ESC[27;2;<ascii code>~" control sequences. + if (ASCII_ISUPPER(mp->m_keys[mlen])) + want_termcode = 1; + } } }
--- a/src/testdir/test_termcodes.vim +++ b/src/testdir/test_termcodes.vim @@ -2256,6 +2256,17 @@ func Test_modifyOtherKeys_mapped() iunmap ' iunmap <C-W><C-A> + + " clean buffer + %d _ + imap B b + imap BBB blimp + let input = repeat(GetEscCodeCSI27('B', 2), 3) + call feedkeys("a" .. input .. "\<Esc>", 'Lx!') + call assert_equal('blimp', getline(1)) + " cleanup + iunmap BBB + iunmap B set timeoutlen& endfunc
--- a/src/testdir/view_util.vim +++ b/src/testdir/view_util.vim @@ -71,7 +71,7 @@ endfunc " than the raw code. " Return the modifyOtherKeys level 2 encoding for "key" with "modifier" -" (number value, e.g. CTRL is 5). +" (number value, e.g. CTRL is 5, Shift is 2, Alt is 3). func GetEscCodeCSI27(key, modifier) let key = printf("%d", char2nr(a:key)) let mod = printf("%d", a:modifier)