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将映射到gg。Q也将被映射到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的这些文档是如此清晰!-)
- 这应该在VIM帮助文件的顶部
- 我假设noremap与map相反。我指的是删除映射的东西。谢谢你的回答。它澄清了我
- nore代表[no] [re]map吗?
- @基本上,是的。这意味着"即使启用了remap,也不要使用它。"
- 对于大多数用例来说,这并不重要,但应该注意的是,:map等并不适用于所有模式,确切地说,仅适用于所有常见模式(特别是正常模式、视觉模式、选择模式和操作员挂起模式)。如果希望映射在insert、命令行或lang arg模式下工作,则需要使用:map!等(来源:vimdoc.sourceforge.net/htmldoc/map.html map overview)
- @whytheq noremap=非递归映射
- 如果我使用noremap j gg,那么map Q j是按q来呼叫gg吗?我知道相反的情况不会。
- @阿什温南佳帕绝对!我发现维姆内部的帮助大多数时候都很难理解!+这是一个很好的问题,可惜没有人回答你!我想是Q真的会叫gg。我认为这只会停止把j递归到gg以外的任何东西。但它可能会影响"继承(?)"地图?我真的不知道,也希望有人能对这一点有所了解;我甚至还不完全了解递归映射和非递归映射的目的是什么!编辑:您的问题似乎是在下面的答案中回答的。简短回答:Q将呼叫GG。
- 我想我已经知道了,你基本上可以使用递归和非递归来绑定和取消绑定键映射,我想(这就是你如何引用键的正常函数)。
- 伟大的回答!谢谢您。在我读了这篇文章之后,我潜入到文档中,最后找到了一个参考文献。如果我不知道这是"递归映射",我永远也找不到它。:help recursive_mapping
我认为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的含义(即"跳到最后一行")。在扩展链中最多只能应用一个非递归映射(这将是最后一次进行扩展)。
G到gg的映射只适用于按G的情况,而不适用于按K的情况。这种映射不影响按K,不管G是否递归映射,因为第2行导致K的扩展停止,所以第3行不会被使用。
- 有一点:map只适用于正常、可视、选择和操作员挂起模式,而不适用于所有模式。
注意,vnoremap和vmap在视觉和选择模式下工作。要只在可视模式下进行映射,请使用xmap和xnoremap。
- 我认为这应该是一个评论。
- 也许吧,但它更容易被看作是一个答案,我认为这是一个非常有用的信息。
一个区别是:
- :map是否执行nvo==normal+(visual+select)+operator pending
- :map!做ic==insert+命令行模式
如help map-modes表所述。
所以:map并没有映射到所有模式。
要映射到所有模式,您需要:map和:map!。
- 这应该是一个评论。
- 小心!!command mode是normal mode的另一个历史名称,即。第5章vimdoc.sourceforge.net/htmldoc/intro.html vim模式简介)。缩写"c"表示"命令行"。换句话说,默认情况下:对于插入+命令行模式,map! lhs rhs递归地将lhs映射到rhs。这是除非在~/.vimrc中明确禁用了remap默认选项。在这种情况下,映射不会是递归的(不可取)。
- @谢谢,固定到命令行