2015/06/05

Vim で CtrlP を使っている人もそこそこいるかと思いますが、ファイル検索が終わり文字をタイプした時に行を絞り込む部分(マッチャーと言います)がデフォルトの状態だと Vim script を使って処理される為、ファイル数が多くなるとモッサリして来ます。これを解消する為に幾らかの人が頑張っています。

FelikZ/ctrlp-py-matcher - GitHub

Fast vim CtrlP matcher based on python

https://github.com/FelikZ/ctrlp-py-matcher
JazzCore/ctrlp-cmatcher - GitHub

CtrlP C matching extension

https://github.com/JazzCore/ctrlp-cmatcher
junegunn/fzf - GitHub

A command-line fuzzy finder written in Go

https://github.com/junegunn/fzf

どれも決め手に掛けるなーと思っていたのですが、そんな中に突如現れたのが cpsm です。

nixprime/cpsm - GitHub

A CtrlP matcher, specialized for paths.

https://github.com/nixprime/cpsm

README.md に書いてありますが、cpsm は python 拡張で実装されしかもスレッドで起動します。他のマッチャーでもそうですが文字列のファジーマッチングは意外に処理時間が必要になります。cpsm では使用可能なスレッド数を自動取得した後、ファイル一覧に対して並列に先取りして処理を行います。全ての一覧に対してマッチ結果が得られたらソートして vim 側に返しています。

cpsm/python_extension_main.cc at 00315bdd583f5083a90a6d8c6e38eef2f2d72070 · nixprime/cpsm · GitHub

CtrlP ではファイル一覧の作成には初回だけ時間が掛かりますが、以後は有限時間付きのキャッシュが読み込まれます。マッチャーの速度次第では目にも留まらない速度でファイルを選択出来る様になります。

以下は ruby22 のディレクトリ直下(総ファイル 24685個)を CtrlP で表示し、fluentd.gemspec を開くまでの操作です。

※キャッシュは作成済みです。

cpsm

はえぇ...。しばらく常用しようと思います。

尚、CtrlP ではファイルの一覧についても外部の機能を使う事が出来ますが、僕は files というツールを使っています。

mattn/files - GitHub

Fast file find

https://github.com/mattn/files

files は golang で書かれており、-a を付ける事で goroutine を使ってディレクトリ階層を下ってファイル一覧を出力します。よろしければこちらもお使い下さい。

CtrlP についてのご意見などあれば、現在 ctrlpvim/ctrlp.vim のメンテナをやってますので twitter 等でお声掛け下さい。

Posted at 16:50 | WriteBacks () | Edit
Edit this entry...

wikieditish message: Ready to edit this entry.






















A quick preview will be rendered here when you click "Preview" button.