]> granicus.if.org Git - vim/commitdiff
patch 8.2.4498: using <Plug> with "noremap" does not work v8.2.4498
authorBram Moolenaar <Bram@vim.org>
Thu, 3 Mar 2022 13:56:24 +0000 (13:56 +0000)
committerBram Moolenaar <Bram@vim.org>
Thu, 3 Mar 2022 13:56:24 +0000 (13:56 +0000)
Problem:    Using <Plug> with "noremap" does not work.
Solution:   Always remap <Plug>. (closes #9879, closes #9789)

runtime/doc/map.txt
src/getchar.c
src/testdir/test_mapping.vim
src/version.c

index 61e31270241452e91d47725a33762cad5d71bbf4..877be58098edde3fb863efcf26c3cd8a1799fd4b 100644 (file)
@@ -80,6 +80,8 @@ modes.
                        where the map command applies.  Disallow mapping of
                        {rhs}, to avoid nested and recursive mappings.  Often
                        used to redefine a command.
+                       Note: When <Plug> appears in the {rhs} this part is
+                       always applied even if remapping is disallowed.
 
 
 :unm[ap]  {lhs}                        |mapmode-nvo|           *:unm*  *:unmap*
index fcc9b9ac427480e978afb7a5b83b84e62634381c..9939bbdbcb971b5c09db0bedc1d595e5d00190a7 100644 (file)
@@ -2424,6 +2424,13 @@ handle_mapping(
     int                keylen = *keylenp;
     int                i;
     int                local_State = get_real_state();
+    int                is_plug_map = FALSE;
+
+    // If typehead starts with <Plug> then remap, even for a "noremap" mapping.
+    if (typebuf.tb_buf[typebuf.tb_off] == K_SPECIAL
+           && typebuf.tb_buf[typebuf.tb_off + 1] == KS_EXTRA
+           && typebuf.tb_buf[typebuf.tb_off + 2] == KE_PLUG)
+       is_plug_map = TRUE;
 
     /*
      * Check for a mappable key sequence.
@@ -2441,7 +2448,7 @@ handle_mapping(
     tb_c1 = typebuf.tb_buf[typebuf.tb_off];
     if (no_mapping == 0 && is_maphash_valid()
            && (no_zero_mapping == 0 || tb_c1 != '0')
-           && (typebuf.tb_maplen == 0
+           && (typebuf.tb_maplen == 0 || is_plug_map
                || (p_remap
                    && (typebuf.tb_noremap[typebuf.tb_off]
                                    & (RM_NONE|RM_ABBR)) == 0))
@@ -2562,7 +2569,7 @@ handle_mapping(
                    for (n = mlen; --n >= 0; )
                        if (*s++ & (RM_NONE|RM_ABBR))
                            break;
-                   if (n >= 0)
+                   if (!is_plug_map && n >= 0)
                        continue;
 
                    if (keylen > typebuf.tb_len)
index 35db436374b51cf9c6cf2d1373779c23f0ed322f..6421058b02035bc597fc7472b95ca38a9b256ad5 100644 (file)
@@ -1536,4 +1536,34 @@ func Test_abbreviate_latin1_encoding()
   set encoding=utf-8
 endfunc
 
+" Test for <Plug> always being mapped, even when used with "noremap".
+func Test_plug_remap()
+  let g:foo = 0
+  nnoremap <Plug>(Increase_x) <Cmd>let g:foo += 1<CR>
+  nmap <F2> <Plug>(Increase_x)
+  nnoremap <F3> <Plug>(Increase_x)
+  call feedkeys("\<F2>", 'xt')
+  call assert_equal(1, g:foo)
+  call feedkeys("\<F3>", 'xt')
+  call assert_equal(2, g:foo)
+  nnoremap x <Nop>
+  nmap <F4> x<Plug>(Increase_x)x
+  nnoremap <F5> x<Plug>(Increase_x)x
+  call setline(1, 'Some text')
+  normal! gg$
+  call feedkeys("\<F4>", 'xt')
+  call assert_equal(3, g:foo)
+  call assert_equal('Some text', getline(1))
+  call feedkeys("\<F5>", 'xt')
+  call assert_equal(4, g:foo)
+  call assert_equal('Some te', getline(1))
+  nunmap <Plug>(Increase_x)
+  nunmap <F2>
+  nunmap <F3>
+  nunmap <F4>
+  nunmap <F5>
+  unlet g:foo
+  %bw!
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index 73b6af7453dc198eb67b2ffd3dc12bfe5975f5b3..6131427f8b258f82af7043c92a8301a07bbc51f0 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4498,
 /**/
     4497,
 /**/