协慌网

登录 贡献 社区

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是所有递归映射命令的 “根”。根表单适用于 “正常”,“视觉 + 选择” 和“操作员待定” 模式。 (我在语言学中使用术语 “root”。)

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

(注意,还有像map!这样的!模式适用于插入和命令行。)

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

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

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

模式字母:

  • n :仅正常
  • v :视觉和选择
  • o :运营商待定
  • x :仅视觉
  • s :仅选择
  • i :插入
  • c :命令行
  • l :insert,命令行,regexp-search(以及其他。集体称为 “Lang-Arg” 伪模式)

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

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

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

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

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

例:

nmap K H
 nnoremap H G
 nnoremap G gg

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

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

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