7.9 KiB
Haskell contribution layer for Spacemacs
Table of Contents
Description
This layer adds support for the Haskell language.
Features:
- auto-completion with company-ghc,
- auto-indentation with hi2.
This layer is in construction, it needs your contributions and bug reports.
Install
Layer
To use this contribution add it to your ~/.spacemacs
(setq-default dotspacemacs-configuration-layers '(haskell))
Cabal packages
This layer requires some cabal packages:
ghc-mod
hlint
stylish-haskell
To install them, use the following command:
cabal install stylish-haskell hlint ghc-mod
Then you have to add this path to your system $PATH
(preferred):
Note that on Linux distributions the installed binaries should be in
~/.cabal/bin
and on OS X the binaries are installed in
/Users/<username>/Library/Haskell/bin
.
export PATH=~/.cabal/bin/:$PATH
or to the Emacs exec-path
variable in the dotspacemacs/init
function of
your .spacemacs
file:
(add-to-list 'exec-path "~/.cabal/bin/")
Note: it is important to add the path in the dotspacemacs/init
function,
so that the path is added before any layers is loaded.
OS X
Note that emacs.app
for OS X does not pick up $PATH
from ~/.bashrc
or
~/.zshrc
when launched from outside a terminal.
Optional extras
The Haskell layer supports some extra features that can be enabled through layer variables.
GHCi-ng support
ghci-ng adds some nice features to haskell-mode
, and is supported in
Spacemacs by a layer variable:
Follow the instructions to install ghci-ng (remember to add :set +c
in ~/.ghci
, next set the layer variable:
(setq-default dotspacemacs-configuration-layers
'((haskell :variables haskell-enable-ghci-ng-support t)))
Once ghci-ng is enabled, two of the old keybindings are overriden with improved versions from ghci-ng, and a new keybinding available:
Key Binding | Description
----------------------|------------------------------------------------------------ SPC m h t | gets the type of the identifier under the cursor or for the active region SPC m g g | go to definition SPC m u | finds uses of identifier
structured-haskell-mode
structured-haskell-mode, or shm, replaces hi2 (and any other
Haskell-indentation modes) and adds some nice functionality.
To enable shm, run cabal install structured-haskell-mode
and set the layer
variable:
(setq-default dotspacemacs-configuration-layers
'((haskell :variables haskell-enable-shm-support t)))
After shm has been enabled, some of the evil normal state bindings are overridden:
Key Binding | Description
----------------------|------------------------------------------------------------
D | shm/kill-line
R | shm/raise
P | shm/yank
( | shm/forward-node
) | shm/backward-node
For a nice visualization of these functions, please refer to the github page for structured-haskell-mode.
hindent
hindent is an extensible Haskell pretty printer, which let's you
reformat your code. You need to install the executable with cabal install hindent
.
To enable it you have to set the variable haskell-enable-hindent-style
to a supported style. The available styles are:
- fundamental
- johan-tibell
- chris-done
- andrew-gibiansky
See examples here
(setq-default dotspacemacs-configuration-layers
'((haskell :variables haskell-enable-hindent-style "johan-tibell")))
Key bindings
All Haskell specific bindings are prefixed with the major-mode leader SPC m.
Top-level commands are prefixed by SPC m:
Key Binding | Description
----------------------|------------------------------------------------------------ SPC m g g | go to definition or tag SPC m f | format buffer using haskell-stylish SPC m F | format declaration using hindent (if enabled)
Documentation
Documentation commands are prefixed by SPC m h
Key Binding | Description
----------------------|------------------------------------------------------------ SPC m h d | find or generate Haddock documentation for the identifier under the cursor SPC m h h | do a Hoogle lookup SPC m h i | gets information for the identifier under the cursor SPC m h t | gets the type of the identifier under the cursor SPC m h y | do a Hayoo lookup
Debug
Debug commands are prefixed by SPC m d:
Key Binding | Description
----------------------|------------------------------------------------------------ SPC m d d | start debug process, needs to be run first SPC m d b | insert breakpoint at function SPC m d n | next breakpoint SPC m d N | previous breakpoint SPC m d B | delete breakpoint SPC m d c | continue current process SPC m d a | abandon current process SPC m d r | refresh process buffer
REPL
REPL commands are prefixed by SPC m s:
Key Binding | Description
----------------------|------------------------------------------------------------ SPC m s b | load or reload the current buffer into the REPL SPC m s c | clear the REPL SPC m s s | show the REPL SPC m s S | show and switch to the REPL
Cabal commands
Cabal commands are prefixed by SPC m c:
Key Binding | Description
----------------------|------------------------------------------------------------
SPC m c a | cabal actions
SPC m c b | build the current cabal project, i.e. invoke cabal build
SPC m c c | compile the current project, i.e. invoke ghc
SPC m c v | visit the cabal file
Cabal files
This commands are available in a cabal file.
Key Binding | Description
----------------------|------------------------------------------------------------ SPC m d | add a dependency to the project SPC m b | go to benchmark section SPC m e | go to executable section SPC m t | go to test-suite section SPC m m | go to exposed modules SPC m l | go to libary section SPC m n | go to next subsection SPC m p | go to previous subsection SPC m N | go to next section SPC m P | go to previous section SPC m f | find or create source-file under the cursor