深酒とお昼寝で忘れる

深酒とお昼寝で忘れる

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

fzf.vim による絞り込み対象からファイル名を除外する

先日の記事『重い腰を上げて Neovim ことはじめ ー ripgrep (rg) と fzf でソースコード検索編』で設定した :Rg コマンドはとても便利ですが、使っていて不満な点が一つありました。それは、fzf.vim で絞り込みを行うときにファイルの内容だけでなくファイル名自体も検索対象になってしまうことです。

例えばディレクトリ内のソースコードから foo() という関数を検索するため :Rg コマンドで fzf.vim のインターフェースを立ち上げて foo という文字列でマッチングを行うとします。この際、ディレクトリ内に foo.c というファイルが存在した場合、foo.c の全ての行がその内容に関わらずマッチング結果として表示されてしまいます。

これは rg の出力がファイル名を含んでおり、fzf がマッチングを行う際にファイル名なのかファイルの中身なのかを区別しないことに起因しています。少し調べたところ、同じことで悩んでいる人がおり、解決方法も提示されていました。

解決方法は fzf--delimiter : --nth 3.. というオプションを渡すことです。これは、: をデリミタとして 3 つめのフィールド以降のみをマッチング対象にするというものです。Rg: コマンドで設定している rg の出力フォーマットは ファイル名:行番号:行の中身 となっているため、この設定によってファイル名は絞り込み対象から除外されます。

ということで、該当する箇所の設定はこうなります。

command! -bang -nargs=* Rg
  \ call fzf#vim#grep(
  \   'rg --line-number --no-heading '.shellescape(<q-args>), 0,
  \   fzf#vim#with_preview({'options': '--exact --reverse --delimiter : --nth 3..'}, 'right:50%:wrap'))