on master help sign in

A formatter for Haskell source code

git clone https://git.iko.soy/ormolu.git

Ormolu

License BSD3 Hackage Stackage Nightly Stackage LTS Build status

Ormolu is a formatter for Haskell source code. The project was created with the following goals in mind:

Building

The easiest way to build the project is with Nix:

$ nix-build -A ormolu

Or with cabal-install from the Nix shell:

$ nix-shell --run "cabal new-build"

Alternatively, stack could be used with a stack.yaml file as follows.

$ cat stack.yaml
resolver: lts-16.0
packages:
- '.'

$ stack build # to build
$ stack install # to install

To use Ormolu directly from GitHub with Nix, this snippet may come in handy:

# This overlay adds Ormolu straight from GitHub.
self: super:

let source = super.fetchFromGitHub {
      owner = "tweag";
      repo = "ormolu";
      rev = "de279d80122b287374d4ed87c7b630db1f157642"; # update as necessary
      sha256 = "0qrxfk62ww6b60ha9sqcgl4nb2n5fhf66a65wszjngwkybwlzmrv"; # as well
    };
    ormolu = import source { pkgs = self; };
in {
  haskell = super.haskell // {
    packages = super.haskell.packages // {
      "${ormolu.ormoluCompiler}" = super.haskell.packages.${ormolu.ormoluCompiler}.override {
        overrides = ormolu.ormoluOverlay;
      };
    };
  };
}

Usage

The following will print the formatted output to the standard output.

$ ormolu Module.hs

Add --mode inplace to replace the contents of the input file with the formatted output.

$ ormolu --mode inplace Module.hs

Use find to format a tree recursively:

$ ormolu --mode inplace $(find . -name '*.hs')

Magic comments

Ormolu understands two magic comments:

{- ORMOLU_DISABLE -}

and

{- ORMOLU_ENABLE -}

This allows us to disable formatting selectively for code between these markers or disable it for the entire file. To achieve the latter, just put {- ORMOLU_DISABLE -} at the very top. Note that the source code should still be parseable even without the “excluded” part. Because of that the magic comments cannot be placed arbitrary, but should rather enclose independent top-level definitions.

Current limitations

Running on Hackage

It's possible to try Ormolu on arbitrary packages from Hackage. For that execute (from the root of the cloned repo):

$ nix-build -A hackage.<package>

Then inspect result/log.txt for possible problems. The derivation will also contain formatted .hs files for inspection and original inputs with .hs-original extension (those are with CPP dropped, exactly what is fed into Ormolu).

Editor integration

We know of the following editor integrations:

Arch Linux

To install Ormolu on Arch Linux, one can use the package on AUR:

yay -S ormolu

Contributing

See CONTRIBUTING.md.

License

See LICENSE.md.

Copyright © 2018–present Tweag I/O