diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-04-24 13:12:38 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-04-24 13:12:38 +0200 |
commit | 7ba1e4d363164e32a93cceab64b42e8c6d89e9f3 (patch) | |
tree | 394f63849ccd92fab02124387392df2aa77f75a2 | |
parent | e0c03c8e107f109eadab145e18544d8e74a6976e (diff) |
patch 8.2.2804: setting buffer local mapping with mapset() changes globalv8.2.2804
Problem: Setting buffer local mapping with mapset() changes global mapping.
Solution: Only set the local mapping. (closes #8143)
-rw-r--r-- | src/map.c | 26 | ||||
-rw-r--r-- | src/testdir/test_maparg.vim | 21 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 43 insertions, 6 deletions
@@ -2295,6 +2295,7 @@ f_mapset(typval_T *argvars, typval_T *rettv UNUSED) int noremap; int expr; int silent; + int buffer; scid_T sid; linenr_T lnum; mapblock_T **map_table = maphash; @@ -2336,18 +2337,31 @@ f_mapset(typval_T *argvars, typval_T *rettv UNUSED) silent = dict_get_number(d, (char_u *)"silent") != 0; sid = dict_get_number(d, (char_u *)"sid"); lnum = dict_get_number(d, (char_u *)"lnum"); - if (dict_get_number(d, (char_u *)"buffer")) + buffer = dict_get_number(d, (char_u *)"buffer"); + nowait = dict_get_number(d, (char_u *)"nowait") != 0; + // mode from the dict is not used + + if (buffer) { map_table = curbuf->b_maphash; abbr_table = &curbuf->b_first_abbr; } - nowait = dict_get_number(d, (char_u *)"nowait") != 0; - // mode from the dict is not used // Delete any existing mapping for this lhs and mode. - arg = vim_strsave(lhs); - if (arg == NULL) - return; + if (buffer) + { + arg = alloc(STRLEN(lhs) + STRLEN("<buffer>") + 1); + if (arg == NULL) + return; + STRCPY(arg, "<buffer>"); + STRCPY(arg + 8, lhs); + } + else + { + arg = vim_strsave(lhs); + if (arg == NULL) + return; + } do_map(1, arg, mode, is_abbr); vim_free(arg); diff --git a/src/testdir/test_maparg.vim b/src/testdir/test_maparg.vim index d0f2ec23f2..4cd32a5d3c 100644 --- a/src/testdir/test_maparg.vim +++ b/src/testdir/test_maparg.vim @@ -254,6 +254,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 diff --git a/src/version.c b/src/version.c index a6667e9718..c5c3feeb3e 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2804, +/**/ 2803, /**/ 2802, |