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


1113

違いは何ですかremapnoremapnnoremapvnoremapのVimでマッピングコマンドは?


1
注意、vnoremapおよびvmapビジュアルモードとセレクトモードでの作業。ビジュアルモードでのみマッピングするには、xmapおよびを使用しxnoremapます。
ブノワ

回答:


1627

remapあるオプションのマッピングは再帰的に動作します。デフォルトではオンになっているので、そのままにしておくことをお勧めします。残りは、以下で説明するマッピングコマンドです。

:mapそして、:noremapされている再帰非再帰的な様々なマッピングのコマンドのバージョン。つまり、次のことを行うと、

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

jにマッピングされggます。Qは再帰マッピングのために展開されるため、にマッピングされます。は非再帰的マッピング用に展開されないため、にはマッピングされます(にはマッピングされません)。ggjWjggj

Vimはモーダルエディターであることを思い出してください。それは持っているノーマルモード、ビジュアル・モードと他のモードを。

マッピングのこれらのセットの各々について、あるマッピングビジュアル正常で動作し、選択し、オペレータモード(すなわち:map:noremap)、通常モード(で動作するもの:nmap:nnoremap)、ビジュアルモードで1(:vmap及び:vnoremap)などが。

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

:help :map
:help :noremap
:help recursive_mapping
:help :map-modes

8
ご回答有難うございます!また、いつ再帰的に使用され、いつ非再帰的に使用されますか?
Chetan

14
@Chetan:達成したいことによって異なります。私は非再帰をより頻繁に使用する傾向がありますが、非再帰を使用して比較的複雑なマッピングを定義し、最初のマッピングのすべてを実行する別のマッピングを定義している場合は、非再帰的なもの全体を再入力するのではなく、元のオブジェクトを再入力します(特に、元のオブジェクトを微調整する必要がある場合)。
DrAl、

10
私はのnoremap反対であると想定していましたmap。マッピングを削除するものを意味します。答えてくれてありがとう。それは私を明確にしました
Pavan Manjunath 2012年

4
ほとんどのユースケースではそれほど重要ではありませんが:map、などはすべてのモードでは機能せず、正確には、すべての一般的なモード(特に、通常モード、ビジュアルモード、選択モード、オペレーター保留モード)。マッピングを挿入、コマンドライン、またはlang-argモードで機能させたい場合は:map!、などを使用する必要があります(出典:vimdoc.sourceforge.net/htmldoc/map.html#map-overview
Ken Bellows

3
@whytheq noremap =非再帰的マッピング
Dan

281

Vimのドキュメントでは、これらのコマンドの命名の背後にある意味を説明しているはずです。彼らが何をするかをあなたに告げるだけでは、あなたは名前を覚えるのを助けません。

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

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

(挿入とコマンドラインに適用される!ようなモードもあることに注意してくださいmap!。)

この文脈での「再帰的」の意味については、以下を参照してください。

nマッピングが機能するモードの変更など、モード文字を付加します。適用可能なモードのリストのサブセットを選択できます(たとえば、「ビジュアル」のみ)、またはmap適用されない他のモードを選択できます(たとえば、「挿入」)。

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

モード文字:

  • n:通常のみ
  • v:ビジュアルおよび選択
  • o:オペレーター保留
  • x:視覚のみ
  • s:選択のみ
  • i:挿入
  • c: コマンドライン
  • l:挿入、コマンドライン、regexp-search(およびその他。総称して "Lang-Arg"疑似モード)

再帰的」とは、マッピングが結果に展開されてから、結果が別の結果に展開されるということです。

次のいずれかに該当する場合、展開は停止します。

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

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

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

例:

 nmap K H
 nnoremap H G
 nnoremap G gg

上記はK、に展開しH、次にH展開しGて停止します。nnoremap展開してすぐに停止するため、停止します。の意味Gが実行されます(つまり、「最後の行にジャンプ」)。最大で1つの非再帰的マッピングが展開チェーンに適用されます(これが最後の展開になります)。

Gto のマッピングggは、を押した場合にのみ適用され、を押した場合は適用されGませんK。このマッピングは、再帰的にマッピングされたKかどうかGに関係なく、押すことに影響しません。これは、2行目が展開Kを停止させるため、3行目は使用されないためです。


4
1つ:mapすべてのモードではなく、通常、ビジュアル、選択、およびオペレーター保留モードにのみ適用されます。
Brian McCutchon 2014

1
回答を受け入れる必要があります。
Tycholiz

これは、承認された方法よりも優れた答えです。
MilMike

19

1つの違いは、

  • :map するnvo==通常+(視覚+選択)+オペレーター保留
  • :map!するic ==挿入+コマンドラインモード

help map-modes表に記載されています。

だから:mapすべてのモードにマップされません

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


5
注意してください! vizのcommand mode別の歴史的な名前ですnormal mode。chapt 5 vimdoc.sourceforge.net/htmldoc/intro.html#vim-modes-intro)。省略形「c」は「コマンドライン」を表します。言い換えると、デフォルトでは、挿入+コマンドラインモードでlhsをrhsにmap! lhs rhs 再帰的にマッピングします。デフォルトのオプションが〜/ .vimrcで明示的に無効にされていない限り、それは不可能です。その場合、マッピングは再帰的ではありません(お勧めできません)。remapset noremap[!]
Cbhihe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.