map、noremap、abbrev、noreabbrevコマンドの違いは何ですか?


19

これらのコマンドは、何らかの方法でキーストロークのセットを別のキーストロークに変換しますが、特定の状況に最も適しているキーストロークはいくらか曖昧です。さらに、!それらのバリアントもあります。現時点では、それらの使用法はかなり偶然であるため、それぞれに関連する落とし穴を知ることができますか?特に、コマンドを使用しているときだけでなく、行のどこにでも展開できるコメントでPeter Rinckerから学んだので、さまざまなモードバージョンに関する特定のメモが役立ちます。潜在的な落とし穴に対してどのような予防策を講じることができますか?cmap:


次の部分は少しメタです:このサイトで回答する際に使用するフォームはどれですか?-メタでこれを尋ねるか、質問に追加する必要がありますか?
ムル

私はそれが依存すると言うでしょう。マッピングを実証する場合は、常にnoremapバージョンを使用します。このようにして、人々は再帰バージョンに対して非再帰マッピングを使用する習慣を身につけます。もちろん、特に<Plug>マッピングでmapを使用する理由はありません。
akshay

回答:


21

まず、mapかつnoremapそれぞれがためのマッピングを作成することという点で類似している、通常の視覚的、選択してオペレータのモードを保留同時に。Vimの詳細は:help map-overview次のとおりです。

Overview of which map command works in which mode.  More details below.
     COMMANDS                    MODES ~
:map   :noremap  :unmap     Normal, Visual, Select, Operator-pending
:nmap  :nnoremap :nunmap    Normal
:vmap  :vnoremap :vunmap    Visual and Select
:smap  :snoremap :sunmap    Select
:xmap  :xnoremap :xunmap    Visual
:omap  :onoremap :ounmap    Operator-pending
:map!  :noremap! :unmap!    Insert and Command-line
:imap  :inoremap :iunmap    Insert
:lmap  :lnoremap :lunmap    Insert, Command-line, Lang-Arg
:cmap  :cnoremap :cunmap    Command-line

上記のヘルプに従って、マッピングを特定のモードに制限したい場合は、先頭に追加する必要があります:

「n」(通常の場合)、「v」(視覚および選択の場合)、「c」(コマンドの場合)、「x」(視覚モードの場合)、「s」(選択の場合)、「o」(オペレーター保留中の場合) )。

例えば、

nmap n nzz

の通常モード、再帰マッピングを作成しますn

これnoremapは、の非再帰バージョンですmap

それでは、非再帰的マッピングとは何ですか?Vimにはそれに対する答えもあります:help map-recursive

If you include the {lhs} in the {rhs} you have a recursive mapping.  When
{lhs} is typed, it will be replaced with {rhs}.  When the {lhs} which is
included in {rhs} is encountered it will be replaced with {rhs}, and so on.
This makes it possible to repeat a command an infinite number of times.  The
only problem is that the only way to stop this is by causing an error.  The
macros to solve a maze uses this, look there for an example.  There is one
exception: If the {rhs} starts with {lhs}, the first character is not mapped
again (this is Vi compatible).
For example: >
   :map ab abcd
will execute the "a" command and insert "bcd" in the text.  The "ab" in the
{rhs} will not be mapped again.

この例は、次のマッピングです。

:imap j k

:imap k j

これで、vimはjをkに、kをjに無限の回数置換し、したがって、再帰マッピングを作成したというエラーを表示します。

このため、通常、マッピングなどを使用する場合を除き、ほぼ常に<Plug>非再帰マッピングを使用することをお勧めします。これにより、誤って再帰的なマッピングを作成したときにVimがハングするのを防ぎます。したがって、非再帰マッピングは、Vimでコマンドをマッピングするより安全な方法です。

上記の情報が手元にあれば、それ:noreabbrev:abbrevコマンドの非再帰バージョンにすぎないことがわかります。

:abbrev挿入、置換、およびコマンドモードでのみ使用できます。:abbrev略語(別名Vimが展開できるショートカット)の作成に使用されます。短い説明は、:map/ を使用:noremapしてマッピングを作成すること、:abbrev/ :noreabbrevを使用して略語を作成すること、またはVimで入力を展開する場合です。


1
noremapコマンドの形式を使用する理由は、ハングを回避することだけではありません。それらを使用するもう1つの(そして私の意見では、より重要な)理由は、マッピングを信頼性/予測可能にするからです。プレーン形式を使用し、rhsそのキーに他の何かにマップされるキーが含まれている場合、マッピングは意図したものとはまったく異なる動作をする可能性があります。
リッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.