vim-startify を unite.vim で代替してみる


上記の記事で起動時にいろいろと表示する vim-startify というプラグインが紹介されているのですが
それ unite.vim でできるよ!
と思ったのでやってみました。

[表示するもの]

  • 直前に開いたファイル
  • 直前に開いたディレクト
  • 任意のファイルやコマンドなど

[直前に開いたファイルやディレクトリを表示]

まずは 直前に開いたファイルやディレクトリを表示してみます。
unite.vim には file_mru と directory_mru があるのでそれを利用します。

Unite file_mru directory_mru


※表示されている日数が古いのは気にしないでください。

[表示する個数を制限する]

上記の画像を見も分かる通り file_mru や directory_mru は表示される候補が多いので vim-startify のように1つの画面に収めようとするのは難しいです。
そこで次のように g:unite_source_alias_aliases を利用して表示する個数を制限します。

let g:unite_source_alias_aliases = {
\   "startup_file_mru" : {
\       "source" : "file_mru",
\   },
\   "startup_directory_mru" : {
\       "source" : "directory_mru",
\   },
\}

call unite#custom_max_candidates("startup_file_mru", 5)
call unite#custom_max_candidates("startup_directory_mru", 5)

" g:unite_source_alias_aliases に設定した source 名を使用する
Unite startup_file_mru startup_directory_mru


g:unite_source_alias_aliases を利用することで元の file_mru 等に影響しない設定を行うことができます。

[任意のファイルやコマンドなどを表示する]

unte-menu を使用すれば任意のコマンドなどを予め設定しておき、それを unite.vim で出力する事ができます。
今回はそれを利用します。

if !exists("g:unite_source_menu_menus")
    let g:unite_source_menu_menus = {}
endif

" ここで設定したリストは
" :Unite menu:startup
" で出力する事ができる。
let g:unite_source_menu_menus.startup = {
\   "description" : "startup menu",
\   "command_candidates" : [
\       [ "vimrc",  "edit " . $MYVIMRC ],
\       [ "gvimrc", "edit " . $MYGVIMRC ],
\       [ "unite-file_mru", "Unite file_mru" ],
\       [ "unite-directory_mru", "Unite directory_mru" ],
\   ]
\}

Unite startup_file_mru startup_directory_mru menu:startup


あとそろそろコマンドが長くなってきたので専用の command を定義してみます。

command! UniteStartup
\   Unite
\   startup_file_mru
\   startup_directory_mru
\   menu:startup

[左側に出てくる source 名を非表示にする]

好みの問題なんですが、unite.vim で複数の source を起動した場合、左側に source 名が表示されます。
今回はなるべく簡素な表示にしたいのでこれを非表示にします。

" -hide-source-names を使用する
command! UniteStartup
\   Unite
\   startup_file_mru
\   startup_directory_mru
\   menu:startup
\   -hide-source-names


あとこのままだとちょっと見づらいので unite-output を使用して見やすくしてみます。
ついでに split しないで全画面で表示するようにしてみます。

" unite-output で適用に余白を追加して見やすくしてみる
" 引数にスペースを使用する場合は \ でエスケープする必要があるので注意
" -no-split で split をしない
command! UniteStartup
\   Unite
\   output:echo\ "===\ file\ mru\ ===" startup_file_mru
\   output:echo\ "\ "
\   output:echo\ "===\ directory\ mru\ ===" startup_directory_mru
\   output:echo\ "\ "
\   output:echo\ "===\ menu\ ===" menu:startup
\   -hide-source-names
\   -no-split


これでだいぶ見やすくなったと思います。

[追記1]

unite-output は次のようにして書くこともできるようです。

" : 区切りで複数の引数が渡せる
command! UniteStartup
\   Unite
\   output:echo:"===:file:mru:===" startup_file_mru
\   output:echo:":"
\   output:echo:"===:directory:mru:===" startup_directory_mru
\   output:echo:":"
\   output:echo:"===:menu:===" menu:startup
\   -hide-source-names
\   -no-split

[クイックマッチを利用する]

vim-startify では各候補にショートカットキーが割り当てられています。
便利なことに unite.vim でもこういう機能は既に用意されています。

" -quick-match を追加
command! UniteStartup
\   Unite
\   output:echo\ "===\ file\ mru\ ===" startup_file_mru
\   output:echo\ "\ "
\   output:echo\ "===\ directory\ mru\ ===" startup_directory_mru
\   output:echo\ "\ "
\   output:echo\ "===\ menu\ ===" menu:startup
\   -hide-source-names
\   -no-split
\   -quick-match


これで完成です(output した候補にも quick-match のキーが割り当てられるのはちょっと気になりますが。

[追記2]

以下の機能を実装してもらいました。

" output の最後の引数に ! を渡せば dummy として扱われる
command! UniteStartup
\   Unite
\   output:echo:"===:file:mru:===":! startup_file_mru
\   output:echo:":":!
\   output:echo:"===:directory:mru:===":! startup_directory_mru
\   output:echo:":":!
\   output:echo:"===:menu:===":! menu:startup
\   -hide-source-names
\   -no-split
\   -quick-match


これで output した候補は quick-match のキーが割り当てられません。


あとは VimEnter などで Vim の起動時に unite.vim を起動するようにすればよいと思います。

augroup startup
    autocmd!
    autocmd VimEnter * nested :UniteStartup
augroup END


今回は file_mru と directory_mru と menu しか使用しませんでしたが他にも色々と表示するようにすれば便利だと思います。