ctrlp.vimの使い方まとめ

ctrlp.vimとは
---------------------------
[ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim)は多機能セレクタとかそんな感じのvimプラグインです。
環境変わるのが嫌で、カラースキーマやシンタックス関係意外あんまりvimにプラグインとか入れたくない派だったんですが、CtrlPは見た目よくてわかりやすく、結構気にいったので長く使ってます。
似たプラグインとしてはUniteがあります。比較するとUniteの方が高機能でいろいろ出来、他のプラグインと連携も出来ますが設定がやや複雑かなって感じです。

インストール
-----------------------
pathogen:　適当なとこにgit clone

> git clone https://github.com/ctrlpvim/ctrlp.vim ~/.vim/bundle

NeoBundle:　.vimrcに書くだけ

> NeoBundle "ctrlpvim/ctrlp.vim"

使い方
-----------------------
Ctrl+pを押して適当に希望のファイル名っぽいのを入力すると勝手に絞り込んでくれます。便利。
例えば、railsかなんかを書いているとして、
> view

とか打ち込むと、
![5bdc55b6518b1ce68851b525b97a16d2.png](https://qiita-image-store.s3.amazonaws.com/0/12446/5a6673a6-c998-91b5-d5f6-b768424b8e40.png)
って感じでview以下だけうまく絞り込めます。
さらにこっからpost以下だけ見たいってときは、
> view/pos

とかすると、
![057977c6cccc5b312664bec6c35a765c.png](https://qiita-image-store.s3.amazonaws.com/0/12446/45494123-595c-b0da-6782-f445d2eff769.png)
と省略して入力してもいい感じに察して絞り込んでくれます。

また、git管理されてるディレクトリの中などで使うとルートフォルダっぽいとこを自動で認識して、そこ以下のファイルを再帰的に探してくれます。

検索にはいくつかのモードがあって、正規表現による絞り込みもできます。
使える正規表現の例とかは :help ctrlp-input-formats を読むのが一番いいです。

キーマッピング
------------------------
:help ctrlp-mappings するのが一番正確です。
デフォルトの設定でよくつかうやつだけ。

###全般
|キー|動作|
|:------|:-------|
|Ctrl+p|CtrlP起動|
|Ctrl+c,ESC|CtrlPを終了|
|Ctrl+d|フルパス検索モードとファイル名のみの検索モードを切り替え|
|Ctrl+r|正規表現検索モードと通常の検索モードを切り替え|
|Ctrl+f,Ctrl+b|検索対象（バッファとか）を切り替え|

###コマンドラインでの操作
|キー|動作|
|:------|:-------|
|Ctrl+j|下を選択|
|Ctrl+k|上を選択|
|Ctrl+a|カーソルを先頭に|
|Ctrl+e|カーソルを最後尾に|
|Ctrl+u|コマンドラインをクリア|
|Ctrl+n,Ctrl+p|コマンド入力履歴を辿る|
|Ctrl+\|コマンドラインにいろいろコピペできるダイアログを開く (レジスタとか)|
|Tab|ディレクトリ名を補完|

###ファイル操作
|キー|動作|
|:------|:-------|
|CR(Enter)|現在のウインドウで開く|
|Ctrl+t|新しいタブで開く|
|Ctrl+v|垂直分割して開く|
|Ctrl+s,Ctrl+CR|水平分割して開く|
|Ctrl+z|ファイルやディレクトリをマークする|
|Ctrl+o|ファイルをダイアログつきで開く。マークしてあるとマークしたファイルを全部開く|
|Ctrl+y|新しいファイルを現在のディレクトリに作成。マークしてあるとそのディレクトリに対して作成する|


Extensions
------------------------------
これまでの内容にも出てきましたが、CtrlPにはファイルだけでなく、さまざまなものを同じCtrlPインターフェイスで扱うための拡張が標準で付属しています。
標準で付属しているものの一覧は :help ctrlp-extensions にあります。
個人的に便利なやつをいくつか紹介します。

*CtrlPBuffer*
バッファセレクタとして使えます。

*CtrlPMRUFiles*
これまで開いたファイル履歴から絞り込みます。

*CtrlPMixed*
ファイル、バッファ、履歴を一度に絞り込みます。
ぶっちゃけこれで大体足りるといえば足りる。

*CtrlPQuickfix*
vimのquickfixと連携出来ます。
:grepとかと組み合わせて使うのがメインかも。

*CtrlPTag*
タグ一覧を表示、絞り込みできます。

*CtrlPLine*
現在のファイル内の各行を対象に絞り込みます。unite lineと大体一緒です。
簡易ファイル内grep的に使えます。

*CtrlPDir*
ディレクトリを検索してカレントディレクトリを切り替えたりできます。

設定例
-----------------------------
:help ctrlp-options を見るのが(ry
デフォルトのコマンドが結構長くてめんどくさいので、よく使うの中心に適当にキー割り当てするのがいいと思います。
自分はsをあんまり使わないのでPrefix扱いにしてます。Ctrl+pは切ってます。

```vim:.vimrc
" Prefix: s
nnoremap s <Nop>
nnoremap sa :<C-u>CtrlP<Space>
nnoremap sb :<C-u>CtrlPBuffer<CR>
nnoremap sd :<C-u>CtrlPDir<CR>
nnoremap sf :<C-u>CtrlP<CR>
nnoremap sl :<C-u>CtrlPLine<CR>
nnoremap sm :<C-u>CtrlPMRUFiles<CR>
nnoremap sq :<C-u>CtrlPQuickfix<CR>
nnoremap ss :<C-u>CtrlPMixed<CR>
nnoremap st :<C-u>CtrlPTag<CR>

let g:ctrlp_map = '<Nop>'
" Guess vcs root dir
let g:ctrlp_working_path_mode = 'ra'
" Open new file in current window
let g:ctrlp_open_new_file = 'r'
let g:ctrlp_extensions = ['tag', 'quickfix', 'dir', 'line', 'mixed']
let g:ctrlp_match_window = 'bottom,order:btt,min:1,max:18'
```

Extensionの作成
------------------------------
自分でctrlp-extensionを作ることもできます。それほど難しくはないです。
詳しくは[kaneshinさんによる記事](http://kaneshin.hateblo.jp/entry/vim-advent-calendar-2012)がわかりやすいです。
githubなどにいろんな方が作られたctrlp-extensionがあるので、探してみるのもいいと思います。

参考
------------------------------
*:help ctrlp*
[意外と知られていない便利なvimプラグイン「ctrlp.vim」](http://mattn.kaoriya.net/software/vim/20111228013428.htm)
[ctrlp.vimを使う](http://qiita.com/ArcCosine@github/items/5ece3f39481f6aab9bc5)

### 2014/8/9追記
ctrlp.vimの開発が https://github.com/kien/ctrlp.vim から https://github.com/ctrlpvim/ctrlp.vim に移ったのでリンクなどを更新しました。
経緯は http://vim-jp.org/blog/2014/08/08/ctrlpvim-not-die.html を参照してください。