BSD-3-Clause licensed by Chris Done, Andrew Gibiansky, Tobias Pflug, Pierre Radermecker
Maintained by [email protected]
This version can be pinned in stack with:hindent-5.2.3@sha256:5b7be78995f86adc8131a718301ff78c81f23104e34e2376482b7b539d650283,3269

Module documentation for 5.2.3

hindent Hackage Build Status

Haskell pretty printer

Demonstration site

Examples

Install

$ stack install hindent

Usage

$ hindent --help
hindent --version --help --style STYLE --line-length <...> --indent-size <...> --no-force-newline [-X<...>]* [<FILENAME>]
Version 5.1.1
Default --indent-size is 2. Specify --indent-size 4 if you prefer that.
-X to pass extensions e.g. -XMagicHash etc.
The --style option is now ignored, but preserved for backwards-compatibility.
Johan Tibell is the default and only style.

hindent is used in a pipeline style

$ cat path/to/sourcefile.hs | hindent

The default indentation size is 2 spaces. Configure indentation size with --indent-size:

$ echo 'example = case x of Just p -> foo bar' | hindent --indent-size 2; echo
example =
  case x of
    Just p -> foo bar
$ echo 'example = case x of Just p -> foo bar' | hindent --indent-size 4; echo
example =
    case x of
        Just p -> foo bar

Customization

Create a .hindent.yaml file in your project directory or in your ~/ home directory. The following fields are accepted and are the default:

indent-size: 2
line-length: 80
force-trailing-newline: true

By default, HIndent preserves the newline or lack of newline in your input. With force-trailing-newline, it will make sure there is always a trailing newline.

Emacs

In elisp/hindent.el there is hindent-mode, which provides keybindings to reindent parts of the buffer:

  • M-q reformats the current declaration. When inside a comment, it fills the current paragraph instead, like the standard M-q.
  • C-M-\ reformats the current region.

To enable it, add the following to your init file:

(add-to-list 'load-path "/path/to/hindent/elisp")
(require 'hindent)
(add-hook 'haskell-mode-hook #'hindent-mode)

Vim

The 'formatprg' option lets you use an external program (like hindent) to format your text. Put the following line into ~/.vim/ftplugin/haskell.vim to set this option for Haskell files:

setlocal formatprg=hindent

Then you can format with hindent using gq. Read :help gq and help 'formatprg' for more details.

Note that unlike in emacs you have to take care of selecting a sensible buffer region as input to hindent yourself. If that is too much trouble you can try vim-textobj-haskell which provides a text object for top level bindings.

In order to format an entire source file execute:

:%!hindent

Alternatively you could use the vim-hindent plugin which runs hindent automatically when a Haskell file is saved.

Atom

Fortunately, you can use https://atom.io/packages/ide-haskell with the path to hindent specified instead of that to stylish-haskell. Works like a charm that way!

Changes

5.2.3:

* Sort explicit import lists
* Report the `SrcLoc` when there's a parse error
* Improve long type signatures pretty printing
* Support custom line-break operators, add `--line-breaks` argument
* Fix infix data constructor
* Disable `RecursiveDo` and `DoRec` extensions by default
* Add RecStmt support
* Improve GADT records, data declaration records
* Complicated type alias and type signatures pretty printing
* Fix quasi-quoter names

5.2.2:

* Parallel list comprehensions
* Leave do, lambda, lambda-case on previous line of $
* Misc fixes

5.2.1:

* Fix hanging on large constraints
* Render multi-line comments
* Rename --tab-size to --indent-size
* Don't add a spurious space for comments at the end of the file
* Don't add trailing whitespace on <-
* Disable PatternSynonyms
* Put a newline before the closing bracket on a list

5.2.0:

* Default tab-width is now 2
* Supports .hindent.yaml file to specify alt tab-width and max
  column
* Put last paren of export list on a new line
* Implement tab-size support in Emacs Lisp

5.1.1:

* Preserve spaces between groups of imports (fixes #200)
* Support shebangs (closes #208)
* Output filename for parse errors (fixes #179)
* Input with newline ends with newline (closes #211)
* Document -X (closes #212)
* Fix explicit forall in instances (closes #218)
* Put last paren of export list on a new line #227

5.1.0:

* Rewrote comment association, more reliable
* Added --tab-size flag for indentation spaces
* Fixed some miscellaneous bugs

5.0.1:

* Re-implement using bytestring instead of text
* Made compatible with GHC 7.8 through to GHC 8.0
* Added test suite and benchmarks in TESTS.md and BENCHMARKS.md

5.0.0:

* Drop support for styles

4.6.4

* Copy/delete file instead of renaming

4.4.6

* Fix whole module printer
* Accept a filename to reformat

4.4.5

* Fix bug in infix patterns

4.4.2

* Bunch of Gibiansky style fixes.
* Support CPP.
* Tibell style fixes.

4.3.8

* Fixed: bug in printing operators in statements.

4.5.4

* Improvements to Tibell style.
* 6x speed up on rendering operators.