summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOleg Goncharov <goncharovoi@yandex.ru>2024-07-23 20:34:15 +0200
committerChristian Brabandt <cb@256bit.org>2024-07-23 20:42:02 +0200
commit56904f90d15853085552470a2fedcb6cadb62309 (patch)
tree69447b9fefda86ef9e6ae456c735dcd85b03b218
parent38ce71c1c323716cc4b130dbb3e8837a8b9a710b (diff)
patch 9.1.0611: ambiguous mappings not correctly resolved with modifyOtherKeysv9.1.0611
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>
-rw-r--r--src/getchar.c11
-rw-r--r--src/testdir/test_termcodes.vim11
-rw-r--r--src/testdir/view_util.vim2
-rw-r--r--src/version.c2
4 files changed, 24 insertions, 2 deletions
diff --git a/src/getchar.c b/src/getchar.c
index df89f4cd2f..4af176978c 100644
--- 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;
+ }
}
}
diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim
index 7e450d998d..507753c21a 100644
--- 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
diff --git a/src/testdir/view_util.vim b/src/testdir/view_util.vim
index 71cb071ab7..161c8b20cd 100644
--- 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)
diff --git a/src/version.c b/src/version.c
index 91286bb75d..3963996e77 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 611,
+/**/
610,
/**/
609,