Vim初心者のQuickfixによる検索・置換入門


本記事は Vim Advent Calendar 2021 の21日目の記事です

Vimを使い始めて約1年程、経過しました。
Vimを使い始めた当初は1年も使ってればある程度のことできるようになるだろうと思っていた自分がいました。
理想のVim環境を作るのに終わりはないと1年後の現在は感じています。

ですが、1年も使っているとそれなりに自分の好みも出てくるものです。
その中でも今回はQuickfixのカスタマイズと検索・置換について便利なプラグインと共に紹介したいと思います。

Quickfixとは

元々は、Cコンパイラから出力されたエラーメッセージをファイルに保存し、Vimでそのエラーにジャンプするというアイデアから実装された機能です。
Quickfixコマンドはより一般的に、ファイル中の位置のリストを作成し、ジャンプするために使うことができます。

https://vim-jp.org/vimdoc-ja/quickfix.html#quickfix

実際にQuickfixコマンドを使ってみましょう。

左のウィンドウがQuickfixウィンドウになります。
今回の例ではファイル内のfizzという単語を検索してファイル中の位置のリストを作成しています。
Quickfixウィンドウ内の各行のデフォルトのフォーマットは以下のようになっています。
<filename>|<lnum> col <col>|<text>

vimgrepによる検索

では、先程のQuickfixウィンドウがどのように作成されたのかを説明します。
まず初めに、vimgrepについてです。

https://vim-jp.org/vimdoc-ja/quickfix.html#:vimgrep
" 例
:vim {pattern} {file}


vimgrepは上記のように使うことができます。
通常の/を使った検索と違いマッチした文字列の個数が表示されています。
vimgrepはファイル{file}から{pattern}を検索し、マッチ位置をエラーリストに追加します。
エラーリストは以下コマンドを実行することで確認できます。
ここで表示されているウィンドウが先程説明したQuickfixウィンドウに当たります。

:copen

vimgrepを使った検索パターンを2つ紹介します。
まずは、基本となるカレントバッファに対して検索を行います。
ファイル{file}に%を指定することで検索可能です。

:vim {pattern} %

次に、git管理下のファイルに対して検索を行います。
ファイル{file}にgit ls-filesを指定することで検索可能です。

:vim {pattern} `git ls-files`

以上により、vimgrepを使った文字列検索が可能になりました。
ただ、毎回:copenと入力するのは少し面倒です。
私は以下のように.vimrcを設定することで、:vim実行時に:copenを毎回実行せずともQuickfixウィンドウが表示されるように設定しています。

" quickfix-windowのデフォルトの表示位置を左端に変更
autocmd FileType qf wincmd H
" quickfix-windowを開き、modifiableに設定し、Windowサイズを調整
function! OpenQuickfixWindow()
        cw
        set modifiable
        vertical resize 70
endfunction

autocmd QuickfixCmdPost vimgrep call OpenQuickfixWindow()

上記の設定を追加することで以下のような表示になります。

QuickfixCmdPostではQuickfixコマンド(:vim, :grepなど)が実行された後に実行するコマンドを記述することができます。
他にも、QuickfixCmdPreを使ってQuickfixコマンド実行前に実行するコマンドを記述することもできます。

qfreplaceを使った置換

ここからは、置換です。
先程の検索にマッチした文字列を一括置換したい場合があります。
そんな時は、以下のプラグインを使ってQuickfixウィンドウに表示されたリストを一括で置換することができます。

https://github.com/thinca/vim-qfreplace

では、実際に使ってみます。
Quickfix上で:Qfreplaceと入力します。
すると以下のようにQuickfixウィンドウの上に新しくウィンドウが作成されます。

この新しく作成されたウィンドウ上でいつものように置換を行います。
以下の例では、caseをtestに変更しています。

:%s/case/test/g

そして:wを実行すると全てのファイルに対して変更が行われます。

まとめ

いかがだったでしょうか?
今回は、Quickfixウィンドウを少しカスタマイズしてみましたがその他にもhelpを見てみると色々カスタマイズできそうです。

https://vim-jp.org/vimdoc-ja/quickfix.html#quickfix-window-function

皆さんも是非、Quickfixウィンドウのカスタマイズや検索・置換試してみてください。