5

Vimを使用して複数のファイルに対して次のことを行いたい:

  1. 各ファイルのすべてのテキストをコピーします
  2. 一部のテキストを置き換えます
  3. コピーしたテキストを各ファイルの最後に貼り付けます
  4. 他のテキストを置き換える

1つのファイルに対する私のコマンドは次のとおりです。

:%y
:%s/old1/new1/g
:G
:P
:%s/old2/new2/g

そのための構文を誰か教えてもらえますか? 特に、私は Vim を初めて使用します。

argdo は複数のファイルに対してコマンドを実行できることがわかりました。テキストの置換に argdo を使用する例はたくさん見つかりましたが、:%y、:G、または :P で argdo を使用する構文が見つかりませんでした。

ありがとう。

4

2 に答える 2

4

@ibが述べたように、exコマンド1でこれを行います

:argdo %y | %s/old1/new1/g | $pu | %s/old2/new2/g

排他的な範囲で操作したい可能性も十分にあります (最初の置換は最初の部分でのみ行い、2 番目の置換は 2 番目の部分でのみ行います)。

:argdo $mark a | %co$ | 1,'a s/old1/new1/g | 'a,$s/old2/new2/g

一致しない置換を許可するには、adds///eと addsilent!を使用して、多くのファイルの場合に操作を大幅に高速化します。

:silent! argdo $mark a | %co$ | 1,'a s/old1/new1/ge | 'a,$s/old2/new2/ge

1 ( argdo はデフォルトで Ex コマンドリストを想定していることに注意してください。argdo norm! ggyG通常モードのコマンドを使用するには、eg を使用します)

于 2012-05-04T08:56:37.283 に答える
3

UPD:私の Vim-fu は @ib や @sehe のものほど強力ではないため、私のものではなく、彼らが提案した解決策を使用することをお勧めします。

しかし、私のソリューションは、(Vim 見習いとして) 個人的に編集およびデバッグするのが簡単なので、とにかくここに置いておきます。


次の一時的な関数を に追加できますvimrc

function! MyTmpFunc()
   :%y
   :%s/old1/new1/g
   normal! G
   normal! P
   :%s/old2/new2/g
endfunction

次に、影響を与える必要があるファイル (のようなものvim myfile1.txt myfile2.txt myfile3.txt) で Vim を再起動し、次のコマンドを実行します。

:argdo call MyTmpFunc()

それがあなたの質問で説明したことです:関数MyTmpFunc()はVimに与えられた引数ごとに呼び出されます。

MyTmpFunc()これで、vimrc から削除できます。

:bufdoまた、開いているバッファごとにいくつかのコマンドを呼び出すことにも注意してください。:windoウィンドウごとにコマンドを実行するもありますが、個人的には:bufdoこれが一番使いやすかったです。

また、各バッファで 1 つのコマンドだけを実行する必要がある場合は、一時的な関数を作成する必要がないことに注意してください。old1たとえば、各バッファで" " を " "に置き換えるだけでよい場合はnew1、次のコマンドを実行できます。

:bufdo %s/old1/new1/g

以上です。

于 2012-05-04T05:30:53.277 に答える