深酒とお昼寝で忘れる

読者です 読者をやめる 読者になる 読者になる

深酒とお昼寝で忘れる

素面でも意図したことを忘れがちなしらふいとさんは、忘れる前に書き残せたらとても満足

重い腰を上げて Neovim ことはじめ ー ripgrep (rg) と fzf によるソースコード検索編

fzf fzf.vim Neovim ripgrep Vim

はじめに

Neovim への移行のモチベーションを大きく上げてくれた記事があります。それはこの 『コマンド一発でソースコード検索&表示できる「peco」改が凄い!』 というブログポストで、ああ便利そうだなあ、これが Vim の中で完結したらとっても嬉しいだろうなあ、と思ったのです。記事でも『Vim にある grep とかも物色しながら「いいのないねー」……』とありますしね。で、ふとこれは 先日の記事 に書いた Neovim のニュースレターの 第6号 で紹介されている fzf を導入すればできるんじゃないかな、と気づいたわけです。これは fzf を Neovim で使ってみるしかない。

代替手段の調査

と、その前に、一応他の実現方法についても少し調べてみました。

まずは、Vim と元の記事にある peco の連携を少し調べてみたんですが、希望に沿うものはなさそうだったので、パス。そもそも『Vim に良いのがなさそう』、というのが peco 改良の出発点として書かれており、おそらくまだ Vim との連携には至ってないのかな、と想像できます。

続いて考えたのが CtrlP を使う方法です。結構期待したのだけれど CtrlP はファイルのマッチングを念頭に作られたからかデフォルトでは所望の機能がないようです。CtrlP の拡張を少し探してみたもののすぐには見つからなかったので、ひとまず保留して次へ。

最後に、できる気がするのだけれど今回は手を出さなかったのが Denite.nvim を使う方法です。先代の Unite.vim の頃から、いつか使ってみたいと思っているプラグインなのですが……、なんかどうにも億劫で使ってみるには至りませんでした。

fzf および fzf.vim のインストール

はい。fzf です。fzfpeco のようないわゆる fuzzy matcher で、作者の方が Vim ユーザなこともあってか Vim との連携機能が強力です。同じ作者による fzf.vim プラグインを導入すると 幸せになれるそうです。色々と設定を試行錯誤して、そこそこ満足できる状態になりました。

インストールには TOML ファイルに fzf および fzf.vim のエントリを追加します。

[[plugins]]
repo = 'junegunn/fzf'
build = './install --bin'
merged = '0'

[[plugins]]
repo = 'junegunn/fzf.vim'
depends = 'fzf'

検索プログラムの調査

fzf.vim の設定の前に、fzf への入力を出力するプログラムを決めます。元の『「peco」改』のエントリは peco への入力に Ack を使っています。Ackfind+grep 相当のことが実行できるもので、同種のプログラムが多数開発されています。調べた結果、ripgrep というプログラムが性能が良く一番信頼できそうだな、という結論に至りました。興味のある方は、作者が性能比較を行なっている このブログポスト や、Hacker News での ag の作者との やり取り などを読んでみてください。

fzf.vim の設定

さてあとは fzf.vim の設定です。なるべく元の記事の アニメーション と似たような使用感になると良いなと思って設定しました。

該当する箇所の設定を抜き出してみました。

[[plugins]]
repo = 'junegunn/fzf.vim'
depends = 'fzf'
hook_add = '''
    command! -bang -nargs=* Rg
      \ call fzf#vim#grep(
      \   'rg --line-number --no-heading '.shellescape(<q-args>), 0,
      \   fzf#vim#with_preview({'options': '--exact --reverse'}, 'right:50%:wrap'))
'''

fzf.vimREADME にある :Rg というコマンドを設定している箇所を参考にして、以下の変更を加えています。ちなみに rg というのは ripgrep の実行ファイル名です。README では --column が有効で with_column1 に設定してありますが、どのような効果があるのか不明だったので無効にしました。:Rg! コマンドは使わないと思ったので除き、また --color=always があると速度が目に見えて遅くなってしまうのでこちらも除いてデフォルトの挙動(--color=auto)にしてあります。

fzf#vim#with_preview はとてつもなく素晴らしいので、デフォルトで有効にしました。長い行は wrap した方が好みです。また、fzf--exact--reverse を渡しています。前者はあいまい検索を無効に、後者は候補の表示をデフォルトのボトムアップからトップダウンに変更するオプションです。

あとはコマンドモードで :Rg を実行すれば良いです。

おわりに

f:id:someneat:20170308040647g:plain