vim-patch:8.2.4825: can only get a list of mappings

Problem:    Can only get a list of mappings.
Solution:   Add the optional {abbr} argument. (Ernie Rael, closes vim/vim#10277)
            Rename to maplist().  Rename test file.

09661203ec

Co-authored-by: Ernie Rael <errael@raelity.com>
This commit is contained in:
zeertzjq 2023-11-09 19:36:58 +08:00
parent 2dfcd5a22b
commit d4dbfb092b
6 changed files with 92 additions and 60 deletions

View File

@ -2612,16 +2612,6 @@ getloclist({nr} [, {what}]) *getloclist()*
echo getloclist(5, {'filewinid': 0}) 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: >
echo getmappings()->filter({_, m ->
\ match(get(m, 'rhs', ''), 'MultiMatch') >= 0
\ })
getmarklist([{buf}]) *getmarklist()* getmarklist([{buf}]) *getmarklist()*
Without the {buf} argument returns a |List| with information Without the {buf} argument returns a |List| with information
about all the global marks. |mark| about all the global marks. |mark|
@ -4143,7 +4133,8 @@ maparg({name} [, {mode} [, {abbr} [, {dict}]]]) *maparg()*
When {dict} is omitted or zero: Return the rhs of mapping When {dict} is omitted or zero: Return the rhs of mapping
{name} in mode {mode}. The returned String has special {name} in mode {mode}. The returned String has special
characters translated like in the output of the ":map" command characters translated like in the output of the ":map" command
listing. 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 When there is no mapping for {name}, an empty String is
returned if {dict} is FALSE, otherwise returns an empty Dict. returned if {dict} is FALSE, otherwise returns an empty Dict.
@ -4237,6 +4228,17 @@ mapcheck({name} [, {mode} [, {abbr}]]) *mapcheck()*
< This avoids adding the "_vv" mapping when there already is a < This avoids adding the "_vv" mapping when there already is a
mapping for "_v" or for "_vvv". mapping for "_v" or for "_vvv".
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: >vim
echo maplist()->filter({_, m ->
\ match(get(m, 'rhs', ''), 'MultiMatch') >= 0
\ })
mapnew({expr1}, {expr2}) *mapnew()* mapnew({expr1}, {expr2}) *mapnew()*
Like |map()| but instead of replacing items in {expr1} a new Like |map()| but instead of replacing items in {expr1} a new
List or Dictionary is created and returned. {expr1} remains List or Dictionary is created and returned. {expr1} remains

View File

@ -1012,10 +1012,10 @@ Mappings and Menus: *mapping-functions*
digraph_getlist() get all |digraph|s digraph_getlist() get all |digraph|s
digraph_set() register |digraph| digraph_set() register |digraph|
digraph_setlist() register multiple |digraph|s digraph_setlist() register multiple |digraph|s
getmappings() get list of all mappings
hasmapto() check if a mapping exists hasmapto() check if a mapping exists
mapcheck() check if a matching mapping exists mapcheck() check if a matching mapping exists
maparg() get rhs of a mapping maparg() get rhs of a mapping
maplist() get list of all mappings
mapset() restore a mapping mapset() restore a mapping
menu_info() get information about a menu item menu_info() get information about a menu item
wildmenumode() check if the wildmode is active wildmenumode() check if the wildmode is active

View File

@ -3175,18 +3175,6 @@ function vim.fn.getline(lnum, end_) end
--- @return any --- @return any
function vim.fn.getloclist(nr, what) end function vim.fn.getloclist(nr, what) end
--- 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: >
--- echo getmappings()->filter({_, m ->
--- \ match(get(m, 'rhs', ''), 'MultiMatch') >= 0
--- \ })
---
--- @return any
function vim.fn.getmappings() end
--- Without the {buf} argument returns a |List| with information --- Without the {buf} argument returns a |List| with information
--- about all the global marks. |mark| --- about all the global marks. |mark|
--- ---
@ -5006,7 +4994,8 @@ function vim.fn.map(expr1, expr2) end
--- When {dict} is omitted or zero: Return the rhs of mapping --- When {dict} is omitted or zero: Return the rhs of mapping
--- {name} in mode {mode}. The returned String has special --- {name} in mode {mode}. The returned String has special
--- characters translated like in the output of the ":map" command --- characters translated like in the output of the ":map" command
--- listing. --- 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 --- When there is no mapping for {name}, an empty String is
--- returned if {dict} is FALSE, otherwise returns an empty Dict. --- returned if {dict} is FALSE, otherwise returns an empty Dict.
@ -5112,6 +5101,19 @@ function vim.fn.maparg(name, mode, abbr, dict) end
--- @return any --- @return any
function vim.fn.mapcheck(name, mode, abbr) end function vim.fn.mapcheck(name, mode, abbr) end
--- 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: >vim
--- echo maplist()->filter({_, m ->
--- \ match(get(m, 'rhs', ''), 'MultiMatch') >= 0
--- \ })
---
--- @return any
function vim.fn.maplist() end
--- Like |map()| but instead of replacing items in {expr1} a new --- Like |map()| but instead of replacing items in {expr1} a new
--- List or Dictionary is created and returned. {expr1} remains --- List or Dictionary is created and returned. {expr1} remains
--- unchanged. Items can still be changed by {expr2}, if you --- unchanged. Items can still be changed by {expr2}, if you

View File

@ -3957,22 +3957,6 @@ M.funcs = {
params = { { 'nr', 'integer' }, { 'what', 'any' } }, params = { { 'nr', 'integer' }, { 'what', 'any' } },
signature = 'getloclist({nr} [, {what}])', signature = 'getloclist({nr} [, {what}])',
}, },
getmappings = {
args = 0,
desc = [[
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: >
echo getmappings()->filter({_, m ->
\ match(get(m, 'rhs', ''), 'MultiMatch') >= 0
\ })
]],
name = 'getmappings',
params = {},
signature = 'getmappings()'
},
getmarklist = { getmarklist = {
args = { 0, 1 }, args = { 0, 1 },
base = 1, base = 1,
@ -6158,7 +6142,8 @@ M.funcs = {
When {dict} is omitted or zero: Return the rhs of mapping When {dict} is omitted or zero: Return the rhs of mapping
{name} in mode {mode}. The returned String has special {name} in mode {mode}. The returned String has special
characters translated like in the output of the ":map" command characters translated like in the output of the ":map" command
listing. 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 When there is no mapping for {name}, an empty String is
returned if {dict} is FALSE, otherwise returns an empty Dict. returned if {dict} is FALSE, otherwise returns an empty Dict.
@ -6271,6 +6256,23 @@ M.funcs = {
params = { { 'name', 'string' }, { 'mode', 'string' }, { 'abbr', 'any' } }, params = { { 'name', 'string' }, { 'mode', 'string' }, { 'abbr', 'any' } },
signature = 'mapcheck({name} [, {mode} [, {abbr}]])', signature = 'mapcheck({name} [, {mode} [, {abbr}]])',
}, },
maplist = {
args = { 0, 1 },
desc = [[
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: >vim
echo maplist()->filter({_, m ->
\ match(get(m, 'rhs', ''), 'MultiMatch') >= 0
\ })
]],
name = 'maplist',
params = {},
signature = 'maplist([{abbr}])'
},
mapnew = { mapnew = {
args = 2, args = 2,
base = 1, base = 1,

View File

@ -2282,9 +2282,10 @@ void f_mapset(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
} }
/// "maplist()" function /// "maplist()" function
void f_getmappings(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) void f_maplist(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
{ {
const int flags = REPTERM_FROM_PART | REPTERM_DO_LT; const int flags = REPTERM_FROM_PART | REPTERM_DO_LT;
const bool abbr = argvars[0].v_type != VAR_UNKNOWN && tv_get_bool(&argvars[0]);
tv_list_alloc_ret(rettv, kListLenUnknown); tv_list_alloc_ret(rettv, kListLenUnknown);
@ -2292,7 +2293,16 @@ void f_getmappings(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
for (int buffer_local = 0; buffer_local <= 1; buffer_local++) { for (int buffer_local = 0; buffer_local <= 1; buffer_local++) {
for (int hash = 0; hash < 256; hash++) { for (int hash = 0; hash < 256; hash++) {
mapblock_T *mp; mapblock_T *mp;
if (buffer_local) { 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]; mp = curbuf->b_maphash[hash];
} else { } else {
mp = maphash[hash]; mp = maphash[hash];

View File

@ -1,4 +1,4 @@
" Tests for maparg(), mapcheck() and mapset(). " Tests for maparg(), mapcheck(), mapset(), maplist()
" Also test utf8 map with a 0x80 byte. " Also test utf8 map with a 0x80 byte.
source shared.vim source shared.vim
@ -372,15 +372,16 @@ func Test_map_restore_negative_sid()
call delete('Xresult') call delete('Xresult')
endfunc endfunc
func Test_getmappings() func Test_maplist()
new new
func s:ClearMaps() func s:ClearMappingsAbbreviations()
mapclear | nmapclear | vmapclear | xmapclear | smapclear | omapclear mapclear | nmapclear | vmapclear | xmapclear | smapclear | omapclear
mapclear! | imapclear | lmapclear | cmapclear | tmapclear mapclear! | imapclear | lmapclear | cmapclear | tmapclear
mapclear <buffer> | nmapclear <buffer> | vmapclear <buffer> mapclear <buffer> | nmapclear <buffer> | vmapclear <buffer>
xmapclear <buffer> | smapclear <buffer> | omapclear <buffer> xmapclear <buffer> | smapclear <buffer> | omapclear <buffer>
mapclear! <buffer> | imapclear <buffer> | lmapclear <buffer> mapclear! <buffer> | imapclear <buffer> | lmapclear <buffer>
cmapclear <buffer> | tmapclear <buffer> cmapclear <buffer> | tmapclear <buffer>
abclear | abclear <buffer>
endfunc endfunc
func s:AddMaps(new, accum) func s:AddMaps(new, accum)
@ -389,8 +390,9 @@ func Test_getmappings()
endif endif
endfunc endfunc
call s:ClearMaps() call s:ClearMappingsAbbreviations()
call assert_equal(0, len(getmappings())) call assert_equal(0, len(maplist()))
call assert_equal(0, len(maplist(v:true)))
" Set up some mappings. " Set up some mappings.
map dup bar map dup bar
@ -406,10 +408,16 @@ func Test_getmappings()
map abc <Nop> map abc <Nop>
nmap <M-j> x nmap <M-j> x
nmap <M-Space> y nmap <M-Space> y
" And abbreviations
abbreviate xy he
abbreviate xx she
abbreviate <buffer> x they
" Get a list of the mappings with the ':map' commands. " Get a list of the mappings with the ':map' commands.
" Check getmappings() return a list of the same size. " Check maplist() return a list of the same size.
call assert_equal(13, len(getmappings())) call assert_equal(13, len(maplist()))
call assert_equal(3, len(maplist(v:true)))
call assert_equal(13, len(maplist(v:false)))
" collect all the current maps using :map commands " collect all the current maps using :map commands
let maps_command = [] let maps_command = []
@ -418,20 +426,20 @@ func Test_getmappings()
call s:AddMaps(split(execute('tmap'), '\n'), maps_command) call s:AddMaps(split(execute('tmap'), '\n'), maps_command)
call s:AddMaps(split(execute('lmap'), '\n'), maps_command) call s:AddMaps(split(execute('lmap'), '\n'), maps_command)
" Use getmappings to get all the maps " Use maplist to get all the maps
let maps_getmappings = getmappings() let maps_maplist = maplist()
call assert_equal(len(maps_command), len(maps_getmappings)) call assert_equal(len(maps_command), len(maps_maplist))
" make sure all the mode-lhs are unique, no duplicates " make sure all the mode-lhs are unique, no duplicates
let map_set = {} let map_set = {}
for d in maps_getmappings for d in maps_maplist
let map_set[d.mode .. "-" .. d.lhs .. "-" .. d.buffer] = 0 let map_set[d.mode .. "-" .. d.lhs .. "-" .. d.buffer] = 0
endfor endfor
call assert_equal(len(maps_getmappings), len(map_set)) call assert_equal(len(maps_maplist), len(map_set))
" For everything returned by getmappings, should be the same as from maparg. " For everything returned by maplist, should be the same as from maparg.
" Except for "map dup", bacause maparg returns the <buffer> version " Except for "map dup", bacause maparg returns the <buffer> version
for d in maps_getmappings for d in maps_maplist
if d.lhs == 'dup' && d.buffer == 0 if d.lhs == 'dup' && d.buffer == 0
continue continue
endif endif
@ -439,8 +447,16 @@ func Test_getmappings()
call assert_equal(d_maparg, d) call assert_equal(d_maparg, d)
endfor endfor
call s:ClearMaps() " Check abbr matches maparg
call assert_equal(0, len(getmappings())) for d in maplist(v:true)
" Note, d.mode is '!', but can't use that with maparg
let d_maparg = maparg(d.lhs, 'i', v:true, v:true)
call assert_equal(d_maparg, d)
endfor
call s:ClearMappingsAbbreviations()
call assert_equal(0, len(maplist()))
call assert_equal(0, len(maplist(v:true)))
endfunc endfunc