Mercurial > vim
changeset 27946:5147f3d3ed30 v8.2.4498
patch 8.2.4498: using <Plug> with "noremap" does not work
Commit: https://github.com/vim/vim/commit/1fc34225acbee5ddca2b9ec3f82b3014d385b7f8
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Mar 3 13:56:24 2022 +0000
patch 8.2.4498: using <Plug> with "noremap" does not work
Problem: Using <Plug> with "noremap" does not work.
Solution: Always remap <Plug>. (closes https://github.com/vim/vim/issues/9879, closes https://github.com/vim/vim/issues/9789)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 03 Mar 2022 15:00:03 +0100 |
parents | 4e0bb0664653 |
children | 6516ac07cda3 |
files | runtime/doc/map.txt src/getchar.c src/testdir/test_mapping.vim src/version.c |
diffstat | 4 files changed, 43 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/doc/map.txt +++ b/runtime/doc/map.txt @@ -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*
--- a/src/getchar.c +++ b/src/getchar.c @@ -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)
--- a/src/testdir/test_mapping.vim +++ b/src/testdir/test_mapping.vim @@ -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