Vim

ctrlp.vimの使い方まとめ

More than 1 year has passed since last update.

ctrlp.vimとは

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
って感じでview以下だけうまく絞り込めます。
さらにこっからpost以下だけ見たいってときは、

view/pos

とかすると、
057977c6cccc5b312664bec6c35a765c.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は切ってます。

.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さんによる記事がわかりやすいです。
githubなどにいろんな方が作られたctrlp-extensionがあるので、探してみるのもいいと思います。

参考

:help ctrlp
意外と知られていない便利なvimプラグイン「ctrlp.vim」
ctrlp.vimを使う

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 を参照してください。