Dune can be set up to run automatic formatters for source code.
It can use ocamlformat to format OCaml source code (*.ml
and *.mli
files) and refmt to format Reason source code (*.re
and *.rei
files).
Furthermore it can be used to format code of any defined dialect (see :ref:`dialect`).
If using (lang dune 2.0)
, there is nothing to do, formatting will be set up
by default.
By default, formatting will be enabled for all languages and dialects present in
the project that dune knows about. This is not always desirable, for example if
in a mixed Reason/OCaml project, one only wants to format the Reason files to
avoid pulling ocamlformat
as a dependency.
It is possible to restrict the languages considered for formatting or disable it altogether by using the :ref:`formatting` stanza.
When this feature is active, an alias named fmt
is defined. When built, it
will format the source files in the corresponding project and display the
differences:
$ dune build @fmt --- hello.ml +++ hello.ml.formatted @@ -1,3 +1 @@ -let () = - print_endline - "hello, world" +let () = print_endline "hello, world"
It is then possible to accept the correction by calling dune promote
to
replace the source files by the corrected versions.
$ dune promote Promoting _build/default/hello.ml.formatted to hello.ml.
As usual with promotion, it is possible to combine these two steps by running
dune build @fmt --auto-promote
.
Note
This section applies only to projects with (lang dune 1.x)
.
In (lang dune 1.x)
, no formatting is done by default. This feature is
enabled by adding the following to the dune-project
file:
(using fmt 1.2)
Languages can be configured using the following syntax:
(using fmt 1.2 (enabled_for reason))
- Formatting is enabled by default.
- Format dialects (see :ref:`dialect`).
- Format Dune files.
- Format OCaml (using ocamlformat) and Reason (using refmt) source code.