在 vim 中为地图指定多种模式的最佳方法是什么?
我知道nmap x y
在 中接收 x 会触发 y normal mode
,
imap x y
当处于 时,接收到 x 时触发 y insert mode
,依此类推。
假设我特别想要这两种模式。那么我就不能使用map x y
。
当进行多个映射时,仅仅写两行就会产生很多混乱。
答案1
从:h mapmode-n
:
有六组映射
- 对于普通模式:输入命令时。
- 对于可视模式:在可视区域突出显示时键入命令。
- 对于选择模式:类似于可视模式,但输入文本会取代选择。
- 对于操作符挂起模式:当操作符挂起时(在“d”、“y”、“c”等之后)。请参阅下文:|omap-info|。
- 用于插入模式。这些也可用于替换模式。
- 对于命令行模式:输入“:”或“/”命令时。
进行映射的方法有很多种。如果您:h map
,您将看到各种命令映射哪些模式:
:map {lhs} {rhs} |mapmode-nvo| *:map*
:nm[ap] {lhs} {rhs} |mapmode-n| *:nm* *:nmap*
:vm[ap] {lhs} {rhs} |mapmode-v| *:vm* *:vmap*
:xm[ap] {lhs} {rhs} |mapmode-x| *:xm* *:xmap*
:smap {lhs} {rhs} |mapmode-s| *:smap*
:om[ap] {lhs} {rhs} |mapmode-o| *:om* *:omap*
:map! {lhs} {rhs} |mapmode-ic| *:map!*
:im[ap] {lhs} {rhs} |mapmode-i| *:im* *:imap*
:lm[ap] {lhs} {rhs} |mapmode-l| *:lm* *:lmap*
:cm[ap] {lhs} {rhs} |mapmode-c| *:cm* *:cmap*
如你所见,:map
说mapmode-nvo
,代表正常、可视、操作员待定map x y
模式。这就是在正常模式下不起作用的原因。查看此列表,您会发现它们都没有mapmode-in
,因此没有一种方法可以做到这一点。因此,您需要执行nmap x y
和imap x y
。或者,如果您希望它适用于每种模式,则map x y
,和map! x y
。
当进行多个映射时,仅仅写两行就会产生很多混乱。
如果你确实要进行大量映射,你可以这样做:
function! DoubleMap(x, y)
exec "nmap ".x." ".y
exec "imap ".x." ".y
endfunction
然后
imap x y
nmap x y
imap foo bar
nmap foo bar
imap blah spam
nmap blah spam
成为
call DoubleMap('x', 'y')
call DoubleMap('foo', 'bar')
call DoubleMap('blah', 'spam')
但如果您的映射中有引号或者不可打印的字符,这将会很麻烦。