vim中的remap,noremap,nnoremap和vnoremap映射命令之间有什么区别?
vim中的remap,noremap,nnoremap和vnoremap映射命令之间有什么区别?
remap
是一种使映射以recursion方式工作的选项 。 默认情况下它是开着的,我build议你这样离开。 其余的是映射命令 ,如下所述:
:map
和:noremap
是各种映射命令的recursion和非recursion版本。 这意味着如果你这样做:
:map j gg :map Q j :noremap W j
j
将被映射到gg
。 Q
也将被映射到gg
,因为j
将被recursion映射扩展。 W
将被映射到j
(而不是gg
),因为j
不会被非recursion映射扩展。
现在请记住,Vim是一个模式编辑器 。 它有一个正常模式, 可视模式和其他模式。
对于这些映射集合中的每一个,都有一个在普通模式,可视模式,select模式和运算符模式下工作的映射 ( :map
和:noremap
),在正常模式下工作的:map
( :nmap
和:nnoremap
) :vmap
和:vnoremap
)等等。
有关这方面的更多指导,请参阅:
:help :map :help :noremap :help recursive_mapping :help :map-modes
我认为vim文档应该解释这些命令的命名背后的含义。 只要告诉你他们做了什么,不会帮助你记住名字。
map
是所有recursion映射命令的“根”。 根表格适用于“正常”,“视觉+select”和“操作员未决”模式。
noremap
是所有非recursion映射命令的“根”。 根表格适用于与map
相同的模式。
(请注意,也有!
模式,如map!
适用于插入和命令行。)
请参阅下面的“recursion”在这种情况下意味着什么。
像n
这样的模式字母可以修改映射工作的模式。它可以select适用模式列表的一个子集(例如,只有“可视化”),或者select其他map
不适用的模式(例如“插入”) 。
使用help map-modes
将向您显示一些表格,解释如何控制映射适用的模式。
模式字母:
-
n
:只有正常 -
v
:视觉和select -
o
:运营商正在等待 -
x
:仅可视 -
s
:只select -
i
:插入 -
c
:命令行 -
l
:insert,command-line,regexp-search(及其他,统称为“Lang-Arg”伪模式)
“ recursion ”意味着映射被扩展为结果,然后结果被扩展为另一个结果,依此类推。
当其中一个是正确的时,扩展停止:
- 结果不再映射到其他任何东西。
- 已经应用了一个非recursion映射(即“noremap”[或者其中之一]是最终的扩展)。
在这一点上,vim的最终结果的默认“含义”被应用/执行。
“ 非recursion ”意味着映射只扩展一次,并且结果被应用/执行。
例:
nmap KH nnoremap HG nnoremap G gg
上面的原因导致K
扩展到H
,然后H
扩展到G
并停止。 它停止,因为nnoremap
,它立即扩大和停止。 G
的含义将被执行(即“跳到最后一行”)。 在一个扩展链中至多会有一个非recursion映射被应用(这将是最后一个扩展)。
G
到gg
的映射仅适用于按G
键,但如果按K
键则不适用。 这个映射不影响按下K
,不pipeG
是否被recursion映射,因为第2行导致K
的扩展停止,所以不会使用第3行。
注意, vnoremap
和vmap
在Visual和Select模式下工作。 要仅在可视模式下进行映射,请使用xmap
和xnoremap
。
一个区别是:
-
:map
做nvo
==普通+(视觉+select)+运营商挂起 -
:map!
做ic
==插入+命令行模式
如help map-modes
表中所述。
所以: map
不会映射到所有模式 。
要映射到您需要的所有模式:map
和:map!
。