This repository has been archived on 2024-10-22. You can view files and clone it, but cannot push or open issues or pull requests.
spacemacs/contrib/!lang/haskell
Sridhar Ratnakumar fc95a4d63c Note about exec-path-from-shell
cf. https://github.com/syl20bnr/spacemacs/issues/2331#issuecomment-121686918

(i was trying to do both, but it is not necessary given spacemacs defaults)
2015-07-29 22:58:27 -04:00
..
img Prefix categories with ! 2015-05-25 00:50:38 -04:00
config.el [Haskell] Added company-cabal support for auto-completion in .cabal files 2015-06-08 01:02:09 -04:00
packages.el electric-indent-local-mode is not always defined 2015-06-22 23:14:06 -04:00
README.org Note about exec-path-from-shell 2015-07-29 22:58:27 -04:00

Haskell contribution layer for Spacemacs

/TakeV/spacemacs/media/commit/6e549cbe2a1de8206f726ac538e7da58991ea92f/contrib/!lang/haskell/img/haskell.png

Description

This layer adds support for the Haskell language.

Features:

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
  • hasktags

To install them, use the following command:

  cabal install stylish-haskell hlint ghc-mod 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.

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