ネストされたマクロを記録するにはどうすればよいですか?


11

次のように、マクロ内にマクロを記録したい:

qa
    [ first macro ... ]
    qb
        [ second macro ... ]
    q
    [ some more stuff, involving @b ... ]
q

ただし、2番目qは最初のマクロを停止する要求として解釈され、残りはコマンドとして解釈されます。

マクロ内で2番目のマクロの記録を開始する方法はありますか?

そうでない場合、すでにマクロ内にある間に特定のキーストロークのシーケンスを繰り返すという望ましい効果を達成する他の方法はありますか?


1
最初にマクロbを記録してからマクロa呼び出しを記録できません@bか?
statox

@statox問題はb破壊的な影響があるため、最初に記録することはできません(記録する場合を除きu、何度も押してから記録開始しますa)。
ドアノブ

1
それがあなたの最善の解決策だと思います。また、別のバッファenewに記録する(、記録するbd)かb、マクロの内容をファイルに書き込んでレジスタを直接編集し、でレジスタに文字を配置して「記録」することもでき"byます。
statox

回答:


10

私の知る限り、qx...q1回のショットで2つのマクロを記録することはできません。あなたの条件のために、あなたは、マクロを作成する必要がbqb....qた後、qa...@bq

あなたが「記録」にはしたくない場合はb、あなたが行うことができlet @b='whatever'、その後@b、マクロを再生します。たとえばlet @b='ggdG'b「記録」せずに現在のバッファのすべてのコンテンツを削除するマクロを定義します。

マクロ定義のトリックがありますが、これはあなたの質問には関係ありません。ネストされたマクロではなく、再帰的なマクロです。つまり、次のことができます。

qa..whatever..@aq

これにより、マクロが再帰的に再生されaます。マクロを何回再生したいかわからない場合に便利です。エラーが発生すると、マクロの再生が自動的に停止するためです。999@aたとえば、保存します。


1

キーストロークをマクロ@aに記録することは、それらのキーストロークに対応するテキストをヤンクしてaを登録することと同じです。何かがレジスタに保存されたら、それを置くか、マクロ/キーストロークとして再生することができます。したがって、を介して@aにマクロの記録を開始し、マクロの記録qa中に、おそらくのようなものを使用してbを登録するためにテキストをヤンクします"bye。それは、レジスタbを指定しなかった場合とは異なるテキストを異なるレジスタにヤンクするだけです。レジスタbにテキストが含まれているので、を押してそのテキストをキーストロークとして再生できます@b。マクロ@aがまだ記録されている間にそれを行うことさえできます。それはメタマクロです!

これの主な欠点は、おそらくあなたが望むことをするvimscript関数を書いて、おそらくマクロ記録中にそれを呼び出す方が簡単だということです。マクロの美しさは、記録中に記録内容の効果を確認できることですが、このメタマクロ記録技術はそれをいくらか取り除きます。

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