Mercurial > vim
changeset 24529:db2b4e867d06 v8.2.2804
patch 8.2.2804: setting buffer local mapping with mapset() changes global
Commit: https://github.com/vim/vim/commit/7ba1e4d363164e32a93cceab64b42e8c6d89e9f3
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Apr 24 13:12:38 2021 +0200
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 https://github.com/vim/vim/issues/8143)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 24 Apr 2021 13:15:03 +0200 |
parents | f6df7cdae112 |
children | 51e01f7c2069 |
files | src/map.c src/testdir/test_maparg.vim src/version.c |
diffstat | 3 files changed, 43 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/map.c +++ b/src/map.c @@ -2295,6 +2295,7 @@ f_mapset(typval_T *argvars, typval_T *re 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 *re 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);
--- 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