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 の補完機能を利用できます.
起動速度への影響
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 を用いることで, 遅延読み込みやキャッシュを利用して, 起動速度の高速化を実現できる.
deinでローカルからプラグインを読み込んでいますが、dein#localではないですか?
自分の環境だとdein#addをした場合、githubから落としてこようとしてしまいます。
こちらの環境 (macOS 10.12.1 / vim 8.0.94 / dein.vim 36edfadb5f / OCaml 4.03.0 / Merlin 2.5.1) では dein#add で問題なく動いているようです.
設定は https://github.com/ymyzk/dotfiles/blob/e712d8ea736c1e9446ed8688ecb07b83a2c3ade8/.vim/config/20-dein_start.vim#L23-L25 のようになっています.
dein.vim の help (https://github.com/Shougo/dein.vim/blob/36edfadb5fabc442e907135f4da31cc3251c204f/doc/dein.txt#L116-L126) には “{repo} is the repository URI or local repository directory path.” とあるので, ローカルからもインストールできると解釈しています.
また, $(opam config var share)/merlin/vim が存在しない場合は, vim という名前のプラグインをダウンロードしてインストールしようとするようです.
参考になれば幸いです.