unite.vimでテキトーにファイルやディレクトリを開く

Vimでunite.vimを使ってファイルを開いたり、ディレクトリに移動したりするのを楽にしたいと思って書いた設定について。

ファイル

ctrlp.vimというのが似たようなことをやってくれるプラグインらしいが、unite.vimで出来そうだったのでだいぶ前に書いたやつ。

" yankroundが有効な場合は前の候補へ、yankroundが有効でない場合はUniteを実行する
nmap <expr><C-p> yankround#is_active() ? "\<Plug>(yankround-prev)" : ":<C-u>execute
      \ 'Unite'
      \ '-start-insert'
      \ 'buffer file_mru'
      \ 'file:'.fnameescape(expand('%:p:h'))
      \ (isdirectory(getcwd().'/.git') ?
      \      'file_rec/git:--cached:--others:--exclude-standard' :
      \      'file_rec/async')
      \ <CR>"

yankroundを使っているのでそれの処理が入っている。

カレントディレクトリによってfile_rec/gitfile_rec/asyncかを切り替えるのはfile_rec/asyncとfile_rec/gitを自動的に切り換えるを参考にした。

これで<C-p>を押すとバッファ、ファイル履歴、カレントディレクトリのファイル、カレントディレクトリ以下のファイルをテキトーに絞り込んで開ける。

ちなみに30,000ファイル近くあるリポジトリではunite.vimのウィンドウを表示するのにそれなりに良いスペックのMacBook Proでも数秒かかるので、検索しなくて良いディレクトリやVimで開くことはないであろうファイルは除外しておくとかなり早く開けるようになる。

let s:unite_ignore_file_rec_patterns=
      \ ''
      \ .'vendor/bundle\|.bundle/\|\.sass-cache/\|'
      \ .'node_modules/\|bower_components/\|'
      \ .'\.\(bmp\|gif\|jpe\?g\|png\|webp\|ai\|psd\)"\?$'

call unite#custom#source(
      \ 'file_rec/async,file_rec/git',
      \ 'ignore_pattern',
      \ s:unite_ignore_file_rec_patterns)

ディレクトリ

<C-p>でテキトーにファイルを開けるようになったのだけど、ディレクトリもテキトーに移動したいと思い最近追加した設定。<C-p>がファイルなのでとりあえず隣の<C-@>にしておいた。

nnoremap <C-@> :<C-u>Unite
      \ -start-insert -default-action=vimfiler
      \ directory directory_mru directory_rec/async
      \ <CR>

テキトーに絞り込んだディレクトリをVimFilerで開ける。

これもファイルと同じく表示する必要のないディレクトリは除外しておくとかなり早く開けるようになる。

let s:unite_ignore_directory_patterns=
      \ ''
      \ .'vendor/bundle\|.bundle/\|\.sass-cache/\|'
      \ .'node_modules/\|bower_components/'

call unite#custom#source(
      \ 'directory_mru,directory_rec/async',
      \ 'ignore_pattern',
      \ s:unite_ignore_directory_patterns)

ちなみにunite.vimのヘルプにもあるg:unite_source_rec_async_commandptコマンドを指定すると、二度目以降ディレクトリの他にファイルが混ざる。

具体的には以下のような設定。

let g:unite_source_rec_async_command='pt --nocolor --nogroup -g .'

ファイルやディレクトリの列挙だけなら標準のfindの方が速いので、g:unite_source_grep_commandだけにptを指定するようにした。

最近はVimを全然いじっていなかったのだけど、またこれで少し快適になる気がする。一方でカスタマイズしすぎたVimにどんどん依存していっていることになるのだけど……