To: vim_dev@googlegroups.com Subject: Patch 8.2.4825 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4825 Problem: Can only get a list of mappings. Solution: Add the optional {abbr} argument. (Ernie Rael, closes #10277) Rename to maplist(). Rename test file. Files: runtime/doc/builtin.txt, runtime/doc/usr_41.txt, src/evalfunc.c, src/map.c, src/proto/map.pro, src/testdir/test_maparg.vim, src/testdir/test_map_functions.vim, src/testdir/Make_all.mak *** ../vim-8.2.4824/runtime/doc/builtin.txt 2022-04-24 18:40:20.787116270 +0100 --- runtime/doc/builtin.txt 2022-04-25 14:25:44.622617201 +0100 *************** *** 235,241 **** getline({lnum}, {end}) List lines {lnum} to {end} of current buffer getloclist({nr}) List list of location list items getloclist({nr}, {what}) Dict get specific location list properties - getmappings() List list of all mappings, a dict for each getmarklist([{buf}]) List list of global/local marks getmatches([{win}]) List list of current matches getmousepos() Dict last known mouse position --- 235,240 ---- *************** *** 338,343 **** --- 337,343 ---- rhs of mapping {name} in mode {mode} mapcheck({name} [, {mode} [, {abbr}]]) String check for mappings matching {name} + maplist([{abbr}]) List list of all mappings, a dict for each mapnew({expr1}, {expr2}) List/Dict/Blob/String like |map()| but creates a new List or Dictionary *************** *** 3557,3573 **** :echo getloclist(5, {'filewinid': 0}) - getmappings() *getmappings()* - Returns a |List| of all mappings. Each List item is a |Dict|, - the same as what is returned by |maparg()|, see - |mapping-dict|. - - Example to show all mappings with 'MultiMatch' in rhs: > - vim9script - echo getmappings()->filter( - (_, m) => match(m.rhs, 'MultiMatch') >= 0) - - getmarklist([{buf}]) *getmarklist()* Without the {buf} argument returns a |List| with information about all the global marks. |mark| --- 3572,3577 ---- *************** *** 5229,5235 **** When {dict} is omitted or zero: Return the rhs of mapping {name} in mode {mode}. The returned String has special characters translated like in the output of the ":map" command ! listing. When there is no mapping for {name}, an empty String is returned. When the mapping for {name} is empty, then "" --- 5237,5244 ---- When {dict} is omitted or zero: Return the rhs of mapping {name} in mode {mode}. The returned String has special characters translated like in the output of the ":map" command ! listing. When {dict} is TRUE a dictionary is returned, see ! below. To get a list of all mappings see |maplist()|. When there is no mapping for {name}, an empty String is returned. When the mapping for {name} is empty, then "" *************** *** 5288,5294 **** then the global mappings. This function can be used to map a key even when it's already mapped, and have it do the original mapping too. Sketch: > ! exe 'nnoremap ==' . maparg('', 'n') < Can also be used as a |method|: > GetKey()->maparg('n') --- 5297,5303 ---- then the global mappings. This function can be used to map a key even when it's already mapped, and have it do the original mapping too. Sketch: > ! exe 'nnoremap ==' .. maparg('', 'n') < Can also be used as a |method|: > GetKey()->maparg('n') *************** *** 5330,5335 **** --- 5339,5356 ---- GetKey()->mapcheck('n') + maplist([{abbr}]) *maplist()* + Returns a |List| of all mappings. Each List item is a |Dict|, + the same as what is returned by |maparg()|, see + |mapping-dict|. When {abbr} is there and it is |TRUE| use + abbreviations instead of mappings. + + Example to show all mappings with 'MultiMatch' in rhs: > + vim9script + echo maplist()->filter( + (_, m) => match(m.rhs, 'MultiMatch') >= 0) + + mapnew({expr1}, {expr2}) *mapnew()* Like |map()| but instead of replacing items in {expr1} a new List or Dictionary is created and returned. {expr1} remains *** ../vim-8.2.4824/runtime/doc/usr_41.txt 2022-04-24 18:40:20.787116270 +0100 --- runtime/doc/usr_41.txt 2022-04-25 14:26:33.198607690 +0100 *************** *** 998,1007 **** digraph_getlist() get all |digraph|s digraph_set() register |digraph| digraph_setlist() register multiple |digraph|s - getmappings() get list of all mappings hasmapto() check if a mapping exists mapcheck() check if a matching mapping exists maparg() get rhs of a mapping mapset() restore a mapping menu_info() get information about a menu item wildmenumode() check if the wildmode is active --- 1089,1098 ---- digraph_getlist() get all |digraph|s digraph_set() register |digraph| digraph_setlist() register multiple |digraph|s hasmapto() check if a mapping exists mapcheck() check if a matching mapping exists maparg() get rhs of a mapping + maplist() get list of all mappings mapset() restore a mapping menu_info() get information about a menu item wildmenumode() check if the wildmode is active *** ../vim-8.2.4824/src/evalfunc.c 2022-04-24 18:40:20.791116268 +0100 --- src/evalfunc.c 2022-04-25 14:23:51.382628791 +0100 *************** *** 1871,1878 **** ret_getline, f_getline}, {"getloclist", 1, 2, 0, arg2_number_dict_any, ret_list_or_dict_1, f_getloclist}, - {"getmappings", 0, 0, 0, NULL, - ret_list_dict_any, f_getmappings}, {"getmarklist", 0, 1, FEARG_1, arg1_buffer, ret_list_dict_any, f_getmarklist}, {"getmatches", 0, 1, 0, arg1_number, --- 1871,1876 ---- *************** *** 2049,2054 **** --- 2047,2054 ---- ret_maparg, f_maparg}, {"mapcheck", 1, 3, FEARG_1, arg3_string_string_bool, ret_string, f_mapcheck}, + {"maplist", 0, 1, 0, arg1_bool, + ret_list_dict_any, f_maplist}, {"mapnew", 2, 2, FEARG_1, arg2_mapnew, ret_first_cont, f_mapnew}, {"mapset", 3, 3, FEARG_1, arg3_string_bool_dict, *** ../vim-8.2.4824/src/map.c 2022-04-25 13:27:56.757032651 +0100 --- src/map.c 2022-04-25 14:24:09.290628026 +0100 *************** *** 2389,2398 **** } /* ! * "getmappings()" function */ void ! f_getmappings(typval_T *argvars UNUSED, typval_T *rettv) { dict_T *d; mapblock_T *mp; --- 2389,2398 ---- } /* ! * "maplist()" function */ void ! f_maplist(typval_T *argvars UNUSED, typval_T *rettv) { dict_T *d; mapblock_T *mp; *************** *** 2402,2407 **** --- 2402,2413 ---- int hash; char_u *lhs; const int flags = REPTERM_FROM_PART | REPTERM_DO_LT; + int abbr = FALSE; + + if (in_vim9script() && check_for_opt_bool_arg(argvars, 0) == FAIL) + return; + if (argvars[0].v_type != VAR_UNKNOWN) + abbr = tv_get_bool(&argvars[0]); if (rettv_list_alloc(rettv) != OK) return; *************** *** 2413,2419 **** { for (hash = 0; hash < 256; ++hash) { ! if (buffer_local) mp = curbuf->b_maphash[hash]; else mp = maphash[hash]; --- 2419,2434 ---- { for (hash = 0; hash < 256; ++hash) { ! if (abbr) ! { ! if (hash > 0) // there is only one abbr list ! break; ! if (buffer_local) ! mp = curbuf->b_first_abbr; ! else ! mp = first_abbr; ! } ! else if (buffer_local) mp = curbuf->b_maphash[hash]; else mp = maphash[hash]; *** ../vim-8.2.4824/src/proto/map.pro 2022-04-24 18:40:20.791116268 +0100 --- src/proto/map.pro 2022-04-25 14:27:21.506595907 +0100 *************** *** 8,14 **** int map_to_exists(char_u *str, char_u *modechars, int abbr); int map_to_exists_mode(char_u *rhs, int mode, int abbr); char_u *set_context_in_map_cmd(expand_T *xp, char_u *cmd, char_u *arg, int forceit, int isabbrev, int isunmap, cmdidx_T cmdidx); ! int ExpandMappings(char_u *pat, regmatch_T *regmatch, int *num_file, char_u ***file); int check_abbr(int c, char_u *ptr, int col, int mincol); char_u *eval_map_expr(mapblock_T *mp, int c); char_u *vim_strsave_escape_csi(char_u *p); --- 8,14 ---- int map_to_exists(char_u *str, char_u *modechars, int abbr); int map_to_exists_mode(char_u *rhs, int mode, int abbr); char_u *set_context_in_map_cmd(expand_T *xp, char_u *cmd, char_u *arg, int forceit, int isabbrev, int isunmap, cmdidx_T cmdidx); ! int ExpandMappings(char_u *pat, regmatch_T *regmatch, int *numMatches, char_u ***matches); int check_abbr(int c, char_u *ptr, int col, int mincol); char_u *eval_map_expr(mapblock_T *mp, int c); char_u *vim_strsave_escape_csi(char_u *p); *************** *** 17,23 **** int put_escstr(FILE *fd, char_u *strstart, int what); void check_map_keycodes(void); char_u *check_map(char_u *keys, int mode, int exact, int ign_mod, int abbr, mapblock_T **mp_ptr, int *local_ptr); ! void f_getmappings(typval_T *argvars, typval_T *rettv); void f_maparg(typval_T *argvars, typval_T *rettv); void f_mapcheck(typval_T *argvars, typval_T *rettv); void f_mapset(typval_T *argvars, typval_T *rettv); --- 17,23 ---- int put_escstr(FILE *fd, char_u *strstart, int what); void check_map_keycodes(void); char_u *check_map(char_u *keys, int mode, int exact, int ign_mod, int abbr, mapblock_T **mp_ptr, int *local_ptr); ! void f_maplist(typval_T *argvars, typval_T *rettv); void f_maparg(typval_T *argvars, typval_T *rettv); void f_mapcheck(typval_T *argvars, typval_T *rettv); void f_mapset(typval_T *argvars, typval_T *rettv); *** ../vim-8.2.4824/src/testdir/test_maparg.vim 2022-04-24 18:40:20.791116268 +0100 --- src/testdir/test_maparg.vim 1970-01-01 00:00:00.000000000 +0000 *************** *** 1,372 **** - " Tests for maparg(), mapcheck() and mapset(). - " Also test utf8 map with a 0x80 byte. - " Also test mapcheck() - - func s:SID() - return str2nr(matchstr(expand(''), '\zs\d\+\ze_SID$')) - endfunc - - func Test_maparg() - new - set cpo-=< - set encoding=utf8 - " Test maparg() with a string result - let sid = s:SID() - let lnum = expand('') - map foo isfoo - vnoremap