dein.vim を用いて Merlin を遅延読み込みする

Merlin は OCaml のための Vim や Emacs から利用可能な補完機能を提供しています. デフォルトの Vim プラグインのインストール方法では, Vim の起動速度に悪影響を与えるため, プラグインマネージャー dein.vim を用いて遅延読み込みする方法を紹介します.

Merlin のセットアップ

Merlin は OPAM を使うと簡単にインストールできます.

opam install merlin

Merlin のインストールが完了すると, 次のような Vim のセットアップ手順が表示されます.

Quick setup for VIM
-------------------
Append this to your .vimrc to add merlin to vim's runtime-path:
let g:opamshare = substitute(system('opam config var share'),'\n$','','''')
execute "set rtp+=" . g:opamshare . "/merlin/vim"

Also run the following line in vim to index the documentation:
:execute "helptags " . g:opamshare . "/merlin/vim/doc"

この手順に従い, 以下を .vimrc 等に追記します.

let g:opamshare = substitute(system('opam config var share'),'\n$','','''')
execute "set rtp+=" . g:opamshare . "/merlin/vim"

次に補完用のプラグインから Merlin を使うための設定を追加します. ここでは neocomplete.vim を利用します.

if !exists('g:neocomplete#sources#omni#input_patterns')
  let g:neocomplete#sources#omni#input_patterns = {}
endif
let g:neocomplete#sources#omni#input_patterns.ocaml = '[^. *\t]\.\w*\|\h\w*|#'

ここまでの設定が終わると, neocomplete を通じて Merlin の補完機能を利用できます.

merlin-sample

起動速度への影響

execute "set rtp+=" . g:opamshare . "/merlin/vim" のようにして Vim プラグインを読み込むと, ファイル形式に関わらずこのプラグインが読み込まれるため, 少なからず起動速度に影響があります.

vim --startuptime を利用して起動速度を計測したところ, Merlin 導入前の起動速度が約100msだったところが, Merlin 導入後は約130msとなっていました. 約30msは体感できる程度の違いがあります.

dein.vim を使った読み込み

dein#add は引数として, GitHub 等のリポジトリだけでなく, ローカルのパスも指定できます. execute "set rtp+=" . g:opamshare . "/merlin/vim" の部分を以下のように書き換えると, dein.vim を通して Merlin を読み込めます.

call dein#add(g:opamshare . "/merlin/vim")

さらに, オプションを指定することで, filetype が OCaml で insert mode に入ったタイミングでプラグインを読み込むように設定できます.

call dein#add(g:opamshare . "/merlin/vim", {'lazy': 1, 'on_ft': 'ocaml', 'on_event': 'InsertEnter'})

遅延読み込みを行うことで, Vim の起動時間を再び約100ms程度に戻すことができました.

まとめ

  • dein#add はローカルのパスを指定してプラグインを読み込むことができる.
  • プラグインが推奨している設定方法ではなく dein.vim を用いることで, 遅延読み込みやキャッシュを利用して, 起動速度の高速化を実現できる.