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
。