Vimで複数ファイルを纏めて編集する

/web/tool

Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。

いわゆるGrep検索→置換みたいなこと。普通のエディタにはだいたい付いているけど、Vimでやるってあんまり馴染みが無いかもってことでメモってみる。UNIXなら外部のgrepコマンドを実行する方法もあるけれど、Vim内部で行う方法として、vimgrepを使う方法とアーギュメントリストを用いる方法を紹介します。

Vim基本操作まとめ」のほうに書こうかと思ったけど、尺が半端なのでこっちに書くことにした。

2009.06.02 id:gabaの要望に応えて、「:bufdo」を追加。
2009.06.02 アーギュメントリストに関しては、vim-user.jpに詳しく載っていた。

複数ファイルから検索

  1. :vimgrep /hoge/j **/*.txt | cw

カレントディレクトリ以下の「.txt」で終わるファイルから、「hoge」文字列にマッチした行を抽出する。vimgrepは単にvimでも可。

  • jフラグで最初にマッチしたファイルを開かない
  • 再帰的に検索するために **(starstar) を使う
  • 「| cw」で検索結果をQuickfixに表示させる。

Quickfixウィンドウは「:cw」(:copen)で開き、「:ccl」(:cclose)で閉じる。「:cn」でマッチした次の行へ。「:cp」で前の行に戻る。詳細は「:hequickfix-window」を確認のこと。

検索結果のリストを表示させて、1つずつ確認しながら編集したい場合に重宝してます。

複数ファイルを置換

  1. :args **/*.txt
  2. :args
  3. :argdo %s/hoge/fuga/g | update

1行目で対象ファイルを登録し、2行目でマッチしたファイルを確認。3行目で任意の作業をした後、ファイルを更新します。一般のテキストエディタに同梱されている検索/置換と比べると、ちょいと面倒ですが、この方法の便利なことは別に単純な置換以外の様々な作業も可能ということ。たとえば以下のようなこともできる。

  1. :argdo fenc=sjis | update

対象ファイルの文字コードを一括変更。同じように改行コードも変更できる。

全バッファに一括コマンド適用

:bufdoは、いま開いている全バッファに対して続くコマンドを実行する。

  1. :bufdo %s/warnings/warningssss/g | w
  2. :bufdo set fileencoding=cp932 | set fileformat=dos | update

見えているバッファだけなら:windoでいける。:tabdoとかもあるらしい。以下のようにもできる。

  1. :cexpr ""
  2. :bufdo vimgrepadd /foo/ %
  3. :cw

現在開いている全てのバッファからgrep。vimgrepaddvimgrepの違いは、後者が結果をQuickfixにどんどん加えていく点にある。つまり、全バッファでvimgrepした結果がQuickfixに登録されている。ただし前回の検索結果がそのまま引き継がれる。そのため、まず「:cexpr」を実行して検索結果を初期化するステップが必要。

memo: :bufdoはそのためにバッファを開くのが面倒だったり、なんだか動作が妙だったりするため、Sig.はあんまり用いない。参考までに。

Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。