ヴィム:複数のコマンドをレジスタに保存するときに改行を処理するにはどうすればよいですか?
-
02-10-2019 - |
質問
vim コマンドのスニペットを保存するファイルがあります。スニペットが必要な場合は、それをヤンクして、次のように実行します。 @"
. 。スニペットは、次のようにコマンドごとに 1 行のスクリプトとして保存されます。
:s/foo/bar/g
:echo "hello"
:s/1/2/g
編集:通常モードのコマンドは問題の一部ではないため、例から削除しました。
現在、この手順は機能しなくなりました。スニペットを実行すると、改行を待っているかのように最初の行で停止します。
どこかに方法に影響を与えるオプションはありますか @
処刑されるのか?確か少し前までは動作していたと思います...
改行を ^M 文字に置き換えると機能しますが、ファイルの処理が難しくなります。
追加情報:
もう一つの症状は次のとおりです。スニペットをヤンクしたとき、次のように実行すると @"
先ほど説明したように、最初の行で停止します。しかし、それを実行すると :@
それは動作します。しかし、ヘルプ ファイルには、2 つのコマンドがレジスタの内容をどのように扱うかについての違いは示唆されていないようです...
解決 2
私はついに犯人を見つけました。どういうわけか、コマンドマッピングがありました <C-J>
私の.vimrcファイルで。デフォルトで読むとき cpoptions
, 、これはマッピングに変わりました <NL>
.
私が見つけた方法:Vimを始めるときに気づきました -u ~/.vimrc
, 、それは確かにヤンクのスニペットを実行するでしょう。そのコマンドラインオプションの有無にかかわらずセッションファイルを生成し、それらを比較しました。このようにして、私は別のセットのセットが cpoptions
同じ.vimrcファイルを読み取るために使用されていたので、ある場合にマッピングが実際にオンになっていたため <C-J>
, 、他ではマッピングに変換されました <NL>
!
誰かが同様の問題を抱えている場合、私は現在設定されているコマンドマッピングを注意深く見ることをお勧めします。 :cmap
.
他のヒント
問題はないと思います ^M
対 ^J
. 。Vim マクロは、どちらも記録されたマクロの有効な行末文字として扱います。問題は余分な改行だと思います。
あなたの例では、後に少なくとも 1 つの偽の改行があります。 2j
, スニペットをコピーするときに特に注意しない限り、おそらくその後に別のスニペットが存在します。 10k
同じように。これらの余分な改行は、押すようなものです <Enter>
通常モードでは、カーソルが 1 行下に移動します。
スニペットは次のようにしたいと思います。
:s/foo/bar/g
2j:s/1/2/g
10k
(これでも少し誤解を招きます。それでも、次の改行をコピーしないように注意する必要があります。 10k
.)
これらの余分な改行がこれほど大きな違いを生むのはなぜでしょうか?そうですね、まず、予想される場所から少なくとも 1 行離れた場所に移動することになり、特定の行で実行したいことがすべて台無しになってしまいます (たとえば、 :s//
指示)。
しかし、より重要なのは、これがあなたの例で起こっていることだと思いますが、マクロが使用しようとするとVimがマクロの再生を停止することです。 <Enter>
バッファの最後の行。(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
) スクリプト内で。
幸運を!