Vim中的remap,noremap,nnoremap和vnoremap映射命令有什么区别?
#1楼
我认为Vim文档应该解释这些命令命名背后的含义。 告诉你他们做了什么并不能帮助你记住这些名字。
map
是所有递归映射命令的“根”。 根表单适用于“正常”,“视觉+选择”和“操作员待定”模式。 (我在语言学中使用术语“root”。)
noremap
是所有非递归映射命令的“根”。 根表单适用于与
map
相同的模式。 (把
nore
前缀想象成“非递归”。)
(注意,还有像
map!
这样的
!
模式适用于插入和命令行。)
请参阅下文,了解“递归”在此上下文中的含义。
预先设置类似
n
的模式字母,修改映射所适用的模式。它可以选择适用模式列表的子集(例如,仅“视觉”),或选择
map
不适用的其他模式(例如“插入”) 。
使用
help map-modes
将显示一些表,说明如何控制映射适用的模式。
模式字母:
-
:仅正常n
-
:视觉和选择v
-
:运营商待定o
-
:仅视觉x
-
:仅选择s
-
:插入i
-
:命令行c
-
:insert,命令行,regexp-search(以及其他。集体称为“Lang-Arg”伪模式)l
“ 递归 ”表示将映射扩展为结果,然后将结果扩展为另一个结果,依此类推。
当其中一个成立时,扩展停止:
- 结果不再映射到其他任何内容。
- 已经应用了非递归映射(即“noremap”[或其中一个]是最终扩展)。
此时,应用/执行Vim对最终结果的默认“含义”。
“ 非递归 ”表示映射仅展开一次,并且应用/执行该结果。
例:
nmap K H
nnoremap H G
nnoremap G gg
以上原因使
K
扩展为
H
,然后
H
扩展为
G
并停止。 它因
nnoremap
而停止,
nnoremap
会立即扩展和停止。 将执行
G
的含义(即“跳到最后一行”)。 最多只有一个非递归映射将应用于扩展链(这将是最后一次扩展)。
G
到
gg
的映射仅适用于按
G
,但如果按
K
则不适用。 无论
G
是否以递归方式映射,此映射都不会影响按
K
,因为它的第2行会导致
K
的扩展停止,因此不会使用第3行。
#2楼
一个区别是:
-
确定:map
== normal +(visual + select)+ operator pendingnvo
-
:map!
== insert +命令行模式ic
如
help map-modes
表所述。
所以:
map
不会映射到所有模式 。
要映射到所有模式,您需要
:map
和
:map!
。
#3楼
remap
是一个使映射以递归方式工作的选项 。 默认情况下它已打开,我建议你保持这种状态。 其余的是映射命令 ,如下所述:
:map
和
:noremap
是各种映射命令的递归和非递归版本。 这意味着,如果你这样做:
: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
)等等。
有关此问题的更多指导,请参阅:
:help :map
:help :noremap
:help recursive_mapping
:help :map-modes
#4楼
注意,
vnoremap
和
vmap
在Visual AND Select模式下工作。 要仅在可视模式下进行映射,请使用
xmap
和
xnoremap
。