forked from aniani/vim
patch 8.2.4932: not easy to filter the output of maplist()
Problem: Not easy to filter the output of maplist(). Solution: Add mode_bits to the dictionary. (Ernie Rael, closes #10356)
This commit is contained in:
committed by
Bram Moolenaar
parent
0f267621c0
commit
d8f5f76621
@@ -5331,6 +5331,10 @@ maparg({name} [, {mode} [, {abbr} [, {dict}]]]) *maparg()*
|
|||||||
"nowait" Do not wait for other, longer mappings.
|
"nowait" Do not wait for other, longer mappings.
|
||||||
(|:map-<nowait>|).
|
(|:map-<nowait>|).
|
||||||
"abbr" True if this is an abbreviation |abbreviations|.
|
"abbr" True if this is an abbreviation |abbreviations|.
|
||||||
|
"mode_bits" Vim's internal binary representation of "mode".
|
||||||
|
|mapset()| ignores this; only "mode" is used.
|
||||||
|
See |maplist()| for usage examples. The values
|
||||||
|
are from src/vim.h and may change in the future.
|
||||||
|
|
||||||
The dictionary can be used to restore a mapping with
|
The dictionary can be used to restore a mapping with
|
||||||
|mapset()|.
|
|mapset()|.
|
||||||
@@ -5391,6 +5395,28 @@ maplist([{abbr}]) *maplist()*
|
|||||||
vim9script
|
vim9script
|
||||||
echo maplist()->filter(
|
echo maplist()->filter(
|
||||||
(_, m) => match(m.rhs, 'MultiMatch') >= 0)
|
(_, m) => match(m.rhs, 'MultiMatch') >= 0)
|
||||||
|
< It can be tricky to find mappings for particular |:map-modes|.
|
||||||
|
|mapping-dict|'s "mode_bits" can simplify this. For example,
|
||||||
|
the mode_bits for Normal, Insert or Command-line modes are
|
||||||
|
0x19. To find all the mappings available in those modes you
|
||||||
|
can do: >
|
||||||
|
vim9script
|
||||||
|
var saved_maps = []
|
||||||
|
for m in maplist()
|
||||||
|
if and(m.mode_bits, 0x19) != 0
|
||||||
|
saved_maps->add(m)
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
echo saved_maps->mapnew((_, m) => m.lhs)
|
||||||
|
< The values of the mode_bits are defined in Vim's src/vim.h
|
||||||
|
file and they can be discovered at runtime using
|
||||||
|
|:map-commands| and "maplist()". Example: >
|
||||||
|
vim9script
|
||||||
|
omap xyzzy <Nop>
|
||||||
|
var op_bit = maplist()->filter(
|
||||||
|
(_, m) => m.lhs == 'xyzzy')[0].mode_bits
|
||||||
|
ounmap xyzzy
|
||||||
|
echo printf("Operator-pending mode bit: 0x%x", op_bit)
|
||||||
|
|
||||||
|
|
||||||
mapnew({expr1}, {expr2}) *mapnew()*
|
mapnew({expr1}, {expr2}) *mapnew()*
|
||||||
|
@@ -2303,6 +2303,7 @@ mapblock2dict(
|
|||||||
dict_add_number(dict, "nowait", mp->m_nowait ? 1L : 0L);
|
dict_add_number(dict, "nowait", mp->m_nowait ? 1L : 0L);
|
||||||
dict_add_string(dict, "mode", mapmode);
|
dict_add_string(dict, "mode", mapmode);
|
||||||
dict_add_number(dict, "abbr", abbr ? 1L : 0L);
|
dict_add_number(dict, "abbr", abbr ? 1L : 0L);
|
||||||
|
dict_add_number(dict, "mode_bits", mp->m_mode);
|
||||||
|
|
||||||
vim_free(mapmode);
|
vim_free(mapmode);
|
||||||
}
|
}
|
||||||
|
@@ -19,13 +19,13 @@ func Test_maparg()
|
|||||||
\ 'lhsraw': "foo\x80\xfc\x04V", 'lhsrawalt': "foo\x16",
|
\ 'lhsraw': "foo\x80\xfc\x04V", 'lhsrawalt': "foo\x16",
|
||||||
\ 'mode': ' ', 'nowait': 0, 'expr': 0, 'sid': sid, 'scriptversion': 1,
|
\ 'mode': ' ', 'nowait': 0, 'expr': 0, 'sid': sid, 'scriptversion': 1,
|
||||||
\ 'lnum': lnum + 1,
|
\ 'lnum': lnum + 1,
|
||||||
\ 'rhs': 'is<F4>foo', 'buffer': 0, 'abbr': 0},
|
\ 'rhs': 'is<F4>foo', 'buffer': 0, 'abbr': 0, 'mode_bits': 0x47},
|
||||||
\ maparg('foo<C-V>', '', 0, 1))
|
\ maparg('foo<C-V>', '', 0, 1))
|
||||||
call assert_equal({'silent': 1, 'noremap': 1, 'script': 1, 'lhs': 'bar',
|
call assert_equal({'silent': 1, 'noremap': 1, 'script': 1, 'lhs': 'bar',
|
||||||
\ 'lhsraw': 'bar', 'mode': 'v',
|
\ 'lhsraw': 'bar', 'mode': 'v',
|
||||||
\ 'nowait': 0, 'expr': 1, 'sid': sid, 'scriptversion': 1,
|
\ 'nowait': 0, 'expr': 1, 'sid': sid, 'scriptversion': 1,
|
||||||
\ 'lnum': lnum + 2,
|
\ 'lnum': lnum + 2,
|
||||||
\ 'rhs': 'isbar', 'buffer': 1, 'abbr': 0},
|
\ 'rhs': 'isbar', 'buffer': 1, 'abbr': 0, 'mode_bits': 0x42},
|
||||||
\ 'bar'->maparg('', 0, 1))
|
\ 'bar'->maparg('', 0, 1))
|
||||||
let lnum = expand('<sflnum>')
|
let lnum = expand('<sflnum>')
|
||||||
map <buffer> <nowait> foo bar
|
map <buffer> <nowait> foo bar
|
||||||
@@ -33,7 +33,7 @@ func Test_maparg()
|
|||||||
\ 'lhsraw': 'foo', 'mode': ' ',
|
\ 'lhsraw': 'foo', 'mode': ' ',
|
||||||
\ 'nowait': 1, 'expr': 0, 'sid': sid, 'scriptversion': 1,
|
\ 'nowait': 1, 'expr': 0, 'sid': sid, 'scriptversion': 1,
|
||||||
\ 'lnum': lnum + 1, 'rhs': 'bar',
|
\ 'lnum': lnum + 1, 'rhs': 'bar',
|
||||||
\ 'buffer': 1, 'abbr': 0},
|
\ 'buffer': 1, 'abbr': 0, 'mode_bits': 0x47},
|
||||||
\ maparg('foo', '', 0, 1))
|
\ maparg('foo', '', 0, 1))
|
||||||
let lnum = expand('<sflnum>')
|
let lnum = expand('<sflnum>')
|
||||||
tmap baz foo
|
tmap baz foo
|
||||||
@@ -41,7 +41,7 @@ func Test_maparg()
|
|||||||
\ 'lhsraw': 'baz', 'mode': 't',
|
\ 'lhsraw': 'baz', 'mode': 't',
|
||||||
\ 'nowait': 0, 'expr': 0, 'sid': sid, 'scriptversion': 1,
|
\ 'nowait': 0, 'expr': 0, 'sid': sid, 'scriptversion': 1,
|
||||||
\ 'lnum': lnum + 1, 'rhs': 'foo',
|
\ 'lnum': lnum + 1, 'rhs': 'foo',
|
||||||
\ 'buffer': 0, 'abbr': 0},
|
\ 'buffer': 0, 'abbr': 0, 'mode_bits': 0x80},
|
||||||
\ maparg('baz', 't', 0, 1))
|
\ maparg('baz', 't', 0, 1))
|
||||||
let lnum = expand('<sflnum>')
|
let lnum = expand('<sflnum>')
|
||||||
iab A B
|
iab A B
|
||||||
@@ -49,7 +49,7 @@ func Test_maparg()
|
|||||||
\ 'lhsraw': 'A', 'mode': 'i',
|
\ 'lhsraw': 'A', 'mode': 'i',
|
||||||
\ 'nowait': 0, 'expr': 0, 'sid': sid, 'scriptversion': 1,
|
\ 'nowait': 0, 'expr': 0, 'sid': sid, 'scriptversion': 1,
|
||||||
\ 'lnum': lnum + 1, 'rhs': 'B',
|
\ 'lnum': lnum + 1, 'rhs': 'B',
|
||||||
\ 'buffer': 0, 'abbr': 1},
|
\ 'buffer': 0, 'abbr': 1, 'mode_bits': 0x0010},
|
||||||
\ maparg('A', 'i', 1, 1))
|
\ maparg('A', 'i', 1, 1))
|
||||||
iuna A
|
iuna A
|
||||||
|
|
||||||
|
@@ -2464,7 +2464,8 @@ def Test_maparg()
|
|||||||
scriptversion: 999999,
|
scriptversion: 999999,
|
||||||
rhs: 'bar',
|
rhs: 'bar',
|
||||||
buffer: 0,
|
buffer: 0,
|
||||||
abbr: 0})
|
abbr: 0,
|
||||||
|
mode_bits: 0x47})
|
||||||
unmap foo
|
unmap foo
|
||||||
v9.CheckDefAndScriptFailure(['maparg(1)'], ['E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1'])
|
v9.CheckDefAndScriptFailure(['maparg(1)'], ['E1013: Argument 1: type mismatch, expected string but got number', 'E1174: String required for argument 1'])
|
||||||
v9.CheckDefAndScriptFailure(['maparg("a", 2)'], ['E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2'])
|
v9.CheckDefAndScriptFailure(['maparg("a", 2)'], ['E1013: Argument 2: type mismatch, expected string but got number', 'E1174: String required for argument 2'])
|
||||||
|
@@ -746,6 +746,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 */
|
||||||
|
/**/
|
||||||
|
4932,
|
||||||
/**/
|
/**/
|
||||||
4931,
|
4931,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user