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


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

: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是所有递归映射命令的“根”。根表单适用于“normal”、“visual+select”和“operator-pending”模式。(我使用的术语“根”是语言学中的。)

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

(注意还有!模式像地图!应用于insert &命令行。)

请参阅下面的“递归”在此上下文中的含义。

在前面加上一个像n这样的模式字母可以修改映射工作的模式。它可以选择适用模式列表的子集(例如仅“可视”),或者选择map不适用的其他模式(例如。“插入”)。

使用帮助map-modes将向您展示几个表,解释如何控制映射应用的模式。

模式字母:

N:仅限正常 V:视觉和选择 o: operator-pending X:仅限视觉 S:只选择 我:插入 c:命令行 L: insert,命令行,regexp-search(和其他。统称为“Lang-Arg”伪模式)

“递归”意味着将映射扩展为一个结果,然后将结果扩展为另一个结果,依此类推。

当满足下列条件之一时,膨胀停止:

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

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

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

例子:

 nmap K H
 nnoremap H G
 nnoremap G gg

上述过程导致K膨胀为H,然后H膨胀为G并停止。它因为nnoremap而停止,nnoremap会立即扩展并停止。G的含义将被执行(即。“跳到最后一行”)。在一个扩展链中最多只能应用一个非递归映射(这将是最后一个发生的扩展)。

G到gg的映射只适用于按G,但不适用于按K。无论G是否递归映射,这个映射都不会影响按K,因为导致K扩展停止的是第2行,所以第3行不会被使用。


其中一个区别是:

:map does nvo == normal + (visual + select) +操作符pending :地图!IC == insert +命令行模式

如帮助地图模式表所述。

map不会映射到所有模式。

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


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

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

Map -在正常、可视、选择和操作符挂起模式下递归地工作。 地图!-在插入和命令行模式下递归工作。

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

Noremap -在正常、可视、选择和操作符挂起模式下非递归地工作。 noremap !-在插入和命令行模式下非递归地工作。

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

Nmap -在普通模式下递归地工作。 Imap在插入模式下递归地工作。 Vmap -在可视和选择模式下递归地工作。 Xmap—以可视化模式递归地工作。 Smap -在选择模式下递归地工作。 Cmap -在命令行模式下递归地工作。 Omap—以运算符挂起模式递归地工作。

以及它们的非递归变体:

Nnoremap -在正常模式下非递归地工作。 Inoremap -在插入模式下非递归地工作。 Vnoremap -在可视和选择模式下以非递归方式工作。 Xnoremap—在可视化模式下以非递归方式工作。 Snoremap -在选择模式下非递归地工作。 Cnoremap—在命令行模式下以非递归方式工作。 Onoremap -在操作符挂起模式下非递归地工作。

最后,remap是一个布尔选项,允许映射递归地工作。值得一提的是,您应该始终保持该选项为默认开启。