Mercurial > vim
diff src/map.c @ 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 | f8382c4e6551 |
children | 839145e0fdaa |
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);