0
0
mirror of https://github.com/vim/vim.git synced 2025-09-27 04:14:06 -04:00

patch 8.2.4498: using <Plug> with "noremap" does not work

Problem:    Using <Plug> with "noremap" does not work.
Solution:   Always remap <Plug>. (closes #9879, closes #9789)
This commit is contained in:
Bram Moolenaar
2022-03-03 13:56:24 +00:00
parent 35d8c2010e
commit 1fc34225ac
4 changed files with 43 additions and 2 deletions

View File

@@ -80,6 +80,8 @@ modes.
where the map command applies. Disallow mapping of where the map command applies. Disallow mapping of
{rhs}, to avoid nested and recursive mappings. Often {rhs}, to avoid nested and recursive mappings. Often
used to redefine a command. 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* :unm[ap] {lhs} |mapmode-nvo| *:unm* *:unmap*

View File

@@ -2424,6 +2424,13 @@ handle_mapping(
int keylen = *keylenp; int keylen = *keylenp;
int i; int i;
int local_State = get_real_state(); 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. * Check for a mappable key sequence.
@@ -2441,7 +2448,7 @@ handle_mapping(
tb_c1 = typebuf.tb_buf[typebuf.tb_off]; tb_c1 = typebuf.tb_buf[typebuf.tb_off];
if (no_mapping == 0 && is_maphash_valid() if (no_mapping == 0 && is_maphash_valid()
&& (no_zero_mapping == 0 || tb_c1 != '0') && (no_zero_mapping == 0 || tb_c1 != '0')
&& (typebuf.tb_maplen == 0 && (typebuf.tb_maplen == 0 || is_plug_map
|| (p_remap || (p_remap
&& (typebuf.tb_noremap[typebuf.tb_off] && (typebuf.tb_noremap[typebuf.tb_off]
& (RM_NONE|RM_ABBR)) == 0)) & (RM_NONE|RM_ABBR)) == 0))
@@ -2562,7 +2569,7 @@ handle_mapping(
for (n = mlen; --n >= 0; ) for (n = mlen; --n >= 0; )
if (*s++ & (RM_NONE|RM_ABBR)) if (*s++ & (RM_NONE|RM_ABBR))
break; break;
if (n >= 0) if (!is_plug_map && n >= 0)
continue; continue;
if (keylen > typebuf.tb_len) if (keylen > typebuf.tb_len)

View File

@@ -1536,4 +1536,34 @@ func Test_abbreviate_latin1_encoding()
set encoding=utf-8 set encoding=utf-8
endfunc 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 " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
4498,
/**/ /**/
4497, 4497,
/**/ /**/