Vim中的remap、noremap、nnoremap和vnoremap映射命令有什么区别?
remap
noremap
nnoremap
vnoremap
remap是一个选项,它使映射递归工作。默认情况下,它是打开的,我建议你保持这种状态。其余的是映射命令,描述如下:
:map和:noremap是各种映射命令的递归和非递归版本。例如,如果我们运行:
: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
W
现在记住Vim是模态编辑器。它有正常模式、视觉模式和其他模式。
对于这些映射集中的每一个,都有一个映射在正常、可视化、选择和运算符模式下工作(:map和:noremap),一个在正常模式下工作(:nmap和:nnoremap),一个在可视化模式下工作(:vmap和:vnoremap)等等。
:nmap
:nnoremap
:vmap
:vnoremap
有关这方面的更多指导,请参阅:
:help :map:help :noremap:help recursive_mapping:help :map-modes
我认为Vim留档应该解释这些命令命名背后的含义。仅仅告诉你它们的作用并不能帮助你记住这些名字。
map是所有递归映射命令的“根”。根形式适用于“正常”、“视觉+选择”和“运算符挂起”模式。(我在语言学中使用术语“根”。)
map
noremap是所有非递归映射命令的“根”。根形式适用于与map相同的模式。(想想nore前缀表示“非递归”。)
nore
(请注意,还有!模式,如map!,适用于插入和命令行。)
!
map!
见下文“递归”在这种情况下的含义。
前面的模式字母(如n)修改映射工作的模式。它可以选择适用模式列表的子集(例如仅“视觉”),也可以选择map不适用的其他模式(例如“插入”)。
n
使用help map-modes将向您展示几个表,这些表解释了如何控制映射应用于哪些模式。
help map-modes
模式字母:
v
o
x
s
i
c
l
“递归”表示映射被扩展为一个结果,然后结果被扩展为另一个结果,依此类推。
当其中一个为true时,扩展会停止:
此时,Vim对最终结果的默认“含义”被应用/执行。
“非递归”意味着映射只展开一次,并且结果被应用/执行。
示例:
nmap K Hnnoremap H Gnnoremap G gg
上述原因导致K扩展到H,然后H扩展到G并停止。它因nnoremap而停止,nnoremap立即扩展并停止。G的含义将被执行(即“跳转到最后一行”)。在扩展链中最多应用一个非递归映射(这将是最后一次扩展)。
K
H
G
G到gg的映射仅适用于按G,但不适用于按K。无论G是否递归映射,此映射都不影响按K,因为是第2行导致K的扩展停止,因此不会使用第3行。
一个区别是:
nvo
:map!
ic
如表help map-modes所示。
所以:#0不映射到所有模式。
要映射到所有模式,您需要:map和:map!。
我将简单地解释映射命令。
首先,我们有两个通用的映射命令:
这些命令的非递归变体是:
noremap!
然后,我们有特定于模式的命令:
nmap
imap
vmap
xmap
smap
cmap
omap
以及它们的非递归变体:
inoremap
xnoremap