fzfで便利にgrepする

筆者はIntellJなどのJetBrains製品の検索が好きで,特にFind in Pathという検索ではプレビューが表示されて,編集もできて非常に便利です.

f:id:tjmtmmnk:20200525000136p:plain
Find in Path

そんな中,VSCodeへの移行も考えたりしていたのですが,どうもVSCodeの検索機能が個人的には好きになれません.VSCodeではプレビューしたいだけなのにファイルがどんどんと開かれていったり,検索結果とプレビューがあまり一体化していないような気がします(伝われ).

f:id:tjmtmmnk:20200525000542p:plain
VSCodeで検索

巨大なコードベースになればなるほど検索機能は重要になるので,VSCode拡張機能とかは魅力的だけど... という状態でした.

VSCode拡張機能でも作ろうかと思ったのですが,ウィンドウを作るみたいなAPIが見当たらず難しそうな印象でした.

そこで色々と調べていたところfzfに出会いました!

github.com

結論から言うと,fzfの作者の方が作られたvimコマンドで解決しました.

github.com

今回は,「検索結果をフィルタリング」するのではなく,「ワードで検索して選択する」という使い方をしたいので,リンク先function! RipgrepFzf(query, fullscreen)vimrcに設定します.この関数は

With --phony option, fzf will no longer perform search. The query string you type on fzf prompt is only used for restarting ripgrep process.

とあるようにfzfをripgrepプロセスのリスタートだけに使います.

具体的な処理としては,入力されるたびにripgrepを実行して,検索結果をプレビュー付きで表示して,選択するとvimを開くということをやってくれます.

試してみたところこんな感じでまさに求めていた検索でした!

f:id:tjmtmmnk:20200524235015p:plain
fzfで検索

ただ,気持ち早めに入力したり削除したりするとうまく検索されないことが多々ありました...

これは完全に勘ですが排他制御がうまく機能していないのかもしれません.このあたりちゃんとソースコードを追っていこうと思います.