]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.0806: 'langmap' works differently when there are modifiers v9.0.0806
authorzeertzjq <zeertzjq@outlook.com>
Thu, 20 Oct 2022 16:59:38 +0000 (17:59 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 20 Oct 2022 16:59:38 +0000 (17:59 +0100)
Problem:    'langmap' works differently when there are modifiers.
Solution:   Only apply 'langmap' to a character where modifiers have no
            effect. (closes #11395, closes #11404)

src/getchar.c
src/testdir/test_langmap.vim
src/version.c

index 3f83b8484b4de5d76b4e7d4136d407490d713d34..da8132cbfff3ca4c3d2b029144b072c2dd7e5d63 100644 (file)
@@ -2590,24 +2590,35 @@ handle_mapping(
            {
 #ifdef FEAT_LANGMAP
                int     nomap = nolmaplen;
-               int     c2;
+               int     modifiers = 0;
 #endif
                // find the match length of this mapping
                for (mlen = 1; mlen < typebuf.tb_len; ++mlen)
                {
+                   int c2 = typebuf.tb_buf[typebuf.tb_off + mlen];
 #ifdef FEAT_LANGMAP
-                   c2 = typebuf.tb_buf[typebuf.tb_off + mlen];
                    if (nomap > 0)
+                   {
+                       if (nomap == 2 && c2 == KS_MODIFIER)
+                           modifiers = 1;
+                       else if (nomap == 1 && modifiers == 1)
+                           modifiers = c2;
                        --nomap;
-                   else if (c2 == K_SPECIAL)
-                       nomap = 2;
+                   }
                    else
-                       LANGMAP_ADJUST(c2, TRUE);
-                   if (mp->m_keys[mlen] != c2)
-#else
-                   if (mp->m_keys[mlen] !=
-                                        typebuf.tb_buf[typebuf.tb_off + mlen])
+                   {
+                       if (c2 == K_SPECIAL)
+                           nomap = 2;
+                       else if (merge_modifyOtherKeys(c2, &modifiers) == c2)
+                           // Only apply 'langmap' if merging modifiers into
+                           // the key will not result in another character,
+                           // so that 'langmap' behaves consistently in
+                           // different terminals and GUIs.
+                           LANGMAP_ADJUST(c2, TRUE);
+                       modifiers = 0;
+                   }
 #endif
+                   if (mp->m_keys[mlen] != c2)
                        break;
                }
 
index 36e2f558c538544211a527894a6b33259e0bce03..2284704603854cb46f45eedb48ad6ee96d488571 100644 (file)
@@ -49,6 +49,39 @@ func Test_langmap()
   call feedkeys(';', 'tx')
   call assert_equal(5, col('.'))
 
+  set langmap=RL
+  let g:counter = 0
+  nnoremap L;L <Cmd>let g:counter += 1<CR>
+  nnoremap <C-L> <Cmd>throw 'This mapping shoud not be triggered'<CR>
+
+  " 'langmap' is applied to keys without modifiers when matching a mapping
+  call feedkeys('R;R', 'tx')
+  call assert_equal(1, g:counter)
+  nunmap L;L
+  unlet g:counter
+
+  delete
+  call assert_equal('', getline(1))
+  undo
+  call assert_equal('Hello World', getline(1))
+  " 'langmap' does not change Ctrl-R to Ctrl-L for consistency
+  call feedkeys("\<*C-R>", 'tx')
+  call assert_equal('', getline(1))
+
+  set langmap=6L
+  undo
+  setlocal bufhidden=hide
+  let oldbuf = bufnr()
+  enew
+  call assert_notequal(oldbuf, bufnr())
+  " 'langmap' does not change Ctrl-6 to Ctrl-L for consistency
+  " Ctrl-6 becomes Ctrl-^ after merging the Ctrl modifier
+  call feedkeys("\<*C-6>", 'tx')
+  call assert_equal(oldbuf, bufnr())
+  setlocal bufhidden&
+
+  nunmap <C-L>
+
   set langmap&
   quit!
 endfunc
index 7f72a2c473ba3eaf62be4c5939ade4dbb94a89fb..3d1feae4eda183dd61887408785e351cac5da8d6 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    806,
 /**/
     805,
 /**/