Quickfix に触れてみよう
はじめに
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 に表示されます
:make は makeprg を実行します
makeprg
のデフォルトは make
なので vim
コマンド実行時のカレントディレクトリに Makefile があれば特に設定を変更せずに実行できます
また、出力は errorformat でパースされます
:compiler
makeprg
や errorformat
を設定するのは非常に面倒です
そこで :compiler の出番です
Vim も Neovim も runtime/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
とかも便利
この辺も見るといいかも
使ったことないけど気になるプラグイン(Neovim限定)
-
kevinhwang91/nvim-bqf
Quickfix List の UI がリッチになります -
is0n/jaq-nvim
quickrun の亜種 -
onsails/diaglist.nvim
lsp と連携して diagnostics を quickfix に入れてくれる
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を使うテクニック
です
参考文献
この辺の記事を参考にさせていただきました
ありがとうございます
Discussion