Vim中的remap、noremap、nnoremap和vnoremap映射命令有什么区别?

Vim中的remapnoremapnnoremapvnoremap映射命令有什么区别?

287526 次浏览

remap是一个选项,它使映射递归工作。默认情况下,它是打开的,我建议你保持这种状态。其余的是映射命令,描述如下:

:map:noremap是各种映射命令的递归非递归版本。例如,如果我们运行:

:map j gg           (moves cursor to first line):map Q j            (moves cursor to first line):noremap W j        (moves cursor down one line)

然后:

  • j将映射到gg
  • Q映射到gg,因为j将扩展为递归映射。
  • W将映射到j(而不是gg),因为j不会为非递归映射展开。

现在记住Vim是模态编辑器。它有正常模式、视觉模式和其他模式。

对于这些映射集中的每一个,都有一个映射在正常、可视化、选择和运算符模式下工作(:map:noremap),一个在正常模式下工作(:nmap:nnoremap),一个在可视化模式下工作(:vmap:vnoremap)等等。

有关这方面的更多指导,请参阅:

:help :map:help :noremap:help recursive_mapping:help :map-modes

我认为Vim留档应该解释这些命令命名背后的含义。仅仅告诉你它们的作用并不能帮助你记住这些名字。

map是所有递归映射命令的“根”。根形式适用于“正常”、“视觉+选择”和“运算符挂起”模式。(我在语言学中使用术语“根”。)

noremap是所有非递归映射命令的“根”。根形式适用于与map相同的模式。(想想nore前缀表示“非递归”。)

(请注意,还有!模式,如map!,适用于插入和命令行。)

见下文“递归”在这种情况下的含义。

前面的模式字母(如n)修改映射工作的模式。它可以选择适用模式列表的子集(例如仅“视觉”),也可以选择map不适用的其他模式(例如“插入”)。

使用help map-modes将向您展示几个表,这些表解释了如何控制映射应用于哪些模式。

模式字母:

  • n:正常
  • v:视觉和选择
  • o:运算符挂起
  • x:仅视觉
  • s:仅选择
  • i:插入
  • c:命令行
  • l:插入、命令行、正则表达式搜索(和其他。统称为“Lang-Arg”伪模式)

递归”表示映射被扩展为一个结果,然后结果被扩展为另一个结果,依此类推。

当其中一个为true时,扩展会停止:

  1. 结果不再映射到其他任何东西。
  2. 已经应用了一个非递归映射(即“noremap”[或其同类之一]是最终的扩展)。

此时,Vim对最终结果的默认“含义”被应用/执行。

非递归”意味着映射只展开一次,并且结果被应用/执行。

示例:

 nmap K Hnnoremap H Gnnoremap G gg

上述原因导致K扩展到H,然后H扩展到G并停止。它因nnoremap而停止,nnoremap立即扩展并停止。G的含义将被执行(即“跳转到最后一行”)。在扩展链中最多应用一个非递归映射(这将是最后一次扩展)。

Ggg的映射仅适用于按G,但不适用于按K。无论G是否递归映射,此映射都不影响按K,因为是第2行导致K的扩展停止,因此不会使用第3行。

一个区别是:

  • :mapnvo==正常+(视觉+选择)+运算符挂起
  • :map!执行ic==插入+命令行模式

如表help map-modes所示。

所以:#0不映射到所有模式

要映射到所有模式,您需要:map:map!

我将简单地解释映射命令。

首先,我们有两个通用的映射命令:

  • map-在正常视觉选择运算符挂起模式下工作递归
  • map!-在插入命令行模式下工作递归

这些命令的非递归变体是:

  • noremap-在正常视觉选择运算符挂起模式下工作n递归
  • noremap!-在插入命令行模式下工作非递归

然后,我们有特定于模式的命令:

  • nmap-在正常模式下工作递归
  • imap-在插入模式下工作递归
  • vmap-在视觉选择模式下工作递归
  • xmap-在视觉模式下工作递归
  • smap-在选择模式下工作递归
  • cmap-在命令行模式下工作递归
  • omap-在运算符挂起模式下工作递归

以及它们的非递归变体:

  • nnoremap-在正常模式下工作非递归
  • inoremap-在插入模式下工作非递归
  • vnoremap-在视觉选择模式下工作非递归
  • xnoremap-在视觉模式下工作非递归