この記事は、
Vim Advent Calendar 2011の記事です。欠番が出そうだったので、勝手ながら割り込ませて頂きます。
Vimを使って開発をする際、リポジトリ内のファイルにどうやってアクセスしていますか?NERDTree?vimshell?unite.vim?FuzzyFinder?
色んな方法があるかと思います。ただこれらは若干古かったりニュアンスが異なっていたり、物によっては開発に向かない物もあります。単純にファイルを選択するのであれば、それで事足りるでしょう。しかしながら本当に開きたいファイルを最短の方法で選ぶには、これまでの方法では時に無駄であったり、余計なお世話だったりもしました。
僕はバッファセレクタやファイルセレクタというのは使わない方なのですが、ちょっと前にこれを見つけて「おっ...よさげなインタフェース」と思った物があったので紹介しようと思います。
ctrlp.vim ÷ home
Full path fuzzy file, buffer and MRU file finder for Vim. » Written in pure Vimscript for MacV...
http://kien.github.com/ctrlp.vim/
ctrlp.vimの特徴は以下の通り。
- pure vimscriptで書かれている
- vimの正規表現を使った検索
- MRU(Most Recently Used)ファイルモニタリングおよび検索
- ルートディレクトリ検知
- 複数ファイルの同時オープン
- ファイルおよびディレクトリの作成
- 開いているファイル上でのExコマンド実行(行や文字列へジャンプ、もしくは他の動作)
- キャッシュと履歴を使ったクロスセッションと高速な初期化
- マッピングとvimとの親和性
インストールは上記サイトのリンクを辿ってgithubの物をgit cloneするのが良いでしょう。
起動するにはその名の通り
<c-p>
をタイプします。すると画面下部にファイル一覧が表示されるのが分かると思います。初回は検索とキャッシュに時間が掛かりますが、次回起動時にはそのキャッシュを使って高速に起動します。
さて何か文字を打ってみて下さい。文字を打つごとにファイルが絞り込まれているのが分かるかと思います。
この文字は連続していなくても構いません。例えば
/foo/bar/baz
/foo/bar/bar
この様なファイルが一覧されている場合に
> fooz
とタイプすると
/foo/bar/baz
に絞り込まれます。候補を選ぶには
<c-j>
と
<c-k>
で移動出来ます。入力のヒストリは
<c-n>
と
<c-p>
で参照可能。絞り込まれたらエンターキーを押してファイルを開きます。恐らく開発で使用する場合、同名のファイルで拡張子のみが異なる事が多いかと思います。C++であればソースとヘッダ、あるフォルダ配下にあるcssファイル、バージョン番号が付いたファイルなど人間がおおよそ見当の付く入力を行えば自然とファイルがマッチするという良くできた検索になっています。
またgit等VCSリポジトリ上であった場合には検索の範囲がリポジトリ内に限られるという親切な設計になっています。
ですので開発プロジェクトのフォルダの中であればどこにいても目的のファイルを開くこと出来ます。
実行中に
<c-r>
をタイプすると部分一致検索モードから正規表現検索モードにスイッチします。入力した文字を正規表現パターンとしてファイルを検索出来ます。
もう一度タイプすると通常モードに戻ります。また
<c-d>
でフルパスモードからファイル名モードへ、
<c-f>
でMRUファイル検索、
<c-b>
でバッファ検索へとスイッチ出来ます。
入力欄で / もしくは \ はプロジェクトのルートフォルダに相当し、.. による親フォルダの参照も可能です。
そしてパターンの後ろに
:
を付与すると、一覧に表示されているファイル群にコマンドを実行する事が出来ます。
abc:45
であればファイル abc の45行目にジャンプ、
abc:/my\:function
でファイルabc内で見つかる
my:function
へジャンプします。
任意の複数のファイルを開くには、候補一覧で
<c-z>
を使ってマークし、
<c-o>
をタイプします。
これだけあれば、「ファイル一覧→選択→検索開始」というアクションを一度に、しかも複数のファイルに対して行う事が出来ます。
さて、例えば日本語のファイルにマッチしたくなったとしたらどうしたいですか?
ctrlp.vim には日本語ファイル名にマッチ出来る仕組みが入っています。
cmigemo をインストールし、以下の様に vimrc に追記します。
let g:ctrlp_use_migemo = 1
なお、cmigemo の辞書ファイル migemo-dict は以下の位置に配置しておく必要があります。
~/.vim/dict/migemo-dict
もしくは以下の様にエンコーディング毎に格納しても良いです。
~/.vim/dict/utf-8/migemo-dict
ctrlp.vim を起動して、
<c-r>
をタイプして正規表現モードにスイッチします。通常であればここに正規表現パターンを入力するのですが、ここに
kanji
の様にmigemoのクエリを入力出来ます。クエリは空白文字列で分割出来るので、例えば
ore kyuuyo
とタイプすると
「俺の給与明細.xls」をマッチさせる事が出来ます。
これさえあれば、仕事中に給与明細をvimで開く事が出来ますね!