patch 9.1.0611: ambiguous mappings not correctly resolved with modifyOtherKeys

Commit: 
https://github.com/vim/vim/commit/56904f90d15853085552470a2fedcb6cadb62309
Author: Oleg Goncharov <goncharo...@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 <goncharo...@yandex.ru>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/getchar.c b/src/getchar.c
index df89f4cd2..4af176978 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 7e450d998..507753c21 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 71cb071ab..161c8b20c 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 91286bb75..3963996e7 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    611,
 /**/
     610,
 /**/

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/E1sWKVS-0064dq-TN%40256bit.org.

Raspunde prin e-mail lui