A simple Haskell code prettifier. The goal is not to format all of the code in a file, since I find those kind of tools often "get in the way". However, manually cleaning up import statements etc. gets tedious very quickly.
This tool tries to help where necessary without getting in the way.
You can install it using stack install stylish-haskell
or cabal install stylish-haskell
.
You can also install it using your package manager:
apt-get install stylish-haskell
apt-get install stylish-haskell
pacman -S stylish-haskell
import
statements{-# LANGUAGE #-}
pragmas, can remove (some) redundant
pragmascase
and fields in recordsFeature requests are welcome! Use the issue tracker for that.
Turns:
{-# LANGUAGE ViewPatterns, TemplateHaskell #-}
{-# LANGUAGE GeneralizedNewtypeDeriving,
ViewPatterns,
ScopedTypeVariables #-}
module Bad where
import Control.Applicative ((<$>))
import System.Directory (doesFileExist)
import qualified Data.Map as M
import Data.Map ((!), keys, Map)
data Point = Point { pointX, pointY :: Double , pointName :: String} deriving (Show)
into:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
module Bad where
import Control.Applicative ((<$>))
import System.Directory (doesFileExist)
import Data.Map (Map, keys, (!))
import qualified Data.Map as M
data Point = Point
{ pointX, pointY :: Double
, pointName :: String
} deriving (Show)
The tool is customizable to some extent. It tries to find a config file in the following order:
-c/--config
argument.stylish-haskell.yaml
in the current directory (useful for per-directory
settings).stylish-haskell.yaml
in the nearest ancestor directory (useful for
per-project settings)stylish-haskell/config.yaml
in the platform’s configuration directory
(on Windows, it is %APPDATA%, elsewhere it defaults to ~/.config
and
can be overridden by the XDG_CONFIG_HOME
environment variable;
useful for user-wide settings).stylish-haskell.yaml
in your home directory (useful for user-wide
settings)Use stylish-haskell --defaults > .stylish-haskell.yaml
to dump a
well-documented default configuration to a file, this way you can get started
quickly.
Basically, stylish-haskell supports 4 different styles of records, controlled by records
in the config file.
Here's an example of all four styles:
-- equals: "indent 2", "first_field": "indent 2"
data Foo a
= Foo
{ a :: Int
, a2 :: String
-- ^ some haddock
}
| Bar
{ b :: a
}
deriving (Eq, Show)
deriving (ToJSON) via Bar Foo
-- equals: "same_line", "first_field": "indent 2"
data Foo a = Foo
{ a :: Int
, a2 :: String
-- ^ some haddock
}
| Bar
{ b :: a
}
deriving (Eq, Show)
deriving (ToJSON) via Bar Foo
-- equals: "same_line", "first_field": "same_line"
data Foo a = Foo { a :: Int
, a2 :: String
-- ^ some haddock
}
| Bar { b :: a
}
deriving (Eq, Show)
deriving (ToJSON) via Bar Foo
-- equals: "indent 2", first_field: "same_line"
data Foo a
= Foo { a :: Int
, a2 :: String
-- ^ some haddock
}
| Bar { b :: a
}
deriving (Eq, Show)
deriving (ToJSON) via Bar Foo
Haskell Language Server(HLS) includes a plugin
for stylish-haskell. By changing the formatting provider option
(haskell.formattingProvider
) to stylish-haskell
as described in
HLS options, any editors that support Language Server Protocol
can use stylish-haskell for formatting.
Since it works as a filter it is pretty easy to integrate this with VIM.
You can call
:%!stylish-haskell
and add a keybinding for it.
Or you can define formatprg
:set formatprg=stylish-haskell
and then use gq
.
Alternatively, [vim-autoformat] supports stylish-haskell. To have it automatically reformat the files on save, add to your vimrc:
autocmd BufWrite *.hs :Autoformat
" Don't automatically indent on save, since vim's autoindent for haskell is buggy
autocmd FileType haskell let b:autoformat_autoindent=0
There are also plugins that run stylish-haskell automatically when you save a Haskell file:
haskell-mode for Emacs supports stylish-haskell
. For configuration,
see the “Using external formatters” section of the
haskell-mode manual.
ide-haskell for Atom supports stylish-haskell
.
atom-beautify for Atom supports Haskell using stylish-haskell
.
stylish-haskell-vscode for VSCode supports stylish-haskell
.
You can quickly grab the latest binary and run stylish-haskell
like so:
curl -sL https://raw.github.com/haskell/stylish-haskell/master/scripts/latest.sh | sh -s .
Where the .
can be replaced with the arguments you pass to stylish-haskell
.
Written and maintained by Jasper Van der Jeugt.
Contributors: