---
breaks: false
tags: public-tech
---
# Vim で OCaml を書く
この記事は [OCaml Tips Advent Calendar 2022](https://adventar.org/calendars/8396) の5日目です。
OCaml を書く場合 Emacs が超絶に便利な(らしい)ので、
普通は Emacs で書くのがよいと思います[^emacs-ocaml]。
ただし、私のように指に Vim のキーバインドが焼き付いてしまった人は、仕方がないので
[ocaml-lsp](https://github.com/ocaml/ocaml-lsp) を使いましょう。
[^emacs-ocaml]: Emacs で [F*](https://www.fstar-lang.org/) は書くんですが OCaml を書いたことがないので、これは伝聞です。
ocaml-lsp をそのまま入れて設定しても良いですが、`vim-lsp` と `vim-lsp-settings`
を入れて、OCaml ファイルを開いた状態で `:LspInstallServer` すると楽です。
ただし、ocaml-lsp が要求する OCaml バージョンが定期的に更新されたり、
インストール方法が定期的に変更されたりするため、これが動かなくなっていることがあります
(ありました)。そういう場合は ocaml-lsp の README に書かれている手順と
`vim-lsp-settings` の [OCaml 用セットアップスクリプト](https://github.com/mattn/vim-lsp-settings/blob/master/installer/install-ocaml-lsp.sh)を眺めて、修正して
PR を送ると良いと思います([送り](https://github.com/mattn/vim-lsp-settings/pull/549) [ました](https://github.com/mattn/vim-lsp-settings/pull/638))。
あとフォーマッタには [OCamlFormat](https://github.com/ocaml-ppx/ocamlformat) が便利です。これは `opam install ocamlformat` で入ります。
Vim 側は [Neoformat](https://github.com/sbdchd/neoformat) が対応しています。
例えば次のように設定しておくと動作します。
```vim=
let g:neoformat_enabled_ocaml = ['ocamlformat']
let g:neoformat_ocaml_ocamlformat = {
\ 'exe': 'ocamlformat',
\ 'no_append': 1,
\ 'stdin': 1,
\ 'args': ['--enable-outside-detected-project', '--name', '"%:p"', '-']
\ }
```