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