繁体   English   中英

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

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

Vim 中的remapnoremapnnoremapvnoremap映射命令有什么区别?

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

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

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

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

请参阅下文,了解在这种情况下“递归”的含义。

前面的模式字母n修改映射工作的模式。它可以选择适用模式列表的子集(例如仅“视觉”),或选择map不适用的其他模式(例如“插入”) .

Use 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 行。

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

一个区别是:

  • :mapnvo == normal + (visual + select) + operator pending
  • :map! ic == 插入 + 命令行模式

help map-modes表所述。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM