^M
問題はvs.ではないと思います^J
。Vim マクロは、いずれかを記録されたマクロの有効な行末文字として扱います。問題は余分な改行だと思います。
あなたの例では、 の後に偽の改行が少なくとも 1 つあり2j
ます。スニペットをコピーするときに特に注意しない限り、おそらく別の改行10k
もあります。これらの余分な改行は<Enter>
、通常モードで押すのと似ています。カーソルを 1 行下に移動します。
スニペットを次のように見せたいと思うものは次のとおりです。
:s/foo/bar/g
2j:s/1/2/g
10k
(それでも少し誤解を招きます - の後に改行をコピーしないように注意する必要があります10k
。)
これらの余分な改行が大きな違いを生むのはなぜですか? 1 つには、期待する場所から少なくとも 1 行離れてしまい、特定の行で実行したいこと (:s//
コマンドの実行など) が台無しになります。
<Enter>
ただし、さらに重要なのは、これがあなたの例で起こっていることだと思いますが、マクロがバッファーの最後の行で使用しようとすると、Vim がマクロの再生を停止することです。(Vim はこれをエラーと見なし、エラーが発生するとマクロの実行が停止すると推測しています。)
これが例です。次のスニペットがレジスタ x に保存されているとします。
4j
:echo "Done"
( の後の改行に注意してください4j
。)
さらに、バッファーに次の 5 行 (およびこれらの 5 行のみ) があるとします。
line 1
line 2
line 3
line 4
line 5
ここでを押す@x
とline 1
、:echo "Done"
決して実行されません。Vim はカーソルを 4 行下line 5
に移動し、余分な改行のためにもう 1 行下に移動しようとしますが、移動できません。:echo
コマンドが実行される前に、マクロはその時点で実行を停止します。
ただし、x レジスタを次のように変更すると機能します。
4j:echo "Done"
元の例に戻ると、何が起こっているのかは、後の余分な改行2j
がカーソルを移動できない場所に移動しようとしており、それによってマクロが停止することだと思います。画面の一番下の行には最後に実行されたコマンド ( :s/foo/bar/g
) が含まれており、Vim が Return キーを押すのを待っているように見えます。
最後に、別の方法を使用して Vim コマンド シーケンスを保存および実行することを強くお勧めします。使用している手法は、単純なケースでは許容できますが、壊れやすく、うまくスケーリングできません。Vim には、関数とカスタム コマンドを含む完全なスクリプト言語があり、現在行っているすべてのことを実行するために使用できますが、はるかに堅牢な方法で実行できます。Vim スクリプトは大きなトピックですが、ここから始めます。
:help script
スクリプト内で:normal
通常モードのコマンド (2j
や など) を実行できるコマンドについて必ずお読みください。10k
幸運を!