1

vimコマンドのスニペットを保存するファイルがあります。スニペットが必要な場合は、それをヤンクしてから、を使用して実行し@"ます。スニペットは、次のように、コマンドごとに1行のスクリプトとして保存されます。

:s/foo/bar/g
:echo "hello"
:s/1/2/g

編集:通常モードのコマンドは問題の一部ではなかったため、例から削除しました。

この手順は機能しなくなりました。スニペットを実行すると、改行を待っているかのように最初の行で停止します。

実行方法に影響を与えるオプションはどこかにありますか@?私はそれがしばらく前に働いていたとかなり確信しています...

改行を^M文字に置き換えることは機能しますが、ファイルの処理がより困難になります。


追加情報:

別の症状があります。スニペットをヤンクすると、それを実行すると、@"先ほど説明したように最初の行で停止します。しかし、私がそれを実行すると、:@それは機能します。しかし、ヘルプファイルは、2つのコマンドがレジスタのコンテンツを処理する方法に違いがあることを意味していないようです...

4

2 に答える 2

2

やっと犯人を見つけました。どういうわけか<C-J>、.vimrc ファイルにコマンド マッピングがありました。デフォルトで読み取るとcpoptions、これは 上のマッピングに変わりました<NL>

発見方法: vim を-u ~/.vimrcで起動すると、ヤンクされたスニペットが実際に実行されることに気付きました。そのコマンドライン オプションを使用して、または使用せずにセッション ファイルを生成し、それらを比較しました。このようにして、別のcpoptions場所のセットが同じ .vimrc ファイルの読み取りに使用されていることがわかりました。そのため、あるケースではマッピングが実際に on<C-J>であり、別のケースではマッピング on に変換されました<NL>!

誰かが同様の問題を抱えている場合は、現在設定されているコマンド マッピングを注意深く確認することをお勧めします:cmap

于 2010-05-04T11:48:17.950 に答える
2

^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

ここでを押す@xline 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

幸運を!

于 2010-04-29T21:30:02.843 に答える