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

时间:2010-09-23 07:13:31

标签: vim mapping command

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

4 个答案:

答案 0 :(得分:1449)

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

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

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

j将映射到gg。 {em}也将 映射到Q,因为gg将针对递归映射进行扩展。 j将映射到W(而不是j),因为gg不会针对非递归映射进行扩展。

现在请记住,Vim是一个模态编辑器。它具有正常模式,视觉模式和其他模式。

有关每个这些映射存在的,有一个mapping,在正常的,视觉的,选择和操作员模式的工作原理(j:map),一个在正常模式下工作(:noremap:nmap),一个处于可视模式(:nnoremap:vmap),依此类推。

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

:vnoremap

答案 1 :(得分:235)

我认为Vim文档应该解释这些命令命名背后的含义。告诉你他们做了什么并没有帮助你记住这些名字。

map是所有递归映射命令的“根”。根表单适用于“正常”,“视觉+选择”和“操作员待定”模式。 (我在linguistics中使用术语“root”。)

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

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

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

预先设置类似n的模式字母,修改映射的模式。它可以选择适用模式列表的子集(例如,仅“视觉”),或选择map的其他模式不适用于(例如“插入”)。

使用help map-modes将显示一些表格,说明如何控制映射适用的模式。

模式字母:

  • n:仅正常
  • v:视觉效果并选择
  • o:operator-pending
  • x:仅限视觉
  • s:仅选择
  • i:插入
  • c:命令行
  • l:insert,命令行,regexp-search(和其他人。统称为“Lang-Arg”伪模式)

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

当其中一个成立时,展开会停止:

  1. 结果不再映射到其他任何内容。
  2. 已应用非递归映射(即“noremap”[或其中一个]是最终扩展)。
  3. 此时,应用/执行Vim对最终结果的默认“含义”。

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

    示例:

     nmap K H
     nnoremap H G
     nnoremap G gg
    

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

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

答案 2 :(得分:73)

注意,vnoremapvmap在Visual AND Select模式下工作。 要仅在可视模式下进行映射,请使用xmapxnoremap

答案 3 :(得分:18)

一个区别是:

  • :map nvo ==普通+(视觉+选择)+操作员待定
  • :map!执行ic == insert + command-line mode

help map-modes表所述。

所以: map不会映射到所有模式

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