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:
26
src/map.c
26
src/map.c
@@ -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);
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user