この文書は、VimでOCamlを快適に書くためにmerlinとocp-indentを導入する方法について書かれています。
merlinはコード補完とエラーチェックに、ocp-indentはコードフォーマットに使用します。
筆者の環境はOS X(10.11.2)です。
OCamlとOPAMのインストール
merlinとocp-indentをインストールする前に、OCamlとそのパッケージマネージャであるOPAMをインストールする必要があります。
どちらもHomebrewでインストールできるため、特に手間はかかりません。
$ brew install ocaml --with-x11
$ brew install opam
OCamlの方に--with-x11
をつけたのは、Graphicsを導入するためです。必要ない方はつける必要はありません。
自分の場合、 OCamlはバージョン4.02.3が、OPAMはバージョン1.2.2がインストールされました。
merlinとocp-indentのインストール
OPAMを使って、 merlin と ocp-indent をインストールします。
$ opam install merlin
$ opam install ocp-indent
自分の場合、merlinはバージョン2.2が、ocp-indentはバージョン1.5.2がインストールされました。
実はこの2つをインストールした直後に、それぞれEmacsとVimの設定について書かれたメッセージが表示されているので、後はそれに従うだけで設定が完了します。
Vimの設定
merlinの設定
vimrcに以下のように記述します。
let g:opamshare = substitute(system('opam config var share'),'\n$','','''')
execute 'set rtp+=' . g:opamshare . '/merlin/vim'
これにより、コード補完ができるようになりました。また:MerlinErrorCheck
で、エラーチェックができるようになりました。
保存時に自動的にエラーチェックを行う
シンタックスチェックのためのプラグインであるsyntashticを導入して、保存した時に自動的にエラーチェックが走るようにします。
syntasticのインストールはNeoBundleであれば、vimrcに以下のように書きます。
NeoBundle 'scrooloose/syntastic'
加えて以下の設定をvimrcに記述します。
let g:syntastic_ocaml_checkers = ['merlin']
これにより保存時に自動的にエラーチェックが行われるようになります。
これは最低限の設定で、syntasticは他にも様々な設定ができますが、それについては省略します。
ocp-indentの設定
vimrcに以下のように記述します。
execute 'set rtp^=' . g:opamshare . '/ocp-indent/vim'
g:opamshareについてはmerlinのインストール時に設定したものをそのまま使っています。ocp-indentだけ設定したい方は、merlinの方の該当行をコピーしてください。
保存時に全体をフォーマットする
ocp-indentはCLIとしても提供されているため、以下のようにして保存時にバッファ全体に対してocp-indentを仕掛けることができます。
function! s:ocaml_format()
let now_line = line('.')
exec ':%! ocp-indent'
exec ':' . now_line
endfunction
augroup ocaml_format
autocmd!
autocmd BufWrite,FileWritePre,FileAppendPre *.mli\= call s:ocaml_format()
augroup END
参考文献
https://github.com/the-lambda-church/merlin/wiki/vim-from-scratch
https://www.typerex.org/ocp-indent.html (このページのvim設定は誤り)