aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-08-01 15:43:38 +0800
committerzeertzjq <zeertzjq@outlook.com>2022-08-01 21:54:18 +0800
commit34e7dc5d051918dc9df3d7bd8309a9a4974e7874 (patch)
treedfd97534a26b53655c5a7ab4a6493303d260cae9
parent7d45f1a5e8d05000a174dac149b56217c82e0214 (diff)
downloadrneovim-34e7dc5d051918dc9df3d7bd8309a9a4974e7874.tar.gz
rneovim-34e7dc5d051918dc9df3d7bd8309a9a4974e7874.tar.bz2
rneovim-34e7dc5d051918dc9df3d7bd8309a9a4974e7874.zip
vim-patch:8.2.2804: setting buffer local mapping with mapset() changes global
Problem: Setting buffer local mapping with mapset() changes global mapping. Solution: Only set the local mapping. (closes vim/vim#8143) https://github.com/vim/vim/commit/7ba1e4d363164e32a93cceab64b42e8c6d89e9f3
-rw-r--r--src/nvim/mapping.c24
-rw-r--r--src/nvim/testdir/test_maparg.vim21
2 files changed, 32 insertions, 13 deletions
diff --git a/src/nvim/mapping.c b/src/nvim/mapping.c
index 0bb397c748..ac81cbcb89 100644
--- a/src/nvim/mapping.c
+++ b/src/nvim/mapping.c
@@ -2171,23 +2171,21 @@ void f_mapset(typval_T *argvars, typval_T *rettv, FunPtr fptr)
.silent = tv_dict_get_number(d, "silent") != 0,
.nowait = tv_dict_get_number(d, "nowait") != 0,
};
-
scid_T sid = (scid_T)tv_dict_get_number(d, "sid");
linenr_T lnum = (linenr_T)tv_dict_get_number(d, "lnum");
-
- mapblock_T **map_table = maphash;
- mapblock_T **abbr_table = &first_abbr;
-
- if (tv_dict_get_number(d, "buffer") != 0) {
- map_table = curbuf->b_maphash;
- abbr_table = &curbuf->b_first_abbr;
- }
+ bool buffer = tv_dict_get_number(d, "buffer") != 0;
// mode from the dict is not used
+ mapblock_T **map_table = buffer ? curbuf->b_maphash : maphash;
+ mapblock_T **abbr_table = buffer ? &curbuf->b_first_abbr : &first_abbr;
+
// Delete any existing mapping for this lhs and mode.
- char_u *arg = vim_strsave((char_u *)lhs);
- do_map(1, arg, mode, is_abbr); // TODO: refactor this later
- xfree(arg);
+ MapArguments unmap_args = MAP_ARGUMENTS_INIT;
+ set_maparg_lhs_rhs(lhs, strlen(lhs), rhs, strlen(rhs), LUA_NOREF, 0, &unmap_args);
+ unmap_args.buffer = buffer;
+ buf_do_map(1, &unmap_args, mode, false, curbuf);
+ xfree(unmap_args.rhs);
+ xfree(unmap_args.orig_rhs);
if (lhsrawalt != NULL) {
map_add(curbuf, map_table, abbr_table, (char_u *)lhsrawalt, &args, noremap, mode, is_abbr,
@@ -2219,7 +2217,7 @@ void f_mapcheck(typval_T *argvars, typval_T *rettv, FunPtr fptr)
/// @param buffer If true, make a buffer-local mapping for curbuf
void add_map(char *lhs, char *rhs, int mode, bool buffer)
{
- MapArguments args = { 0 };
+ MapArguments args = MAP_ARGUMENTS_INIT;
set_maparg_lhs_rhs(lhs, strlen(lhs), rhs, strlen(rhs), LUA_NOREF, 0, &args);
args.buffer = buffer;
diff --git a/src/nvim/testdir/test_maparg.vim b/src/nvim/testdir/test_maparg.vim
index 6b69def374..0bade1df7f 100644
--- a/src/nvim/testdir/test_maparg.vim
+++ b/src/nvim/testdir/test_maparg.vim
@@ -253,6 +253,27 @@ func Check_ctrlb_map(d, check_alt)
endif
endfunc
+func Test_map_local()
+ nmap a global
+ nmap <buffer>a local
+
+ let prev_map_list = split(execute('nmap a'), "\n")
+ call assert_match('n\s*a\s*@local', prev_map_list[0])
+ call assert_match('n\s*a\s*global', prev_map_list[1])
+
+ let mapping = maparg('a', 'n', 0, 1)
+ call assert_equal(1, mapping.buffer)
+ let mapping.rhs = 'new_local'
+ call mapset('n', 0, mapping)
+
+ " Check that the global mapping is left untouched.
+ let map_list = split(execute('nmap a'), "\n")
+ call assert_match('n\s*a\s*@new_local', map_list[0])
+ call assert_match('n\s*a\s*global', map_list[1])
+
+ nunmap a
+endfunc
+
func Test_map_restore()
" Test restoring map with alternate keycode
nmap <C-B> back