vimのファイル検索プラグインctrlp.vimの設定

vimのファイル検索用のプラグインctrlpを紹介します。
数あるvimのプラグインの中でも私の特にお気に入りのプラグインの1つです。

 

参考:私が使用している便利なプラグイン一覧
vim とても強力なプラグインたち

 

ctrlp.vimとは?

vimファイル検索用のプラグイン。
シンプルかつ高速にファイルを検索し、開くことができます。
検索には正規表現や曖昧検索による絞り込みもでき、隠しファイルの検索のオンオフを切り替えることができるなど、色々な機能が備わっていてとても重宝しています。

vimには色々なファイル検索用のプラグインがありますが、ctrlpは特にファイル検索が高速なように思います。

githubのkien/ctrlp.vimというかリポジトリで開発、管理されています。
現在は ctrlpvim/ctrlp.vim に移行して管理されています。

ctrlpvim/ctrlp.vimのgithubページはこちら。
https://github.com/ctrlpvim/ctrlp.vim

 

ちょっとした注意点

ctrlp.vimはファイルのキャッシュを作成し、そのキャッシュをもとにファイル検索を行います。
キャッシュを利用することで高速検索を実現しているのですね。

これが非常にありがたいのですが、ちょっとした弊害も。
新しいファイルを作成した場合、そのファイルはキャッシュに登録されていない訳です。
つまり、そのファイルはctrlpの検索で引っかからない訳です。

そこで、新しいファイルも探したい場合は以下のコマンドで一度キャッシュを消去する必要があります。

:CtrlPClearCache

CtrlPの”P”は大文字です。お間違えのないように。

 

カスタマイズ

私はプラグイン管理にdeinを使用しているため、deinでの設定(dein.toml内での設定)を以下に記述します。
deinを使用していない方は,hook_add = ”’ ~ ”’ で囲まれた部分を.vimrc等にコピーしてみてください。

特にお勧めの設定は、ファイル名を指定しないでvimを立ち上げた時に自動的にctrlpを起動する設定です。
この設定を使い、キーボードショートカットにvimの起動をわりあてようもんなら、一瞬で狙ったファイルをvimで開けるようになります。

[[plugins]]
repo = 'kien/ctrlp.vim'
hook_add = '''

	" # ctrlpバッファに入る時と出るときに使用する関数を定義
	" # lightline.vimで表示しているステータスラインとの衝突を避けるため
	let g:ctrlp_buffer_func = {
		\ 'enter': 'CtrlPEnter',
		\ 'exit': 'CtrlPLeave',
	\ }

	" # ctrlpに入るとき,ステータスラインの表示をoffに
	function! CtrlPEnter()
		set laststatus=0
	endfunction

	" # ctrlpから出るとき,ステータスラインの表示をonに
	function! CtrlPLeave()
		set laststatus=2
	endfunction

	" # ファイルを指定せずにvimを立ち上げた時に,自動的にctrlpを起動する
	function CtrlPIfEmpty()
		if @% == ""
			CtrlP ~/
		endif
	endfunction

	augroup AutoCtrlP
		autocmd!
		autocmd VimEnter * call CtrlPIfEmpty()
	augroup END

	" # ctrlpのキーマッピングを <C-p>から<Leader>eに変更
	" # yankround.vimで<C-p>を使用しているため,衝突回避
	let g:ctrlp_map = '<nop>'
	nnoremap <Leader>e :CtrlP ~/<CR>

	" # 日本語検索をoff(私は基本的にディレクトリやファイル名に日本語を使用しないので)
	let g:ctrlp_use_migemo = 0
	" # あいまい検索をoff
	let g:ctrlp_regexp = 1
	" # キャッシュを使用して検索を高速化
	let g:ctrlp_use_caching = 1
	" # vim終了時にキャッシュをクリアしない
	let g:ctrlp_clear_cache_on_exit = 0
	" # <C-r>でキャッシュをクリアして再検索
	let g:ctrlp_prompt_mappings = { 'PrtClearCache()': ['<C-r>'] }
	" # 検索の際に200[ms]のウェイトを入れる(1文字入力の度に検索結果がコロコロ変わるのが気に入らないため)
	let g:ctrlp_lazy_update = 200
	" # 検索結果の表示ウィンドウの設定,10件分を表示(それ以上になってもスクロールされる)
	let g:ctrlp_match_window = 'bottom,order:btt,min:1,max:10,results:50'
	" # 隠しファイルを表示しない
	let g:ctrlp_show_hidden = 0
	" # 検索してほしくないファイルやディレクトリを除外
	let g:ctrlp_custom_ignore = {
		\ 'dir':  '\v[\/]\.(git|hg|svn)$',
		\ 'file': '\v\.(exe|so|dll|o)$',
		\ 'link': 'some_bad_symbolic_links',
	\ }
	" # silver searcher をインストールして検索コマンドをagに置き換え
	" let g:ctrlp_user_command = "ag -g '\\.(cpp|hpp|c|h|py|txt|sh|bash|cfg|md|launch|xml|csv)$'"


'''

 

補足説明

function! CtrlPEnter(), CtrlpLeave()
lightline.vimでステータスラインを表示するために set laststatus=2 のオプションを使用しているのですが、このオプションがCtrlPのバッファでも発動すると見栄えが悪くなってしまいます。
(CtrlPバッファでステータスラインを表示する必要がないので。)

CtrlPEnter(), CtrlpLeave()という関数を定義してCtrlPを起動したときにはステータスラインの表示をオフに、CtrlPから抜けるタイミングでステータスラインの表示をオンにしています。

function! CtrlPIfEmpty()
ファイル名が空の場合にCtrlPを立ち上げてくれる関数を定義しています。
autocmdを用いて、vimがファイル名の指定なしで起動した場合にctrlpを呼びだすように設定しています。

ファイルを指定せずにvimを起動した際に開きたいファイルを高速で絞り込めるようになります。

キーマッピングの変更
Ctrl + p というキーマッピングが私の使用しているyankround.vimというプラグインの設定とバッティングしているため、キーマッピングを <C-p> から <Leader>e に変更しています。

<C-p>コマンドが他の設定と被っている場合にはctrlpの(もしくは被っている他のコマンド)のマッピングを変更してあげましょう。

 

追記(管理リポジトリの変更)

記事の上部でも少し記述しましたが、ctrlp.vimを管理しているリポジトリに変更がありました。
以前まではkein/ctrlp.vimというgithubのページで管理されていましたが、現在は

kein/ctrlp.vim   →   ctrlpvim/ctrlp.vim

というリポジトリに変更されています。

 

古いリポジトリ、kien/ctrlp.vimのreadmeに以下のような記述があります。

#This project is unmaintained You should use this fork instead.
このプロジェクトはもうメンテナンスされた無いから代わりにこっちをつかってね。

今後の更新はctrlpvim/ctrlp.vimというリポジトリで行われるようですので、
古いリポジトリのプラグインをお使いの方は早いうちに新しいリポジトリのものに更新した方が良いでしょう。

 

参考:私が使用している便利なプラグイン一覧
vim とても強力なプラグインたち