web-dev-qa-db-ja.com

Vimのremap、noremap、nnoremap、vnoremapマッピングコマンドの違いは何ですか?

Vimのremap、noremap、nnoremap、vnoremapマッピングコマンドの違いは何ですか?

993
Chetan

remapは、マッピングを再帰的に機能させるoptionです。デフォルトではオンになっているので、そのままにしておくことをお勧めします。残りはmappingコマンドで、以下で説明します:

:mapおよび:noremaprecursiveおよびnon-recursiveさまざまなマッピングコマンドのバージョン。それが意味することは、あなたがするなら:

:map j gg
:map Q j
:noremap W j

jggにマップされます。 Qは再帰マッピング用に展開されるため、ggalsojにマッピングされます。 Wjにマップされます(ggにマップされません)。これは、jが非再帰的マッピング用に展開されないためです。

Vimはモーダルエディターであることを思い出してください。 normalモード、visualモード、その他のモードがあります。

これらのマッピングセットごとに、通常モード、視覚モード、選択モード、および演算子モード(:mapおよび:noremap)で動作する マッピング があり、通常モードで動作します(:nmapおよび:nnoremap)、ビジュアルモード(:vmapおよび:vnoremap)など。

これに関する詳細なガイダンスについては、以下を参照してください。

:help :map
:help :noremap
:help recursive_mapping
:help :map-modes
1479
DrAl

私はVimのドキュメントがこれらのコマンドの命名の背後にある意味を説明しているべきだと思います。何をしているのかを言っても、名前を覚えるのには役立ちません。

mapname__は、すべての再帰的マッピングコマンドの「ルート」です。ルートフォームは、 "通常"、 "ビジュアル+選択"、および "オペレータ保留"モードに適用されます。 (私は 言語学 のように "root"という用語を使っています。)

noremapname__は、すべての非再帰的マッピングコマンドの「ルート」です。ルート形式はmapname__と同じモードに適用されます。 (norename__接頭辞は「非再帰的」を意味すると考えてください。)

(insert&command-lineに適用される!のようなmap!モードもあることに注意してください。)

この文脈で「再帰的」とはどういう意味ですか。

nname__のようなモード文字を前に付けると、マッピングが機能するモードを変更できます。適用可能なモードのリストのサブセットを選択すること(例: "visual"のみ)、またはmapname__を適用しない他のモード(例: "insert")を選択できます。 。

help map-modesを使用すると、マッピングがどのモードに適用されるかを制御する方法を説明するいくつかの表が表示されます。

モードレター:

  • nname__:通常のみ
  • vname__:ビジュアルと選択
  • oname__:オペレーター保留
  • xname__:ビジュアルのみ
  • sname__:選択のみ
  • iname__:insert
  • cname__:コマンドライン
  • lname__:insert、command-line、regexp-search(およびその他。まとめて "Lang-Arg"疑似モードと呼ばれます)

" 再帰 "は、マッピングが結果に展開され、次にその結果が別の結果に展開されることを意味します。

次のいずれかが当てはまると、展開は停止します。

  1. 結果は他のものにマップされなくなりました。
  2. 非再帰的マッピングが適用されています(すなわち、 "noremap" [またはそのilkの1つ]が最終展開です)。

その時点で、最終結果のVimのデフォルトの「意味」が適用/実行されます。

" 非再帰的 "は、マッピングが一度だけ展開され、その結果が適用/実行されることを意味します。

例:

 nmap K H
 nnoremap H G
 nnoremap G gg

上記により、Kname__はHname__に展開され、次にHname__はGname__に展開されて停止します。すぐに展開して停止するnnoremapname__が原因で停止します。 Gname__の意味が実行されます(つまり、「最後の行にジャンプ」)。多くても1つの非再帰的マッピングが展開チェーンに適用されます(それが最後に行われる展開になります)。

Gname__からggname__へのマッピングは、Gname__を押した場合にのみ適用されますが、Kname__を押した場合には適用されません。 Kname__が再帰的にマッピングされていてもいなくても、このマッピングはGname__の押下には影響しません。Kname__の展開を停止するのは2行目なので、3行目は使用されないからです。

232
Kelvin

注意、vnoremapおよびvmapは、ビジュアルAND選択モードで機能します。ビジュアルモードでのみマッピングするには、xmapxnoremapを使用します。

73
Benoit

一つの違いは、

  • :mapnvo == normal +(visual + select)+ operator pending
  • :map!ic == insert +コマンドラインモードを行います

help map-modesテーブルに記載されているように。

だから:mapはすべてのモードに対応するわけではない

すべてのモードにマップするには、:map:map!の両方が必要です。