Emacs
=====

== SML modes ==

There are a few Emacs modes for SML.

* https://elpa.gnu.org/packages/sml-mode.html

* <!ViewGitFile(mlton,master,ide/emacs/mlton.el)> contains the Emacs lisp that <:StephenWeeks:> uses to interact with MLton (in addition to using `sml-mode`).

== MLB modes ==

There is a mode for editing <:MLBasis: ML Basis> files.

* <!ViewGitFile(mlton,master,ide/emacs/esml-mlb-mode.el)> (plus other files)

== Completion ==

* https://github.com/MatthewFluet/company-mlton[`company-mlton`]
+
_____
https://github.com/MatthewFluet/company-mlton[`company-mlton`] is a
https://company-mode.github.io/[`company-mode`] completion back-end for
MLton/Standard ML. It provides completion for Standard ML keywords and for
Standard ML (long) identifiers. Candidate completion identifiers for the latter
are loaded from a basis file created by `mlton` using `-show-basis file` or
`(*#showBasis "file"*)`.
_____

== Definitions and uses ==

There is a mode that supports the precise def-use information that
MLton can output.  It highlights definitions and uses and provides
commands for navigation (e.g., `jump-to-def`, `jump-to-next`,
`list-all-refs`).  It can be handy, for example, for navigating in the
MLton compiler source code.  See <:EmacsDefUseMode:> for further
information.

== Building in the background ==

Tired of manually starting/stopping/restarting builds after editing
files?  Now you don't have to.  See <:EmacsBgBuildMode:> for further
information.

== Error messages ==

MLton's error messages are not among those that the Emacs `next-error`
parser natively understands.  The easiest way to fix this is to add
the following to your `.emacs` to teach Emacs to recognize MLton's
error messages.

[source,cl]
----
(require 'compile)
(add-to-list 'compilation-error-regexp-alist 'mlton)
(add-to-list 'compilation-error-regexp-alist-alist
             '(mlton
               "^[[:space:]]*\\(\\(?:\\(Error\\)\\|\\(Warning\\)\\|\\(\\(?:\\(?:defn\\|spec\\) at\\)\\|\\(?:escape \\(?:from\\|to\\)\\)\\|\\(?:scoped at\\)\\)\\): \\(.+\\) \\([0-9]+\\)\\.\\([0-9]+\\)\\(?:-\\([0-9]+\\)\\.\\([0-9]+\\)\\)?\\.?\\)$"
               5 (6 . 8) (7 . 9) (3 . 4) 1))
----
