1
0
forked from aniani/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)
This commit is contained in:
Bram Moolenaar
2021-04-24 13:12:38 +02:00
parent e0c03c8e10
commit 7ba1e4d363
3 changed files with 43 additions and 6 deletions

View File

@@ -2295,6 +2295,7 @@ f_mapset(typval_T *argvars, typval_T *rettv UNUSED)
int noremap; int noremap;
int expr; int expr;
int silent; int silent;
int buffer;
scid_T sid; scid_T sid;
linenr_T lnum; linenr_T lnum;
mapblock_T **map_table = maphash; 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; silent = dict_get_number(d, (char_u *)"silent") != 0;
sid = dict_get_number(d, (char_u *)"sid"); sid = dict_get_number(d, (char_u *)"sid");
lnum = dict_get_number(d, (char_u *)"lnum"); 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; map_table = curbuf->b_maphash;
abbr_table = &curbuf->b_first_abbr; 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. // Delete any existing mapping for this lhs and mode.
arg = vim_strsave(lhs); if (buffer)
if (arg == NULL) {
return; 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); do_map(1, arg, mode, is_abbr);
vim_free(arg); vim_free(arg);

View File

@@ -254,6 +254,27 @@ func Check_ctrlb_map(d, check_alt)
endif endif
endfunc 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() func Test_map_restore()
" Test restoring map with alternate keycode " Test restoring map with alternate keycode
nmap <C-B> back nmap <C-B> back

View File

@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2804,
/**/ /**/
2803, 2803,
/**/ /**/