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

What is the difference between the remap, noremap, nnoremap and vnoremap mapping commands in Vim?

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


remap是一个选项,可以使映射递归工作。默认情况下,它是打开的,我建议您不要这样做。其余是映射命令,如下所述:

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

1
2
3
:map j gg
:map Q j
:noremap W j

j将映射到ggQ也将被映射到gg,因为j将被扩展用于递归映射。W将映射到j(而不是gg),因为j不会扩展到非递归映射。

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

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

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

1
2
3
4
: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:插入、命令行、regexp搜索(及其他。统称为"lang arg"伪模式)

"递归"是指将映射扩展到一个结果,然后将结果扩展到另一个结果,依此类推。

如果其中一个为真,则扩展将停止:

  • 结果不再映射到任何其他内容。
  • 已应用非递归映射(即"noremap"[或其ILK之一]是最终的扩展)。
  • 此时,应用/执行VIM对最终结果的默认"含义"。

    "非递归"是指映射只扩展一次,并应用/执行该结果。

    例子:

    1
    2
    3
     nmap K H
     nnoremap H G
     nnoremap G gg

    以上原因导致K扩大到H,然后H扩大到G并停止。它停止是因为nnoremap膨胀并立即停止。将执行G的含义(即"跳到最后一行")。在扩展链中最多只能应用一个非递归映射(这将是最后一次进行扩展)。

    Ggg的映射只适用于按G的情况,而不适用于按K的情况。这种映射不影响按K,不管G是否递归映射,因为第2行导致K的扩展停止,所以第3行不会被使用。


    注意,vnoremapvmap在视觉和选择模式下工作。要只在可视模式下进行映射,请使用xmapxnoremap


    一个区别是:

    • :map是否执行nvo==normal+(visual+select)+operator pending
    • :map!ic==insert+命令行模式

    help map-modes表所述。

    所以:map并没有映射到所有模式。

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