aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2022-02-27 16:47:55 +0100
committerGitHub <noreply@github.com>2022-02-27 16:47:55 +0100
commitc65d93e60adcacded822f0ad5d539042e600f523 (patch)
treefadf4755797c5f7e56bd73250ef29dbd9a745c94
parent243869658e2ecc35b25a37bab59c04eb45231924 (diff)
parentc031e038df8429e14b0aa608aaa77068daa680f0 (diff)
downloadrneovim-c65d93e60adcacded822f0ad5d539042e600f523.tar.gz
rneovim-c65d93e60adcacded822f0ad5d539042e600f523.tar.bz2
rneovim-c65d93e60adcacded822f0ad5d539042e600f523.zip
Merge pull request #16969 from shadmansaleh/enhance/ingore_nore_on_plug_keymaps
feat: ignore nore on <Plug> maps
-rw-r--r--runtime/doc/lua.txt4
-rw-r--r--runtime/doc/map.txt3
-rw-r--r--runtime/doc/vim_diff.txt3
-rw-r--r--runtime/lua/vim/keymap.lua6
-rw-r--r--src/nvim/getchar.c13
-rw-r--r--test/functional/ex_cmds/map_spec.lua35
6 files changed, 56 insertions, 8 deletions
diff --git a/runtime/doc/lua.txt b/runtime/doc/lua.txt
index 4ea78c2426..98af84e1cb 100644
--- a/runtime/doc/lua.txt
+++ b/runtime/doc/lua.txt
@@ -2014,9 +2014,7 @@ set({mode}, {lhs}, {rhs}, {opts}) *vim.keymap.set()*
result of Lua expr maps.
• remap: (boolean) Make the mapping recursive.
This is the inverse of the "noremap" option from
- |nvim_set_keymap()|. Default `true` if `lhs` is
- a string starting with `<plug>`
- (case-insensitive), `false` otherwise.
+ |nvim_set_keymap()|. Default `false` .
See also: ~
|nvim_set_keymap()|
diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt
index 0a44ee2418..8d5449da0b 100644
--- a/runtime/doc/map.txt
+++ b/runtime/doc/map.txt
@@ -65,6 +65,9 @@ modes.
where the map command applies. Disallow mapping of
{rhs}, to avoid nested and recursive mappings. Often
used to redefine a command.
+ Note: "nore" is ignored for a mapping whose result
+ starts with <Plug>. <Plug> is always remapped even if
+ "nore" is used.
:unm[ap] {lhs} |mapmode-nvo| *:unm* *:unmap*
diff --git a/runtime/doc/vim_diff.txt b/runtime/doc/vim_diff.txt
index 5ea6a9c5dd..d7a65756bf 100644
--- a/runtime/doc/vim_diff.txt
+++ b/runtime/doc/vim_diff.txt
@@ -442,6 +442,9 @@ Working directory (Vim implemented some of these later than Nvim):
- `getcwd(-1)` is equivalent to `getcwd(-1, 0)` instead of returning the global
working directory. Use `getcwd(-1, -1)` to get the global working directory.
+Mappings:
+- |nore| is ignored for rhs <Plug> mappings. <Plug> mappings are always remapped.
+
==============================================================================
5. Missing legacy features *nvim-features-missing*
diff --git a/runtime/lua/vim/keymap.lua b/runtime/lua/vim/keymap.lua
index d53b790746..df49eff4b6 100644
--- a/runtime/lua/vim/keymap.lua
+++ b/runtime/lua/vim/keymap.lua
@@ -42,7 +42,7 @@ local keymap = {}
--- |nvim_replace_termcodes()| is applied to the result of Lua expr maps.
--- - remap: (boolean) Make the mapping recursive. This is the
--- inverse of the "noremap" option from |nvim_set_keymap()|.
---- Default `true` if `lhs` is a string starting with `<plug>` (case-insensitive), `false` otherwise.
+--- Default `false`.
---@see |nvim_set_keymap()|
function keymap.set(mode, lhs, rhs, opts)
vim.validate {
@@ -66,8 +66,8 @@ function keymap.set(mode, lhs, rhs, opts)
opts.replace_keycodes = nil
if opts.remap == nil then
- -- remap by default on <plug> mappings and don't otherwise.
- opts.noremap = is_rhs_luaref or rhs:lower():match("^<plug>") == nil
+ -- default remap value is false
+ opts.noremap = true
else
-- remaps behavior is opposite of noremap option.
opts.noremap = not opts.remap
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index eb294b1c9b..f249cde9a0 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -1710,6 +1710,15 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth)
int keylen = *keylenp;
int i;
int local_State = get_real_state();
+ bool is_plug_map = false;
+
+ // Check if typehead starts with a <Plug> mapping.
+ // In that case we will ignore nore flag on it.
+ 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.
// Walk through one maphash[] list until we find an entry that matches.
@@ -1725,7 +1734,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth)
tb_c1 = typebuf.tb_buf[typebuf.tb_off];
if (no_mapping == 0 && 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))))
&& !(p_paste && (State & (INSERT + CMDLINE)))
@@ -1813,7 +1822,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth)
break;
}
}
- if (n >= 0) {
+ if (!is_plug_map && n >= 0) {
continue;
}
diff --git a/test/functional/ex_cmds/map_spec.lua b/test/functional/ex_cmds/map_spec.lua
index 75f644da0f..007d68d61a 100644
--- a/test/functional/ex_cmds/map_spec.lua
+++ b/test/functional/ex_cmds/map_spec.lua
@@ -8,6 +8,8 @@ local meths = helpers.meths
local clear = helpers.clear
local command = helpers.command
local expect = helpers.expect
+local insert = helpers.insert
+local eval = helpers.eval
describe(':*map', function()
before_each(clear)
@@ -27,6 +29,39 @@ describe(':*map', function()
feed('i-<M-">-')
expect('-foo-')
end)
+
+ it('<Plug> keymaps ignore nore', function()
+ command('let x = 0')
+ eq(0, meths.eval('x'))
+ command [[
+ nnoremap <Plug>(Increase_x) <cmd>let x+=1<cr>
+ nmap increase_x_remap <Plug>(Increase_x)
+ nnoremap increase_x_noremap <Plug>(Increase_x)
+ ]]
+ feed('increase_x_remap')
+ eq(1, meths.eval('x'))
+ feed('increase_x_noremap')
+ eq(2, meths.eval('x'))
+ end)
+ it("Doesn't auto ignore nore for keys before or after <Plug> keymap", function()
+ command('let x = 0')
+ eq(0, meths.eval('x'))
+ command [[
+ nnoremap x <nop>
+ nnoremap <Plug>(Increase_x) <cmd>let x+=1<cr>
+ nmap increase_x_remap x<Plug>(Increase_x)x
+ nnoremap increase_x_noremap x<Plug>(Increase_x)x
+ ]]
+ insert("Some text")
+ eq('Some text', eval("getline('.')"))
+
+ feed('increase_x_remap')
+ eq(1, meths.eval('x'))
+ eq('Some text', eval("getline('.')"))
+ feed('increase_x_noremap')
+ eq(2, meths.eval('x'))
+ eq('Some te', eval("getline('.')"))
+ end)
end)
describe(':*map cursor and redrawing', function()