「標準」の後にexモードコマンドを続行しますか?


8

繰り返しの編集とリファクタリングを処理するときに、非常に長いマクロをよく使用します。可能な限り、これらをマクロとして記録するのではなく、ex-modeコマンドとして記述します。これは、対話的に(コマンドウィンドウを使用して)編集する方が簡単だからです。

ただし、いくつかの通常モードのコマンドを追加する必要がある場合があります。たとえば、後でマクロで使用するために、行全体ではなく行の一部だけをヤンクしたり、テキストを希望どおりに並べたりする必要があります。

が含まれた後にexモードコマンドを続行する方法はありnormますか?

(私が話している種類の複雑さの実際の例については:)

:'a+s/\_^\s*\(\S*\)::\_[^>]*>\s*\("[^"]*"\)\s*;\_s*\_$/    "\1", \2,/ | m 'a- | norm f,50a ^[d44|

最後にテキストを追加してexモードコマンドとして実行させる方法はありますか?


1
:normalコマンドが残りの行を消費しないようにしますか?もしそうなら、:execute次のコマンドで実行できる文字列の中にラップすることができます::exe 'norm f,50a ^[d44|' | other Ex command
saginaw 2016年

:executeは、文字列を引数としてにのみ渡す:normalので、後者はコマンドラインで後の部分を認識しないため、他のExコマンドを追加できます。文字列のような非リテラル制御文字が含まれている場合に注意を払うにだけのものでは、あります\eのために<Esc>あなたはVimがそれを解釈できるようにするために、二重引用符を使用する必要がありますがそれ以外の場合は、単一引用符は文字列の中で何の解釈を防ぐため、。
saginaw 2016年

回答:


10

コマンドラインから通常モードで実行する一連のキーストロークがある場合は、コマンドを使用できます:normal

ただし、:normalヘルプのように、デフォルトでは、コマンドの後に別のコマンドを続けることはできません。

    This command cannot be followed by another command,
    since any '|' is considered part of the command.

したがって、の後:normalに別のExコマンドを追加する場合は、:normalコマンド全体を文字列内にラップしてから、:executeコマンドに後者を実行させることができます。それは次のようなものを与える可能性があります:

:exe 'norm {your keystrokes}' | Other Ex command

とは逆に:normal:executeパイプはその引数の一部とは見なされません。これはコマンドの終了と見なされ、文字列内にあるものだけが実行されます。
:normalコマンドラインで何が後に表示されるのではなく、文字列に残っているものだけが表示されます。
したがって:normal、通常モードで入力せずに後で別のExコマンドを追加できるはずです。

注意を払うと、ほんの少しの事があります:
あなたは、単一引用符を使用して文字列を囲む場合は、Vimはあなたがしたい場合は問題になる可能性があり、内部には何も、解釈しません:normalのような制御文字を打つことを<Esc><CR><Tab>または<C-V>特殊文字を書き込むことによって、それぞれ:\e\r\t\<C-V>
これらの特殊文字については、で説明してい:help expr-quoteます。
この場合、Vimが文字列を正しく解釈できるように、文字列を囲むために単一引用符の代わりに二重引用符を使用できます。
:あなたの制御文字を使用すると、彼らのキャレット表記を見た場合である(リテラルであれば^[脱出のために、^M入力のために、^Iタブのために、^Vのために<C-V>)、二重引用符は必要ありません。

マクロを記録すると、後者は制御文字をリテラルとして保存します。マクロは、で説明されている種類の特殊文字を使用し:h expr-quoteないため、二重引用符は必要ありません。また、リテラル制御文字を自分で追加してマクロを編集する場合は、接頭辞を付けることができます<C-V>(詳細については:h i_ctrl-v、を参照)。たとえば、マクロが格納されているレジスタ内または引数としてに渡された一連のキーストローク内にリテラルエスケープを追加するには:normal、を押します<C-V><Esc>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.