0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

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>
This commit is contained in:
Oleg Goncharov 2024-07-23 20:34:15 +02:00 committed by Christian Brabandt
parent 38ce71c1c3
commit 56904f90d1
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
4 changed files with 24 additions and 2 deletions

View File

@ -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;
}
}
}

View File

@ -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

View File

@ -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)

View File

@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
611,
/**/
610,
/**/