🔗

Quickfix に触れてみよう

2022/12/02に公開

はじめに

Quickfix を使い始めて vim の素晴らしさをさらに実感できたので、まだ知らない方にこの感動を届けたくて記事にしました
私も全然使いこなせてはいませんが、初めての方が Quickfix を使えるようになるきっかけになれば嬉しいです

Quickfix とは

:quickfix とは

Vimには編集-コンパイル-編集のサイクルを加速するための特別なモードがある。これ はAmigaのManx's Aztec C compilerのquickfixオプションにインスパイアされた。
Cコンパイラから出力されたエラーメッセージをファイルに保存し、Vimでそのエラーにジャンプするというアイデアである。
エラーメッセージを全部覚えておかなくても、それぞれの問題を検証し、修正することができる。
quickfixコマンドはより一般的に、ファイル中の位置のリストを作成し、ジャンプするために使うことができる。

要約するとエラーや検索位置にぴょんぴょん飛べる機能です

see: :help quickfix, :help 30.1

Quickfix を使ってみよう

習うより慣れろということでどんどん使ってみましょう

vimgrep 編

:vimgrep というコマンドご存知でしょうか?
私は最初 / の検索しか知らず vim を閉じて grep してまた vim に戻ってと大変でした
:vimgrep を使うと vim の中から grep を実行して結果を quickfix window に送ることができます
:vimgrep /{pattern}/ {file} が基本の形です
{file} には glob も使えるので src/**/*.ts のように使うこともできます

quickfix の中身を見るには :cwindow を実行します
quickfix window のリストの上で Enter を押すと結果位置に飛ぶことができます
実際にやってみましょう

$ curl -OL https://raw.githubusercontent.com/MikhaD/wordle/main/src/words_5.ts # wordle のワードが書かれたファイルを DL
$ vim words_5.ts                                                               # DL したファイルを vim で開く
:vimgrep 'vi' % " vimgrep コマンドで文字列 vi を現在のファイルから検索
:cwindow      " quickfix window を開く

:grep

:vimgrep は遅いので :grep を使うと良いでしょう
ほとんど同じように使えます、デフォルトでは grep -n が実行されますが grepprg で変更することもできます
おすすめは ripgrep を使うことです
以下を init.vim に書くと良いでしょう

let &grepprg='rg --vimgrep'

また、出力は grepformat でパースされます

make 編

:make
C compiler にインスパイアされたそうなので、まず C++ のプロジェクトを clone してきます
Cpp-Tutorial-Samples
そして適当なファイルを vim で開きましょう

$ git clone https://github.com/sinairv/Cpp-Tutorial-Samples.git
$ cd Cpp-Tutorial-Samples/Arrays/Arrays/
$ vim Prog.cpp
:make
:cw

make は成功するのでもちろん quickfix window は空です
セミコロンを消したり、変数名を一部だけ変えてコンパイルが失敗するように修正します
そして :make するとエラーが quickfix window に表示されます
:makemakeprg を実行します
makeprg のデフォルトは make なので vim コマンド実行時のカレントディレクトリに Makefile があれば特に設定を変更せずに実行できます
また、出力は errorformat でパースされます

:compiler

makeprgerrorformat を設定するのは非常に面倒です
そこで :compiler の出番です
VimNeovimruntime/compiler 配下のスクリプトを実行して make の設定を行うことができます
tsc を例にあげて実際に使ってみましょう

$ pnpm init && pnpm add typescript
$ echo 'let i:string = '';\n i = 10;' > test.ts
:compiler tsc
:let &makeprg='pnpm exec tsc %'
:make

plugin 編

力尽きたのでプラグインは一覧形式での紹介に留めます

  • thinca/vim-quickrun
    :make だと同期処理なのでプラグインを使って非同期にするのがおすすめです (プラグイン模索中です)
  • nvim-telescope/telescope.nvim (Neovim限定)
    fuzzy-finder です 検索時 C-q で Quickfix List に持って来ることができます :Telescope quickfix とかも便利

この辺も見るといいかも
https://github.com/yutkat/my-neovim-pluginlist#quickfix

使ったことないけど気になるプラグイン(Neovim限定)

Quickfix List を使いこなそう

前後の項目に移動する

Quickfix List を移動する

Quickfix List の全ての項目に対してコマンドを実行する

:cdo は Quickfix List の全ての項目に対してコマンドを実行します
以下のコマンドで Quickfix List の全ての行で hoge を fuga に置換してファイルを更新します

:cdo s/hoge/fuga/g | update

grep, make の後に自動で quickfix window を開く

autocmd QuickFixCmdPost *grep* cwindow
autocmd QuickFixCmdPost *make* cwindow

終わりに

vim で grep, make をやるときには Quickfix を活用すると便利です
:make ではコンパイルだけでなくテストの実行などもできるので是非活用したいですね
今更気づいたのですが、去年も同じような記事があったんですね orz
何度も出るということはそれだけ便利ということで、ぜひ使いこなせるようになりましょう!
明日は ryicoh さんの プラグインなしでVimを使うテクニック です

参考文献

この辺の記事を参考にさせていただきました
ありがとうございます

https://vim-jp.org/vimdoc-ja/quickfix.html
https://www.soum.co.jp/misc/vim-no-susume/7/
https://daisuzu.hatenablog.com/entry/2020/12/03/003629
https://qiita.com/yuku_t/items/0c1aff03949cb1b8fe6b
https://zenn.dev/tmrekk/articles/4380961a754287

GitHubで編集を提案

Discussion