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

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

答案

remap是使映射递归工作的选项 。默认情况下它处于打开状态,我建议您采用这种方式。其余为映射命令 ,如下所述:

:map:noremap是各种映射命令的递归非递归版本。这意味着如果您这样做:

:map j gg
:map Q j
:noremap W j

j将映射到ggQ 将映射到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” 伪模式)

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

当满足以下条件之一时,扩展停止:

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

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

非递归 ” 表示映射仅扩展一次,并且结果被应用 / 执行。

例:

nmap K H
 nnoremap H G
 nnoremap G gg

以上导致K扩展为H ,然后H扩展为G并停止。由于nnoremap ,它停止并立即扩展并停止。将执行G的含义(即 “跳至最后一行”)。在扩展链中最多将应用一个非递归映射(这将是最后一次发生的扩展)。

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

一个区别是:

  • :map是否nvo == 正常 +(可视 + 选择)+ 运算符待处理
  • :map! ic == 插入 + 命令行模式吗

help map-modes表中所述。

因此: map不会映射到所有模式

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