2

5 行のテキストがあるとします。vim に各行を処理させるコマンドを入力すると、Vim はテキストを 1 行ずつ、1 行目、2 行目、... 最後の行と処理します。私が望むのは、Vim にテキストを逆の順序で処理させることです。最初に最後の行、次に 4 行目、最後に最初の行です。

なぜこれが必要なのですか?私は次のテキストを持っています

1234567890
abc
123
def
1234567890
123456789

3 文字を含む行から改行記号 (\n) を削除したい。処理後,次のテキストを取得します

1234567890
abc123def1234567890
123456789

それはケーキのようです、私は次のコマンドを使用します

:%s/\v(^\w{3})\n/\1/

しかし、私が得たのは

1234567890
abc123
def1234567890
1234567890

なんで?vim は最初に 2 行目から \n を削除し、次にこの行には abc123 というテキストが含まれていると思います。今は 3 文字ではないため、vim は 123 の後に \n を削除しません。したがって、vim は次の行の def を処理し、そこから \n を削除します。 、それは私が得た結果です。

vim が後ろから前に処理できる場合、これは発生せず、必要な結果を得ることができます。

ところで、私は他の方法で期待される結果を得ることができます.これが可能かどうか知りたいだけです.

4

4 に答える 4

2

行の範囲 (たとえば、視覚的に選択された行) を逆方向に明示的にループし、各行でコマンドを実行します。改行を使用:joinする代わりに、ここで使用しました。:substitute

:for i in range(line("'>"), line("'<"), -1)| silent execute i . 'g/^\w\{3}$/join!' | endfor
于 2013-04-03T07:16:09.760 に答える
1

この場合、:globalコマンドを使用して線を結合する方が簡単です。

:g/^\w\{3}$/normal! gJ

このコマンドgJは、スペースを挿入せずに現在の行と次の行を結合します。上記のグローバル コマンドはgJ、3 文字のみを含む各行で呼び出します。操作を実行する前に、最初にすべての一致をマークすることで機能するため、ループの問題が回避されます。

于 2013-04-03T07:17:09.017 に答える