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 を用いることで, 遅延読み込みやキャッシュを利用して, 起動速度の高速化を実現できる.

「dein.vim を用いて Merlin を遅延読み込みする」への2件のフィードバック

  1. deinでローカルからプラグインを読み込んでいますが、dein#localではないですか?
    自分の環境だとdein#addをした場合、githubから落としてこようとしてしまいます。

    1. こちらの環境 (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 という名前のプラグインをダウンロードしてインストールしようとするようです.
      参考になれば幸いです.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください