# Haskell contribution layer for Spacemacs
![logo](img/haskell.png)
This layer adds support for the [Haskell][] language.
The layer uses company-ghc for completetion.
**This layer is still not fully adapted for Spacemacs, it needs you, Haskell experts, to
improve it and make it consistent with the Spacemacs experience.**
## Install
To use this contribution add it to your `~/.spacemacs`
```elisp
(setq-default dotspacemacs-configuration-layers '(haskell)
"List of contribution to load."
)
```
This layer requires some external binaries to function.
These are listed below, and can all be installed with `cabal install`:
- `ghc-mod`
- `hlint`
- `stylish-haskell`
Next Emacs needs to know of the directory of the binaries `~/.cabal/bin/` (or where ever cabal installs to by default on your system), which means that the directory has to be either added to your systems' `$PATH` or to Emacs' own `exec-path`.
Only one of the options below is needed:
- Add it to `$PATH`:
`export PATH=~/.cabal/bin/:$PATH`
Sidenote: emacs.app for OS X does not pick up `$PATH` from `~/.bashrc` or `~/.zshrc` when launched from outside a terminal.
- Add it to Emacs, add the following to `.spacemacs` in `dotspacemacs/config`:
`(add-to-list 'exec-path "~/.cabal/bin/")`
## Key bindings
All Haskell specific bindings are prefixed with SPC m
### Haskell source code:
#### Haskell commands:
Top-level commands are prefixed by SPC m:
Key Binding | Description
----------------------|------------------------------------------------------------
SPC m t | gets the type of the identifier under the cursor
SPC m i | gets information for the identifier under the cursor
SPC m u | finds uses of identifier
SPC m g | go to definition or tag
SPC m f | format buffer using haskell-stylish
#### Documentation commands:
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 y | do a Hayoo lookup
#### 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
#### Debug commands:
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 commands:
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 files:
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
**TODO**
[Haskell]: https://www.haskell.org/