haskell-formatter: Haskell source code formatter

[ development, gpl, library, mit, program ] [ Propose Tags ]

The Haskell Formatter formats Haskell source code. It is strict in that it fundamentally rearranges code.

[Skip to Readme]
Versions [faq] 0.1.0, 1.0.0, 2.0.0, 2.0.1
Dependencies base (>=4.6 && <5), containers, directory, filepath, haskell-formatter, haskell-src-exts, optparse-applicative, scientific, text, unordered-containers, yaml [details]
License MIT
Copyright (C) 2014–2019 Benjamin Fischer
Author Benjamin Fischer
Maintainer Benjamin Fischer <benjamin.fischer@evolutics.info>
Category Development
Home page https://github.com/evolutics/haskell-formatter.git#readme
Bug tracker https://github.com/evolutics/haskell-formatter.git/issues
Source repo head: git clone https://github.com/evolutics/haskell-formatter.git
Uploaded by evolutics at Sun May 26 12:06:29 UTC 2019
Distributions NixOS:2.0.1
Executables haskell-formatter
Downloads 1120 total (95 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2019-05-26 [all 1 reports]


[Index] [Quick Jump]


Maintainer's Corner

For package maintainers and hackage trustees

Readme for haskell-formatter-2.0.1

[back to package description]

Haskell Formatter

Build License Package

The Haskell Formatter formats Haskell source code. It is strict in that it fundamentally rearranges code.


Install it by running

stack install haskell-formatter


cabal new-install haskell-formatter

You are ready when

haskell-formatter --help




Read source code from Input.hs, format it, and write it to Output.hs by

haskell-formatter --input Input.hs --output Output.hs

If the input or output file is not given, it defaults to the corresponding standard stream. This allows commands like

haskell-formatter < Input.hs

To format a file in-place, use the --force option as in

# Warning: this overwrites the file `Code.hs`.
haskell-formatter --force --input Code.hs --output Code.hs

For more help about the usage, call

haskell-formatter --help

Formatting Many Files

For a diff of how code in the current folder would be formatted, without actually changing anything, run

find . -name '*.hs' -type f -print0 \
  | xargs -0 -n 1 bash -c 'haskell-formatter < "$@" | diff -u "$@" -' --

The returned exit status is nonzero if there are unformatted files. This may be useful for continuous integration.

To format any *.hs files in a folder code/ or (recursively) in its subfolders, run

# Warning: this overwrites files, so better back them up first.
find code/ -name '*.hs' -type f -print0 \
  | xargs -0 -I {} -n 1 haskell-formatter --force --input {} --output {}

Style Configuration

The formatting style can be configured with a file referred by the --style option. For instance, the call

haskell-formatter --style my_style.yaml --input Input.hs --output Output.hs

uses my_style.yaml as a style file. Such files are in the YAML format. The following is an example style file, which at the same time shows the available keys with their default values.

<!--- GitHub does currently not allow to include files (https://github.com/github/markup/issues/346).

Thus, the file content is replicated here. There is a test which checks that the strings of both sources are equal. --->

# Lines should be no longer than this length in characters.
line_length_limit: 80

# How much to spread code over multiple lines instead of trying to fill a single
# line. More precisely, this guides the ratio of "line_length_limit" to the
# ribbon length (the number of characters on a line without leading and trailing
# whitespace). Only the lowest value of 1 forces "line_length_limit" to be
# applied strictly.
# Reference: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=
ribbons_per_line: 1

# More than this number of empty lines in succession are merged.
successive_empty_lines_limit: 1

# Indentation lengths in characters.
    class:  8    # "class" and "instance" declarations.
    do:     3    # "do" notation. 
    case:   4    # Body of "case" expressions.
    let:    4    # Declarations in "let" expressions.
    where:  6    # Declarations in "where" clauses.
    onside: 2    # Continuation lines which would otherwise be offside.

# Decides which parts of the code to sort.
    # Sequence of import declarations.
    import_declarations: true

    # Entities of import lists.
    import_entities: true

Related Projects

You may like to have a look at the following projects, which aim at formatting Haskell code, too.