シーン 6
Vim には、コンパイルエラーの一覧や grep による検索結果一覧などを保持する QuickFix リストというものがあります。QuickFix リストでは、ファイル名/行番号/桁番号 などを管理していて、簡単に該当箇所にジャンプすることができるので、とても便利です。
:vimgrep
などで複数のファイルに対して、ある文字列を検索した時、想定していない余分な箇所までマッチしてしまったことはありませんか? この場合、検索条件を見なおしてから再検索することになると思いますが、検索条件を見なおすのも、それを再入力するのも、またこれらの手順を何度か繰り返すことになるのも、全く効率的ではありません。
どうしたい?
最初に検索した結果(QuickFix リスト)の中の余分なマッチ行を直接削除できるとどうでしょうか?QuickFix リストを編集することができれば、目的の検索を行うための複雑な正規表現を何度も考える必要もなく、もっと効率的・段階的・直感的にマッチ箇所を絞り込んでいくことができます。
どうする?
複数ファイルの検索から、QuickFix リストの変更、QuickFix リストの再読み込みの手順は、下記のようになります。
- まず
:vimgrep
で検索した結果を QuickFix リストに表示します。 - QuickFix リストを変更可能にします。
- QuickFix リストを編集します。(不要行の削除)
- 正常にジャンプできるように、QuickFix リストを再読み込みさせます。
QuickFix リストの基本的な操作(QuickFix リストを開いたり、QuickFix リストの該当行にジャンプしたり)は、本稿では説明しません。
QuickFix リストを変更可能にするには?
QuickFix リストは、通常は変更できない状態で表示されます。まず最初に QuickFix リストを変更可能な状態にします。(QuickFix リストのバッファをアクティブにした状態で、下記のコマンドを実行してください)
:set modifiable
これで、QuickFix リストは変更可能になりました。余分なマッチ行などを :g/re/d
などで削除していきましょう。勿論、1行ずつ削除しても問題ありません。
QuickFix リストを再読み込みするには?
QuickFix リストの内容を変更しただけでは、ジャンプ先の情報までは更新されないので、表示上のマッチ箇所と実際のジャンプ先との整合性が崩れてしまいます。
変更した QuickFix リストの内容を再読込させて、ジャンプ先の情報を正しく更新してやる必要があります。
QuickFix を再読み込みするには、:cbuffer
を使用しますが、Vim 標準で設定されている errorformat
では、vimgrep の検索結果を正しくパースしてくれないので注意が必要です。vimgrep の検索結果は…
sample1.txt|45 col 11| 該当行の文字列
sample2.txt|33 col 32| 該当行の文字列
:
のようになっているので、この形式を正しくパースできるように、事前に errorformat
を次のように設定しておきましょう。
:set errorformat=%f\|%l\ col\ %c\|\ %m
ファイル名 %f
、行番号 %l
、列番号 %c
、検索行 %m
を設定しています。|
や 空白文字 は、\
でエスケープしています。
正しく、errorformat が設定できたので、いよいよ QuickFix リストのバッファを再読み込みさせてみましょう。(QuickFix リストのバッファをアクティブにした状態で、下記のコマンドを実行してください)
:cbuffer
バッファが再読み込みされたので、実際にマッチ行へのジャンプを試してみてください。
まとめ
Vim では、QuickFix リストもバッファの一種なので、通常のバッファと同様に編集することができます。errorformat
を適切に設定することで、編集後のバッファを QuickFix リストとして再読込させることができました。
QuickFix リストのマッチ行に対して、一括マクロを実行するような場合に、ちょっとした修正ができると嬉しいこともあるのではないでしょうか?