#+TITLE: lang/ocaml #+DATE: June 27, 2017 #+SINCE: v2.0.3 * Table of Contents :TOC: - [[#description][Description]] - [[#module-flags][Module Flags]] - [[#plugins][Plugins]] - [[#prerequisites][Prerequisites]] - [[#features][Features]] - [[#configuration][Configuration]] - [[#appendix][Appendix]] - [[#commands][Commands]] - [[#hacks][Hacks]] * Description This module adds [[https://ocaml.org/][OCaml]] support to Doom Emacs, powered by [[https://github.com/ocaml/tuareg][tuareg-mode]]. + Code completion, documentation look-up, code navigation and refactoring ([[https://github.com/ocaml/merlin/wiki/emacs-from-scratch][merlin]]) + Type, documentation and function argument display on idle ([[https://github.com/Khady/merlin-eldoc][merlin-eldoc]]) + REPL ([[https://github.com/ocaml-community/utop][utop]]) + Syntax-checking (~merlin~ with [[https://github.com/flycheck/flycheck-ocaml][flycheck-ocaml]]) + Auto-indentation ([[https://github.com/OCamlPro/ocp-indent][ocp-indent]]) + Code formatting ([[https://github.com/ocaml-ppx/ocamlformat][ocamlformat]]) + Dune file format ([[http://dune.build/][dune]]) ** Module Flags This module provides no flags. ** Plugins + [[https://github.com/ocaml/tuareg][tuareg]] + [[https://github.com/ocaml/merlin][merlin]] + [[https://github.com/Khady/merlin-eldoc][merlin-eldoc]] + [[https://github.com/OCamlPro/ocp-indent][ocp-indent]] + [[https://github.com/flycheck/flycheck-ocaml][flycheck-ocaml]]* + [[https://github.com/ocaml-community/utop][utop]]* + [[https://github.com/ocaml-ppx/ocamlformat][ocamlformat]]* + [[https://github.com/ocaml/dune][dune]] * Prerequisites This module has no hard dependencies, but it is recommanded that you install [[http://opam.ocaml.org/][opam]] and the following opam (optional) packages: #+BEGIN_SRC shell opam install merlin utop ocp-indent dune ocamlformat #+END_SRC * Features + The following files should have syntax highlighting support: ~.ml{i,p,y,}~, ~.eliom{i,}~, ~jbuild~, ~dune~, ~opam~ + =merlin-mode= is activated whenever a =.merlin= file is found (including in a parent directory) and =ocamlmerlin= executable is present + Line-based auto-indentation is provided by =ocp-indent=, if it is available. * Configuration + If =:completion company= is enabled then autocomplete is provided by =merlin= + When =:checkers syntax= is enabled then =flycheck-ocaml= is activated to do on-the-fly syntax/type checking via =merlin=, otherwise this is only done when the file is saved. + Spell checking is activated in comments if =:checkers spell= is active + A REPL is provided if =utop= is installed and =:tools eval= is active + If =:editor format= is enabled, the =ocamlformat= executable is available and there is an =.ocamlformat= file present then =format-all-buffer= is bound to =ocamlformat=, otherwise to =ocp-indent= + If =:editor multiple-cursors= is enabled then identifiers can be refactored with =v R= and multiple cursors (this correctly matches identifier occurrences according to scope, it is not purely a textual match) + If =:emacs imenu= is enabled then top level symbols (modules, type, functions, etc.) can be looked up using =SPC / i= Run =doom sync= to install all packages and =doom doctor= to diagnose missing tools. * Appendix ** Commands | Command | Key | Description | |------------------------------+-----------+-----------------------------------------------------------| | =merlin-type-enclosing= | =SPC m t= | display type under point | | =tuareg-find-alternate-file= | =SPC m a= | switch between =.ml= and =.mli= | | =merlin-locate= | =gd= | lookup definition | | =merlin-occurences= | =SPC c D= | lookup references | | =merlin-document= | =K= | lookup documentation | | =merlin-imenu= | =SPC / i= | symbol lookup in file | | =merlin-iedit-occurrences= | =v R= | visual refactor identifier under point (multiple cursors) | | =utop= | =SPC o r= | open =utop= as REPL | | =utop-eval-region= | =SPC c e= | evaluate selected region in =utop= | ** Hacks + =set-ligatures!= is called with the full tuareg prettify symbol list, this can cause columns to change as certain keywords are shortened (e.g. =fun= becomes \lambda. + =tuareg-opam-update-env= is called the first time =tuareg= is loaded