2012-03-14 4 views
5

これらのコマンドが異なる理由を理解できません。Vim:Exコマンドを連結する "bar"をエスケープする

、vimrcファイルに貼り付け、通常でtを押すことによって活性化:

コマンドラインに直接入力
nnoremap t :call search('\m\(a\|b\)', 'W')<CR> 
nnoremap t :call search('\m\(a\\|b\)', 'W')<CR> 

:具体的には

:call search('\m\(a\|b\)', 'W') 
:call search('\m\(a\\|b\)', 'W') 

: "意図" 動作がで\\|が必要ですnnoremap例ですが、call検索例では\|が必要です。

バー(:help :bar)の特別扱いはVimが私のためにレイアウトしたトラップの1つですが、まだ意味がありません。ドキュメントには、「このコマンドリストには引数が含まれています」と明記されていますが、ここには例外はありません。この例に含まれるすべてのコマンドは、バーをメタ連結文字として扱います。また、この状況では、バーは文字列の中にあり、文字列の一部として解析されています(私は思うか?)は、メタ連結構文よりも優先されます。あなたがVimの*mapcommandコマンドを使用する場合

答えて

11

実際、問題は、マッピング作成コマンド によってバー文字の特別な処理が原因です。

Vimでのキーマッピングの仕組みは、一連のキー入力を一連のキーとして解釈する方法です。 は別のキーシーケンスとして解釈されます。 の意味論的解釈はありません。このレベルでは、Vimスクリプト言語が実行されます。マッピングを作成するためには、 の間のマッピングを記述するために両方のキーシーケンス引数を分離する必要があるので であるため、 の境界を決定することによって、:mapのコマンドが開始されます。この の処理を妨げる可能性のある文字をマッピングで使用するには、その文字に対応するエスケープ構文(キャリッジリターン、スペース、バックスラッシュ、およびバー)を使用する必要があります。

次のExコマンドの マッピングコマンドを区切るためにバー文字を使用することができるため、マッピングの右側の の終了境界を定義するためにそのまま使用することはできませんキーシーケンス。 は:help map_barによれば、設定に応じて、バーの文字が は<bar>\|、または^V|^Vリテラル Ctrlキー + Vキーコードを表す)のようにエスケープすることができます。心の中でそれを維持

、私たちは、彼らがデフォルトの設定で解釈する方法を( \|/\\|部分の周りに)問題のマッピングに従ってみましょう。 の最初のマッピングでは、\|シーケンスは単一の|文字として扱われます。そのマッピングコマンドが実行された後 したがって、tを押すと

:call search('\m\(a|b\)', 'W')第2のマッピングコマンドを実行すると、\\|文字列は として解釈さ

を入力する入力と同じ なりリテラルのバックスラッシュ文字(ネストされたものを除いて、 のマッピングの右側には\をエスケープする必要はありません)、続いて\| 指定子はバー文字を表します。だから、 にこのコマンドマップtは以下:1のタイプのマッピングされた検索は、コマンドラインモードで呼び出したとき

:call search('\m\(a\|b\)', 'W')がマッピングで キーシーケンスとは異なり、しかし

を入力し、彼らすぐにExコマンドとして解釈されます。 これらのバー文字は文字列リテラルで発生するため、 がExコマンドの区切り文字として間違って解釈される可能性はありません。直接入力すると、 コマンドは実行時に書き込まれます。したがって、それらの間の作業中の の違いは、正規表現 \m\(a\|b\)\m\(a\\|b\)の意味によるものです。何らかのエスケープ動作が原因ではありません。

+0

ありがとうございます。私は、 ':map'コマンドがどういう意味でその内容を見ていなくても引数を解析しなければならないことを間違いなく見落としました。 – Ein

7

、vimscriptエンジンは、コマンドを解釈することはありません - それはそのまま、それを格納し、キーストロークシーケンスとして(*mapの場合)または(commandの場合)の文字列として。このコマンドは、使用時にのみ解釈されます。

そのため、vimはコマンドに文字列が含まれているかどうかわからないので、実際にパイプ文字が文字列の中に入っているかどうかはわかりません。 。

*map|を使用する場合は、代わりに<bar>を使用する必要があります。