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
と書いておくことで検索対象に含めることができるわけです。