vim-users.jp

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