9 KiB
Haskell contribution layer for Spacemacs
Table of Contents TOC@4
Description
This layer adds support for the Haskell language.
Features:
- auto-completion with company-ghc,
- syntax highlighting for C– source.
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:
hlint
stylish-haskell
hasktags
To install them, use the following command:
cabal install stylish-haskell hlint hasktags
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
. Spacemacs will automatically
pick up shell PATH.
export PATH=~/.cabal/bin/:$PATH
Alternatively, you can add it 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.
ghc-mod support
ghc-mod enhances haskell-mode
with for example templates, case-splitting and
much more. In order to use it you need to install the executable with
cabal install ghc-mod
and set the layer variable:
(setq-default dotspacemacs-configuration-layers
'((haskell :variables haskell-enable-ghc-mod-support t)))
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 default haskell-mode
auto-indentation and adds some nice functionalities.
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 |