Vim中的remap、noremap、nnoremap和vnoremap映射命令有什么区别?
重映射是一种使映射递归地工作的选项。默认情况下,它是打开的,我建议你保持这种状态。其余的是映射命令,如下所示:
: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是所有递归映射命令的“根”。根表单适用于“normal”、“visual+select”和“operator-pending”模式。(我使用的术语“根”是语言学中的。)
Noremap是所有非递归映射命令的“根”。根形式适用于与map相同的模式。(想想nore前缀表示“非递归”。)
(注意还有!模式像地图!应用于insert &命令行。)
请参阅下面的“递归”在此上下文中的含义。
在前面加上一个像n这样的模式字母可以修改映射工作的模式。它可以选择适用模式列表的子集(例如仅“可视”),或者选择map不适用的其他模式(例如。“插入”)。
使用帮助map-modes将向您展示几个表,解释如何控制映射应用的模式。
模式字母:
N:仅限正常 V:视觉和选择 o: operator-pending X:仅限视觉 S:只选择 我:插入 c:命令行 L: insert,命令行,regexp-search(和其他。统称为“Lang-Arg”伪模式)
“递归”意味着将映射扩展为一个结果,然后将结果扩展为另一个结果,依此类推。
当满足下列条件之一时,膨胀停止:
结果不再映射到任何其他东西。 应用了一个非递归映射(即“noremap”[或其同类之一]是最终展开)。
此时,应用/执行最终结果的Vim默认“含义”。
“非递归”意味着映射只展开一次,该结果将被应用/执行。
例子:
nmap K H
nnoremap H G
nnoremap G gg
上述过程导致K膨胀为H,然后H膨胀为G并停止。它因为nnoremap而停止,nnoremap会立即扩展并停止。G的含义将被执行(即。“跳到最后一行”)。在一个扩展链中最多只能应用一个非递归映射(这将是最后一个发生的扩展)。
G到gg的映射只适用于按G,但不适用于按K。无论G是否递归映射,这个映射都不会影响按K,因为导致K扩展停止的是第2行,所以第3行不会被使用。
其中一个区别是:
:map does nvo == normal + (visual + select) +操作符pending :地图!IC == insert +命令行模式
如帮助地图模式表所述。
map不会映射到所有模式。
要映射到所有模式,你需要:map和:map!
我将简单地解释映射命令。
首先,我们有两个通用映射命令:
Map -在正常、可视、选择和操作符挂起模式下递归地工作。 地图!-在插入和命令行模式下递归工作。
这些命令的非递归变体是:
Noremap -在正常、可视、选择和操作符挂起模式下非递归地工作。 noremap !-在插入和命令行模式下非递归地工作。
然后,我们有特定于模式的命令:
Nmap -在普通模式下递归地工作。 Imap在插入模式下递归地工作。 Vmap -在可视和选择模式下递归地工作。 Xmap—以可视化模式递归地工作。 Smap -在选择模式下递归地工作。 Cmap -在命令行模式下递归地工作。 Omap—以运算符挂起模式递归地工作。
以及它们的非递归变体:
Nnoremap -在正常模式下非递归地工作。 Inoremap -在插入模式下非递归地工作。 Vnoremap -在可视和选择模式下以非递归方式工作。 Xnoremap—在可视化模式下以非递归方式工作。 Snoremap -在选择模式下非递归地工作。 Cnoremap—在命令行模式下以非递归方式工作。 Onoremap -在操作符挂起模式下非递归地工作。
最后,remap是一个布尔选项,允许映射递归地工作。值得一提的是,您应该始终保持该选项为默认开启。