mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.2.4820: not simple programmatic way to find a specific mapping
Problem: Not simple programmatic way to find a specific mapping.
Solution: Add getmappings(). (Ernie Rael, closes vim/vim#10273)
659c240cf7
Co-authored-by: Ernie Rael <errael@raelity.com>
This commit is contained in:
parent
a4b80c71ea
commit
2dfcd5a22b
12
runtime/doc/builtin.txt
generated
12
runtime/doc/builtin.txt
generated
@ -2612,6 +2612,16 @@ getloclist({nr} [, {what}]) *getloclist()*
|
||||
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()*
|
||||
Without the {buf} argument returns a |List| with information
|
||||
about all the global marks. |mark|
|
||||
@ -4161,7 +4171,7 @@ maparg({name} [, {mode} [, {abbr} [, {dict}]]]) *maparg()*
|
||||
|
||||
When {dict} is there and it is |TRUE| return a dictionary
|
||||
containing all the information of the mapping with the
|
||||
following items:
|
||||
following items: *mapping-dict*
|
||||
"lhs" The {lhs} of the mapping as it would be typed
|
||||
"lhsraw" The {lhs} of the mapping as raw bytes
|
||||
"lhsrawalt" The {lhs} of the mapping as raw bytes, alternate
|
||||
|
@ -1012,6 +1012,7 @@ Mappings and Menus: *mapping-functions*
|
||||
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
|
||||
|
14
runtime/lua/vim/_meta/vimfn.lua
generated
14
runtime/lua/vim/_meta/vimfn.lua
generated
@ -3175,6 +3175,18 @@ function vim.fn.getline(lnum, end_) end
|
||||
--- @return any
|
||||
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
|
||||
--- about all the global marks. |mark|
|
||||
---
|
||||
@ -5022,7 +5034,7 @@ function vim.fn.map(expr1, expr2) end
|
||||
---
|
||||
--- When {dict} is there and it is |TRUE| return a dictionary
|
||||
--- containing all the information of the mapping with the
|
||||
--- following items:
|
||||
--- following items: *mapping-dict*
|
||||
--- "lhs" The {lhs} of the mapping as it would be typed
|
||||
--- "lhsraw" The {lhs} of the mapping as raw bytes
|
||||
--- "lhsrawalt" The {lhs} of the mapping as raw bytes, alternate
|
||||
|
@ -3957,6 +3957,22 @@ M.funcs = {
|
||||
params = { { 'nr', 'integer' }, { 'what', 'any' } },
|
||||
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 = {
|
||||
args = { 0, 1 },
|
||||
base = 1,
|
||||
@ -6170,7 +6186,7 @@ M.funcs = {
|
||||
|
||||
When {dict} is there and it is |TRUE| return a dictionary
|
||||
containing all the information of the mapping with the
|
||||
following items:
|
||||
following items: *mapping-dict*
|
||||
"lhs" The {lhs} of the mapping as it would be typed
|
||||
"lhsraw" The {lhs} of the mapping as raw bytes
|
||||
"lhsrawalt" The {lhs} of the mapping as raw bytes, alternate
|
||||
|
@ -2281,6 +2281,49 @@ void f_mapset(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
|
||||
sid, lnum, false);
|
||||
}
|
||||
|
||||
/// "maplist()" function
|
||||
void f_getmappings(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
|
||||
{
|
||||
const int flags = REPTERM_FROM_PART | REPTERM_DO_LT;
|
||||
|
||||
tv_list_alloc_ret(rettv, kListLenUnknown);
|
||||
|
||||
// Do it twice: once for global maps and once for local maps.
|
||||
for (int buffer_local = 0; buffer_local <= 1; buffer_local++) {
|
||||
for (int hash = 0; hash < 256; hash++) {
|
||||
mapblock_T *mp;
|
||||
if (buffer_local) {
|
||||
mp = curbuf->b_maphash[hash];
|
||||
} else {
|
||||
mp = maphash[hash];
|
||||
}
|
||||
for (; mp; mp = mp->m_next) {
|
||||
if (mp->m_simplified) {
|
||||
continue;
|
||||
}
|
||||
|
||||
char *keys_buf = NULL;
|
||||
bool did_simplify = false;
|
||||
|
||||
char *lhs = str2special_save(mp->m_keys, true, false);
|
||||
(void)replace_termcodes(lhs, strlen(lhs), &keys_buf, 0, flags, &did_simplify,
|
||||
CPO_TO_CPO_FLAGS);
|
||||
xfree(lhs);
|
||||
|
||||
Dictionary dict = mapblock_fill_dict(mp,
|
||||
did_simplify ? keys_buf : NULL,
|
||||
buffer_local, true);
|
||||
typval_T d = TV_INITIAL_VALUE;
|
||||
(void)object_to_vim(DICTIONARY_OBJ(dict), &d, NULL);
|
||||
assert(d.v_type == VAR_DICT);
|
||||
tv_list_append_dict(rettv->vval.v_list, d.vval.v_dict);
|
||||
api_free_dictionary(dict);
|
||||
xfree(keys_buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// "maparg()" function
|
||||
void f_maparg(typval_T *argvars, typval_T *rettv, EvalFuncData fptr)
|
||||
{
|
||||
|
@ -372,4 +372,76 @@ func Test_map_restore_negative_sid()
|
||||
call delete('Xresult')
|
||||
endfunc
|
||||
|
||||
func Test_getmappings()
|
||||
new
|
||||
func s:ClearMaps()
|
||||
mapclear | nmapclear | vmapclear | xmapclear | smapclear | omapclear
|
||||
mapclear! | imapclear | lmapclear | cmapclear | tmapclear
|
||||
mapclear <buffer> | nmapclear <buffer> | vmapclear <buffer>
|
||||
xmapclear <buffer> | smapclear <buffer> | omapclear <buffer>
|
||||
mapclear! <buffer> | imapclear <buffer> | lmapclear <buffer>
|
||||
cmapclear <buffer> | tmapclear <buffer>
|
||||
endfunc
|
||||
|
||||
func s:AddMaps(new, accum)
|
||||
if len(a:new) > 0 && a:new[0] != "No mapping found"
|
||||
eval a:accum->extend(a:new)
|
||||
endif
|
||||
endfunc
|
||||
|
||||
call s:ClearMaps()
|
||||
call assert_equal(0, len(getmappings()))
|
||||
|
||||
" Set up some mappings.
|
||||
map dup bar
|
||||
map <buffer> dup bufbar
|
||||
map foo<C-V> is<F4>foo
|
||||
vnoremap <script> <buffer> <expr> <silent> bar isbar
|
||||
tmap baz foo
|
||||
omap h w
|
||||
lmap i w
|
||||
nmap j w
|
||||
xmap k w
|
||||
smap l w
|
||||
map abc <Nop>
|
||||
nmap <M-j> x
|
||||
nmap <M-Space> y
|
||||
|
||||
" Get a list of the mappings with the ':map' commands.
|
||||
" Check getmappings() return a list of the same size.
|
||||
call assert_equal(13, len(getmappings()))
|
||||
|
||||
" collect all the current maps using :map commands
|
||||
let maps_command = []
|
||||
call s:AddMaps(split(execute('map'), '\n'), maps_command)
|
||||
call s:AddMaps(split(execute('map!'), '\n'), maps_command)
|
||||
call s:AddMaps(split(execute('tmap'), '\n'), maps_command)
|
||||
call s:AddMaps(split(execute('lmap'), '\n'), maps_command)
|
||||
|
||||
" Use getmappings to get all the maps
|
||||
let maps_getmappings = getmappings()
|
||||
call assert_equal(len(maps_command), len(maps_getmappings))
|
||||
|
||||
" make sure all the mode-lhs are unique, no duplicates
|
||||
let map_set = {}
|
||||
for d in maps_getmappings
|
||||
let map_set[d.mode .. "-" .. d.lhs .. "-" .. d.buffer] = 0
|
||||
endfor
|
||||
call assert_equal(len(maps_getmappings), len(map_set))
|
||||
|
||||
" For everything returned by getmappings, should be the same as from maparg.
|
||||
" Except for "map dup", bacause maparg returns the <buffer> version
|
||||
for d in maps_getmappings
|
||||
if d.lhs == 'dup' && d.buffer == 0
|
||||
continue
|
||||
endif
|
||||
let d_maparg = maparg(d.lhs, d.mode, v:false, v:true)
|
||||
call assert_equal(d_maparg, d)
|
||||
endfor
|
||||
|
||||
call s:ClearMaps()
|
||||
call assert_equal(0, len(getmappings()))
|
||||
endfunc
|
||||
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
Loading…
Reference in New Issue
Block a user