Vimのremap、noremap、nnoremap、vnoremapマッピングコマンドの違いは何ですか?
remap
は、マッピングを再帰的に機能させるoptionです。デフォルトではオンになっているので、そのままにしておくことをお勧めします。残りはmappingコマンドで、以下で説明します:
:map
および:noremap
はrecursiveおよびnon-recursiveさまざまなマッピングコマンドのバージョン。それが意味することは、あなたがするなら:
:map j gg
:map Q j
:noremap W j
j
はgg
にマップされます。 Q
は再帰マッピング用に展開されるため、gg
はalsoもj
にマッピングされます。 W
はj
にマップされます(gg
にマップされません)。これは、j
が非再帰的マッピング用に展開されないためです。
Vimはモーダルエディターであることを思い出してください。 normalモード、visualモード、その他のモードがあります。
これらのマッピングセットごとに、通常モード、視覚モード、選択モード、および演算子モード(:map
および:noremap
)で動作する マッピング があり、通常モードで動作します(:nmap
および:nnoremap
)、ビジュアルモード(:vmap
および:vnoremap
)など。
これに関する詳細なガイダンスについては、以下を参照してください。
:help :map
:help :noremap
:help recursive_mapping
:help :map-modes
私はVimのドキュメントがこれらのコマンドの命名の背後にある意味を説明しているべきだと思います。何をしているのかを言っても、名前を覚えるのには役立ちません。
map
name__は、すべての再帰的マッピングコマンドの「ルート」です。ルートフォームは、 "通常"、 "ビジュアル+選択"、および "オペレータ保留"モードに適用されます。 (私は 言語学 のように "root"という用語を使っています。)
noremap
name__は、すべての非再帰的マッピングコマンドの「ルート」です。ルート形式はmap
name__と同じモードに適用されます。 (nore
name__接頭辞は「非再帰的」を意味すると考えてください。)
(insert&command-lineに適用される!
のようなmap!
モードもあることに注意してください。)
この文脈で「再帰的」とはどういう意味ですか。
n
name__のようなモード文字を前に付けると、マッピングが機能するモードを変更できます。適用可能なモードのリストのサブセットを選択すること(例: "visual"のみ)、またはmap
name__を適用しない他のモード(例: "insert")を選択できます。 。
help map-modes
を使用すると、マッピングがどのモードに適用されるかを制御する方法を説明するいくつかの表が表示されます。
モードレター:
n
name__:通常のみv
name__:ビジュアルと選択o
name__:オペレーター保留x
name__:ビジュアルのみs
name__:選択のみi
name__:insertc
name__:コマンドラインl
name__:insert、command-line、regexp-search(およびその他。まとめて "Lang-Arg"疑似モードと呼ばれます)" 再帰 "は、マッピングが結果に展開され、次にその結果が別の結果に展開されることを意味します。
次のいずれかが当てはまると、展開は停止します。
その時点で、最終結果のVimのデフォルトの「意味」が適用/実行されます。
" 非再帰的 "は、マッピングが一度だけ展開され、その結果が適用/実行されることを意味します。
例:
nmap K H
nnoremap H G
nnoremap G gg
上記により、K
name__はH
name__に展開され、次にH
name__はG
name__に展開されて停止します。すぐに展開して停止するnnoremap
name__が原因で停止します。 G
name__の意味が実行されます(つまり、「最後の行にジャンプ」)。多くても1つの非再帰的マッピングが展開チェーンに適用されます(それが最後に行われる展開になります)。
G
name__からgg
name__へのマッピングは、G
name__を押した場合にのみ適用されますが、K
name__を押した場合には適用されません。 K
name__が再帰的にマッピングされていてもいなくても、このマッピングはG
name__の押下には影響しません。K
name__の展開を停止するのは2行目なので、3行目は使用されないからです。
注意、vnoremap
およびvmap
は、ビジュアルAND選択モードで機能します。ビジュアルモードでのみマッピングするには、xmap
とxnoremap
を使用します。
一つの違いは、
:map
はnvo
== normal +(visual + select)+ operator pending:map!
はic
== insert +コマンドラインモードを行いますhelp map-modes
テーブルに記載されているように。
だから:map
はすべてのモードに対応するわけではない 。
すべてのモードにマップするには、:map
と:map!
の両方が必要です。