暇人じゃない

Vim の CtrlP が動かなくなっていたので設定を見直した
Vim

この前の記事 で書いたが、久しぶりに Vim を使ったらファジーファインダーの CtrlP が動かなくなっていた。文字を入力して絞り込もうとしたら NO ENTRIES と表示される状態。

CtrlP 自体が悪いのではなく、高速化のために ctrlp-cmatcher という C で実装された matcher を使っていたのだが、これが悪さをしていた。 2018 年に以下の Issue が報告されており、モジュールが Python 2 用に書かれているのが原因ではないか、ということだった。Python 2 用に Vim をコンパイルするのは避けたい。

皆さんどうしているのだろうか、fzf に移行するのも面倒だなあ、と検索してみたところ、以下の記事を見つけた。

CtrlP のメンテナである mattn さんの記事。記事の最後あたりで mattn さんが作られた ctrlp-matchfuzzy という matcher を紹介されている。 2020/09 頃 Vim 本体に matchfuzzy() という組み込み関数が入り、これを使えばファイル数の多いディレクトリでもサクサク絞り込みができるらしい。

早速インストールして、ctrlp-matchfuzzy を使用する設定を追加。

let g:ctrlp_match_func = { 'match' : 'ctrlp_matchfuzzy#matcher' }

バッチリ動いたのだが、そもそも 1000 - 2000 件くらいのファイル数では体感的な違いはなかったので、CtrlP だけで使っても問題なさそう、というオチ。

.gitignore に指定したファイルを一覧から除外する

ファイルが絞り込めるようになったのは良かったものの、あるリポジトリでファイル一覧を表示するのに 10 秒くらい待つようになってしまった。 調べてみると、Rails の Active Storage などが使用する storage ディレクトリなど、絞り込みに不要なディレクトリもキャッシュに含まれているようだった。

wildignore オプションにいちいちディレクトリを追加するのも面倒だなあ、.gitignore を見て除外してくれないかなあ、と CtrlP の README を見ていたら、まさに .gitignore を考慮してファイル一覧を表示してくれる設定があった。

let g:ctrlp_user_command = ['.git', 'cd %s && git ls-files -co --exclude-standard']

ctrlp_user_command というオプションで、CtrlP がファイル一覧を生成する時に使用するコマンドをカスタマイズできる。 git ls-files コマンドの --exclude-standard オプションで、ディレクトリの .gitignore とユーザーのグローバルな .gitignore に指定しているファイルを除外する。

これで快適に CtrlP を使えるようになった。


About

chocoby (GitHub / Twitter)

個人事業主のソフトウェア開発者です。 Ruby と Rails を使った Web サービスの開発を得意としています。

CurryBu というサービスや、jp_prefecture という Gem を作っています。