# HG changeset patch # User Bram Moolenaar # Date 1619262903 -7200 # Node ID db2b4e867d06f755b2e2dcbb1457a690a49d4d85 # Parent f6df7cdae112d8e3b8b0263418d45bba09620544 patch 8.2.2804: setting buffer local mapping with mapset() changes global Commit: https://github.com/vim/vim/commit/7ba1e4d363164e32a93cceab64b42e8c6d89e9f3 Author: Bram Moolenaar 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) diff --git a/src/map.c b/src/map.c --- 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("") + 1); + if (arg == NULL) + return; + STRCPY(arg, ""); + 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 --- 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 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 back diff --git a/src/version.c b/src/version.c --- 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,