Vim の Command-T によるファイル検索とおすすめの設定

More than 3 years have passed since last update.

Vim でファイルを開くのに Command-T を使い始めてから2年経ちました。十分に速く、便利なので重宝しています。

ここでは Command-T についての短い説明と、私のおすすめの設定を紹介したいと思います。


短い説明

作者である Greg Hurrell 氏が次のように説明しています。


Command-T プラグインを使えば、非常に高速で直感的なファイル検索が、最小のキーストロークでできるようになります。TextMate のキーバインドからアイデアを得たので "Command-T" という名前にしました。

ファイルはパスでインクリメンタル検索され、かつ、検索キーワードに対して関連の高いパスを順に一覧します。例えば、あるディレクトリの直下のディレクトリ名、ファイル名をキーワードに優先してヒットさせます。

http://www.vim.org/scripts/script.php?script_id=3025


私は普段フレームワークコードを含めて 4800 程度のフロントエンドのファイルを扱っています。Command-T は上記の重みづけのアルゴリズムによって、少ないキーワードでディレクトリの深くにあるうろ覚えのファイルをほぼ意図どおりに見つけることができてしまうのが特徴です。また多少typoしても上位に表示されることが多いです。

インストール方法は vim.org のページが簡潔ですので、ぜひ試してみてください。利用に当たって、VimがRubyサポートバージョンであること、C拡張のコンパイルも必要であることに注意してください。


よく使うコマンド

およそ作業中に使うコマンドは下の2つです。自由なキーに割り当てると良いと思います。


:CommandT <対象ディレクトリ>

対象ディレクトリの配下にあるファイルを対象に検索します。


:CommandTBuffer

バッファから検索します。


おすすめの設定

使い込んでいると、少し気になる挙動があります。これを解決する、おすすめの設定を紹介したいと思います。あなたの設定の参考になれば幸いですが、言ってることが結構細かいので注意してください。

こちらがCommand-Tの私の設定です。

""""""""""""""""""""""""""""""""

" Key Maps -- Command-T
""""""""""""""""""""""""""""""""
let s:commandTHeight=18
let g:CommandTMaxHeight=s:commandTHeight
let g:CommandTMinHeight=s:commandTHeight
let g:CommandTClearMap=['<C-u>', '<C-w>']
let g:CommandTCancelMap=['<C-[>', '<C-c>', '<Esc>']
let g:CommandTMaxDepth=20
nnoremap ,t :CommandTFlush<CR>\|:CommandT<Space><UP>
nnoremap <silent> ,l :CommandTFlush<CR>\|:CommandT<CR>
nnoremap <silent> ,b :CommandTFlush<CR>\|:CommandTBuffer<CR>


検索結果を同じ高さにする

デフォルトの設定では検索結果を画面いっぱいに表示します。これをインクリメンタル検索で絞り込むと、検索結果上位の表示位置が徐々に下がっていき、目で追うのが辛いです。

検索結果上位が上部に表示されますが・・・

full.png

絞り込むと下に移動して目で追わなくてはなりません。

part.png

これを回避するために、表示領域の高さを固定する設定をします。

let s:commandTHeight=18

let g:CommandTMaxHeight=s:commandTHeight
let g:CommandTMinHeight=s:commandTHeight

fixed.png

これによって、結果が絞り込まれても検索上位の位置が変化せず、目に優しくなりました。


過去の <対象ディレクトリ> から選べるようにする

作業中の <対象ディレクトリ> は、およそ5種類程度なのではないでしょうか。毎回入力するのは面倒です。また前回指定した <対象ディレクトリ> が最初に入っていると、都合がいい事が多いのではないでしょうか。

nnoremap  ,t :CommandTFlush<CR>\|:CommandT<Space><UP>

ここではキーバインドに ,t を指定しています。上のように設定することで、Command-T の引数として前回入力したディレクトリを表示します。例えば前回の <対象ディレクトリ>web/WEB-INF だった場合、

:CommandT web/WEB-INF

とコマンドエリアに表示され、Enter で検索が始まります。また UP(上キー)で、前々回のディレクトリを表示します。UPを押すたびに、

:CommandT web/js

:CommandT web/css

:CommandT src

といったように、コマンド履歴をたどる要領で、ディレクトリを絞り込んでから検索を始めることができ便利です。

書いていて思った以上に細かいネタになり動揺していますが、こちらからは以上です。