vim and ocaml (workaround for Dark)
Table of Contents
Vim has always been hard to set up, and more so with OCaml.
Here, I’ll show you a workaround on how to configure vim for it, and as a bonus, how to prepare it to contribute to Dark.
#
Lexicon
#
A New Beginning
For some reason, I had it working on my old laptop, but getting the exact same OCaml version and vimrc on my new one gets me a bunch of errors, hence the workaround: I am confident that I’ll make it work someday, but for now we’ll do a new vimrc and put back stuff from the old one.
-
Back up your current vimrc and delete it
$ mv ~/.vimrc ~/.vimrc.bak
-
Install OPAM
$ sh <(curl -sL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)>
-
Init OPAM
$ opam init
-
(optional) Create a switch for the OCaml version used in Dark
$ eval $(opam env)
$ opam switch create 4.06.1
$ eval $(opam env)
-
(Mac only) Install XQuartz to have X11
-
Install OCaml basic dependencies
$ opam update
$ opam upgrade
$ opam install base utop
$ opam install core async yojson core_extended core_bench cohttp-async async_graphics cryptokit menhir ocamlformat ocp-indent ocp-index user-setup
$ opam install merlin
-
(Workaround) If ocamlformat build crashed
This happens with OCaml 4.06.1, install an older version
$ opam install ocamlformat.0.12
-
(For VSCode) Install ocaml-lsp
$ opam pin add ocaml-lsp-server https://github.com/ocaml/ocaml-lsp.git
$ opam install ocaml-lsp-server
-
Now, let’s create the vimrc with the user-setup tool
$ opam user-setup install
This creates a basic vimrc with tpope’s vim-sensible defaults and the configuration for ocp-index, merlin and ocp-indent -
Add documentation to vim (run in vim)
:execute "helptags " . substitute(system('opam config var share'),'\n$',',''') . "/merlin/vim/doc"
So now, basic autocompletion is done (ctrl+x ctrl+n in insert mode to try it).
#
Set Up Linting and Fixing
##
Install vim-plug
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
Now in your vimrc, before " ## added by OPAM user-setup for vim / base ## 93ee63e278bdfc07d1139a748ed3fff2 ## you can edit, but keep this line
:
call plug#begin('~/.vim/plugged')
Plug 'dense-analysis/ale'
call plug#end()
In vim, run :PlugInstall
, and now you should get linting errors when
you open a OCaml file.
Below this code, add
let g:ale_fixers = {
\ '*': ['remove_trailing_lines', 'trim_whitespace'],
\ 'ocaml': ['ocamlformat', 'ocp-indent'],
\}
let g:ale_fix_on_save = 1