vim / fzf + rg で .gitignore以外のファイルも検索したい場合

fzf使ってます? fuzzy searchをvim でインテグレーションするにはfzf + fzf.vimがおすすめ

ただfzfの問題点は、.gitignoreファイルを標準では無視することです。

FZFとは

FZFは、汎用のコマンドラインファジーファインダーです。あなたのシステムにインストールするのはとても簡単です。Homebrewを使って、brew install fzfを実行するだけで、Macにインストールできます。

fzf optionの基本

見た目

export FZF_DEFAULT_OPTS='--height 40% --layout=reverse --border'

ここで問題になるのが、プロジェクト内にたくさんのファイルがあり、バージョンコントロールシステムで追跡されていないファイルを無視したい場合です。もしgitでコードを管理しているならたとえば .gitignoreに記述されるようなファイルのことです。

rgも使おう

この問題を解決するには、デフォルトのfindではなく別のコマンドを使ってシステムを横断しなければなりません。findコマンドは.gitignoreファイルを無視しません。これは単なるダミーの finder ユーティリティプログラムです。find の代わりに使うプログラムにはいくつかの選択肢があります。 私はripgrepを選びました。ここでの比較で説明したように、ripgrepは最速の検索ツールです。 ripgrepのインストールはとても簡単です。termnalでrunbrew install ripgrepを実行すると、Macにインストールできます。異なるプラットフォームにインストールする場合は、ここで説明する手順に従ってください。 インストール後、bashrcファイルでFZF_DEFAULT_COMMANDを以下のように設定する必要があります。

export FZF_DEFAULT_COMMAND='rg --files'

ここで--filesのオプションは

ripgrepが検索するであろうファイルをprintしますが、実際には検索しない

という意味です。

.gitignoreを利用しないで.rgignoreを使う

大きなプロジェクトになると、別の問題が出てきます。 gitignore に登録されている別のファイルがあっても、そのファイルを検索したい場合だ。

たとえば、Railsにはapplication.ymlというファイルがあります。これは通常はgitリポジトリにプッシュしませんが、それでもfzfで検索したいことはあるでしょう。

Ripgrep のドキュメントを見ると、検索するファイルの .gitignore を無視するオプション --no-ignore があります。 しかし、これでは先ほどまでやっていたことが無駄になってしまいます。

この問題を解決するために、プロジェクト内に .rgignore という特殊なファイルを作ることができることがわかりました。Ripgrepの公式ドキュメントには次のように書かれています。

.ignore (アプリケーションに依存しない) または .rgignore (ripgrep 特有の) ファイルで、追加の無視ルールやオーバーライドを指定することができます。 プロジェクトのルートフォルダに.rgignoreファイルを作成し、検索したいファイルを管理することができます。

たとえば.gitignoreでは無視してるが検索したいファイル名が wanttosearch.dat だった場合

!wamtosearch.dat

と書いておくことで検索対象に含めることができるわけです。