天天看點

Vim中的remap,noremap,nnoremap和vnoremap映射指令有什麼差別?

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

    :指令行
  • l

    :insert,指令行,regexp-search(以及其他。集體稱為“Lang-Arg”僞模式)

“ 遞歸 ”表示将映射擴充為結果,然後将結果擴充為另一個結果,依此類推。

當其中一個成立時,擴充停止:

  1. 結果不再映射到其他任何内容。
  2. 已經應用了非遞歸映射(即“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

    确定

    nvo

    == normal +(visual + select)+ operator pending
  • :map!

    ic

    == insert +指令行模式

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