vim 多个特定映射

vim 多个特定映射

在 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*

如你所见,:mapmapmode-nvo,代表正常、可视、操作员待定map x y模式。这就是在正常模式下不起作用的原因。查看此列表,您会发现它们都没有mapmode-in,因此没有一种方法可以做到这一点。因此,您需要执行nmap x yimap 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')

但如果您的映射中有引号或者不可打印的字符,这将会很麻烦。

相关内容