Hack #21: 複数のバッファを一度に変更する – :bufdo編
Posted at 2009/06/04ツイート
問題
日常的に複数のファイルを取り扱っていると、同じ変更を複数のファイルに対して行いたい場合があります。例えば:%substitute/foo/bar/g
のような単純な置換を行うとしましょう。取り扱うファイル数が数個なら各々のファイルを開いて同じコマンドを入力して済ませられます。しかしファイル数が10個や20個となってくると手作業では時間がかかりますしミスも誘発します。なんとかして同じ変更を複数のファイルに行うこ
とはできないでしょうか。
解決方法
複数のファイルを一斉に変更するには:bufdo
を用います。例えば先程の例の場合は次の手順で実現することができます:
:bufdo %substitute/foo/bar/g | update
解説
Vimには:bufdo
のような複数のバッファを一度に処理するためのExコマンドが用意されています。:bufdo
は全てのバッファを対象としますが、他にも:argdo
、:tabdo
、:windo
があり、それぞれ対象とするものが異なります。
分かり易さのために「複数のファイルを一斉に変更する」と表現しましたが、実際には各ファイルを開いて指定されたExコマンドを実行することを繰り返します。上記の例は、実際にやりたいことだけを表すと以下のコマンドになりますが、
:bufdo %substitute/foo/bar/g
ほとんどの場合、これは期待通りに動かないでしょう。これは:bufdo
の処理過程において、あるバッファに変更を加えた後、それを保存しないまま次のバッファを開こうとするからです。そしてVimのデフォルトの設定ではそのようなケースをエラーとするので、:bufdo
の処理が中断されます('autowrite'
や'hidden'
が有効な場合を除く。デフォルトではどちらも無効)。
そのため、変更を行った後に保存を行うよう:update
または:write
を最後に記述する必要があります。
参考資料
kanaもどる
blog comments powered by Disqus