From: Bram Moolenaar Date: Sat, 24 Apr 2021 11:12:38 +0000 (+0200) Subject: patch 8.2.2804: setting buffer local mapping with mapset() changes global X-Git-Tag: v8.2.2804 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7ba1e4d363164e32a93cceab64b42e8c6d89e9f3;p=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 #8143) --- diff --git a/src/map.c b/src/map.c index 917f1a244..f142db09c 100644 --- a/src/map.c +++ b/src/map.c @@ -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("") + 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 index d0f2ec23f..4cd32a5d3 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 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 index a6667e971..c5c3feeb3 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2804, /**/ 2803, /**/