2014-12-02 04:22:45 +00:00
|
|
|
# Haskell contribution layer for Spacemacs
|
|
|
|
|
2014-12-24 06:03:49 +00:00
|
|
|
![logo](img/haskell.png)
|
2014-12-02 04:22:45 +00:00
|
|
|
|
2014-12-30 04:15:45 +00:00
|
|
|
<!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc/generate-toc again -->
|
|
|
|
**Table of Contents**
|
|
|
|
|
|
|
|
- [Haskell contribution layer for Spacemacs](#haskell-contribution-layer-for-spacemacs)
|
|
|
|
- [Description](#description)
|
|
|
|
- [Install](#install)
|
|
|
|
- [Layer](#layer)
|
|
|
|
- [Cabal packages](#cabal-packages)
|
|
|
|
- [OS X](#os-x)
|
2015-02-23 18:16:47 +00:00
|
|
|
- [Optional extras](#optional-extras)
|
|
|
|
- [GHCi-ng support](#ghci-ng-support)
|
|
|
|
- [structured-haskell-mode](#structured-haskell-mode)
|
2015-02-25 16:56:31 +00:00
|
|
|
- [hindent](#hindent)
|
2014-12-30 04:15:45 +00:00
|
|
|
- [Key bindings](#key-bindings)
|
|
|
|
- [Haskell source code:](#haskell-source-code)
|
|
|
|
- [Haskell commands:](#haskell-commands)
|
|
|
|
- [Documentation commands:](#documentation-commands)
|
|
|
|
- [Cabal commands:](#cabal-commands)
|
|
|
|
- [Debug commands:](#debug-commands)
|
|
|
|
- [REPL commands:](#repl-commands)
|
|
|
|
- [Cabal files:](#cabal-files)
|
|
|
|
|
|
|
|
<!-- markdown-toc end -->
|
|
|
|
|
2015-02-23 18:16:47 +00:00
|
|
|
|
2014-12-30 04:15:45 +00:00
|
|
|
## Description
|
|
|
|
|
2014-12-02 04:22:45 +00:00
|
|
|
This layer adds support for the [Haskell][] language.
|
2015-01-01 07:11:51 +00:00
|
|
|
|
|
|
|
Features:
|
|
|
|
- auto-completion with [company-ghc][],
|
|
|
|
- auto-indentation with [hi2][].
|
2014-12-02 04:22:45 +00:00
|
|
|
|
2014-12-30 04:15:45 +00:00
|
|
|
**This layer is in construction, it needs your contributions and bug reports.**
|
2014-12-02 04:22:45 +00:00
|
|
|
|
|
|
|
## Install
|
|
|
|
|
2014-12-30 04:15:45 +00:00
|
|
|
### Layer
|
|
|
|
|
2014-12-02 04:22:45 +00:00
|
|
|
To use this contribution add it to your `~/.spacemacs`
|
|
|
|
|
|
|
|
```elisp
|
2015-02-18 03:36:12 +00:00
|
|
|
(setq-default dotspacemacs-configuration-layers '(haskell))
|
2014-12-02 04:22:45 +00:00
|
|
|
```
|
|
|
|
|
2014-12-30 04:15:45 +00:00
|
|
|
### Cabal packages
|
|
|
|
|
|
|
|
This layer requires some [cabal][] packages:
|
2014-12-24 14:18:02 +00:00
|
|
|
- `ghc-mod`
|
|
|
|
- `hlint`
|
|
|
|
- `stylish-haskell`
|
|
|
|
|
2014-12-30 04:15:45 +00:00
|
|
|
To install them, use the following command:
|
|
|
|
|
|
|
|
```sh
|
|
|
|
cabal install stylish-haskell hlint ghc-mod
|
|
|
|
```
|
|
|
|
|
|
|
|
Next Emacs needs to know where to find these binaries, you can locate them with
|
|
|
|
the following shell command:
|
|
|
|
|
|
|
|
```sh
|
|
|
|
dirname $(which ghc-mod)
|
|
|
|
```
|
|
|
|
|
|
|
|
Then you have to add this path to your system `$PATH` (preferred):
|
|
|
|
|
|
|
|
```sh
|
|
|
|
export PATH=~/.cabal/bin/:$PATH
|
|
|
|
```
|
|
|
|
|
|
|
|
_or_ to the Emacs `exec-path` variable in the `dotspacemacs/init` function of
|
|
|
|
your `.spacemacs` file:
|
|
|
|
|
|
|
|
```elisp
|
|
|
|
(add-to-list 'exec-path "~/.cabal/bin/")
|
|
|
|
```
|
2014-12-24 14:18:02 +00:00
|
|
|
|
2014-12-30 04:15:45 +00:00
|
|
|
**Note:** it is important to add the path in the `dotspacemacs/init` function,
|
|
|
|
so that the path is added before any layers is loaded.
|
2014-12-24 14:18:02 +00:00
|
|
|
|
2014-12-30 04:15:45 +00:00
|
|
|
### OS X
|
2014-12-24 14:18:02 +00:00
|
|
|
|
2014-12-30 04:15:45 +00:00
|
|
|
Note that `emacs.app` for OS X does not pick up `$PATH` from `~/.bashrc` or
|
|
|
|
`~/.zshrc` when launched from outside a terminal.
|
2014-12-24 14:18:02 +00:00
|
|
|
|
2015-02-23 18:16:47 +00:00
|
|
|
### Optional extras
|
|
|
|
The Haskell layer supports some extra features that can be enabled through layer variables.
|
|
|
|
|
|
|
|
#### GHCi-ng support
|
2015-02-22 11:03:46 +00:00
|
|
|
[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:
|
|
|
|
```elisp
|
|
|
|
;; List of configuration layers to load.
|
2015-02-25 01:04:50 +00:00
|
|
|
dotspacemacs-configuration-layers '(company-mode (haskell :variables haskell-enable-ghci-ng-support t) git)
|
2015-02-22 11:03:46 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
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
|
|
|
|
----------------------|------------------------------------------------------------
|
|
|
|
<kbd>SPC m t</kbd> | gets the type of the identifier under the cursor or for the active region
|
|
|
|
<kbd>SPC m g g</kbd> | go to definition
|
|
|
|
<kbd>SPC m u</kbd> | finds uses of identifier
|
|
|
|
|
2015-02-23 18:16:47 +00:00
|
|
|
#### structured-haskell-mode
|
|
|
|
[structured-haskell-mode][], or shm, replaces hi2 and adds some nice functionality.
|
|
|
|
To enable shm, run `cabal install structured-haskell-mode` and set the layer variable:
|
|
|
|
```elisp
|
|
|
|
;; List of configuration layers to load.
|
2015-02-25 01:04:50 +00:00
|
|
|
dotspacemacs-configuration-layers '(company-mode (haskell :variables haskell-enable-shm-support t) git)
|
2015-02-23 18:16:47 +00:00
|
|
|
```
|
2015-02-25 16:56:31 +00:00
|
|
|
#### 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 set:
|
|
|
|
```elisp
|
|
|
|
;; List of configuration layers to load.
|
|
|
|
dotspacemacs-configuration-layers '(company-mode (haskell :variables haskell-enable-hindent-support t) git)
|
|
|
|
```
|
|
|
|
By default it uses the style called `fundamental`, if you want to use
|
|
|
|
another, `johan-tibell`, run `M-x customize-variable
|
|
|
|
hindent-style`.
|
2015-02-23 18:16:47 +00:00
|
|
|
|
2014-12-02 04:22:45 +00:00
|
|
|
## Key bindings
|
|
|
|
|
2014-12-21 16:03:27 +00:00
|
|
|
All Haskell specific bindings are prefixed with <kbd>SPC m</kbd>
|
|
|
|
|
|
|
|
### Haskell source code:
|
|
|
|
|
|
|
|
#### Haskell commands:
|
|
|
|
Top-level commands are prefixed by <kbd>SPC m</kbd>:
|
|
|
|
|
2014-12-22 04:19:04 +00:00
|
|
|
Key Binding | Description
|
|
|
|
----------------------|------------------------------------------------------------
|
|
|
|
<kbd>SPC m t</kbd> | gets the type of the identifier under the cursor
|
|
|
|
<kbd>SPC m i</kbd> | gets information for the identifier under the cursor
|
2015-02-22 11:03:46 +00:00
|
|
|
<kbd>SPC m g g</kbd> | go to definition or tag
|
2014-12-22 10:49:15 +00:00
|
|
|
<kbd>SPC m f</kbd> | format buffer using haskell-stylish
|
2015-02-25 16:56:31 +00:00
|
|
|
<kbd>SPC m F</kbd> | format declaration using hindent (if enabled)
|
2014-12-21 16:03:27 +00:00
|
|
|
|
|
|
|
#### Documentation commands:
|
|
|
|
Documentation commands are prefixed by <kbd>SPC m h</kbd>
|
|
|
|
|
2014-12-22 04:19:04 +00:00
|
|
|
Key Binding | Description
|
|
|
|
----------------------|------------------------------------------------------------
|
|
|
|
<kbd>SPC m h d</kbd> | find or generate Haddock documentation for the identifier under the cursor
|
|
|
|
<kbd>SPC m h h</kbd> | do a Hoogle lookup
|
|
|
|
<kbd>SPC m h y</kbd> | do a Hayoo lookup
|
2014-12-21 16:03:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
#### Cabal commands:
|
|
|
|
Cabal commands are prefixed by <kbd>SPC m c</kbd>:
|
|
|
|
|
2014-12-22 04:19:04 +00:00
|
|
|
Key Binding | Description
|
|
|
|
----------------------|------------------------------------------------------------
|
2014-12-22 10:49:15 +00:00
|
|
|
<kbd>SPC m c a</kbd> | cabal actions
|
|
|
|
<kbd>SPC m c b</kbd> | build the current cabal project, i.e. invoke `cabal build`
|
|
|
|
<kbd>SPC m c c</kbd> | compile the current project, i.e. invoke `ghc`
|
2014-12-22 04:19:04 +00:00
|
|
|
<kbd>SPC m c v</kbd> | visit the cabal file
|
2014-12-21 16:03:27 +00:00
|
|
|
|
|
|
|
#### Debug commands:
|
|
|
|
Debug commands are prefixed by <kbd>SPC m d</kbd>:
|
|
|
|
|
2014-12-22 04:19:04 +00:00
|
|
|
Key Binding | Description
|
|
|
|
----------------------|------------------------------------------------------------
|
|
|
|
<kbd>SPC m d d </kbd> | start debug process, needs to be run first
|
|
|
|
<kbd>SPC m d b </kbd> | insert breakpoint at function
|
|
|
|
<kbd>SPC m d n </kbd> | next breakpoint
|
2014-12-22 10:49:15 +00:00
|
|
|
<kbd>SPC m d N </kbd> | previous breakpoint
|
2014-12-22 04:19:04 +00:00
|
|
|
<kbd>SPC m d B </kbd> | delete breakpoint
|
|
|
|
<kbd>SPC m d c </kbd> | continue current process
|
|
|
|
<kbd>SPC m d a </kbd> | abandon current process
|
|
|
|
<kbd>SPC m d r </kbd> | refresh process buffer
|
2014-12-21 16:03:27 +00:00
|
|
|
|
|
|
|
#### REPL commands:
|
|
|
|
REPL commands are prefixed by <kbd>SPC m s</kbd>:
|
|
|
|
|
2014-12-22 04:19:04 +00:00
|
|
|
Key Binding | Description
|
|
|
|
----------------------|------------------------------------------------------------
|
|
|
|
<kbd>SPC m s b</kbd> | load or reload the current buffer into the REPL
|
|
|
|
<kbd>SPC m s c</kbd> | clear the REPL
|
|
|
|
<kbd>SPC m s s</kbd> | show the REPL
|
|
|
|
<kbd>SPC m s S</kbd> | show and switch to the REPL
|
2014-12-21 16:03:27 +00:00
|
|
|
|
|
|
|
### Cabal files:
|
|
|
|
|
2014-12-22 04:19:04 +00:00
|
|
|
Key Binding | Description
|
|
|
|
----------------------|------------------------------------------------------------
|
|
|
|
<kbd>SPC m d</kbd> | add a dependency to the project
|
|
|
|
<kbd>SPC m b</kbd> | go to benchmark section
|
|
|
|
<kbd>SPC m e</kbd> | go to executable section
|
|
|
|
<kbd>SPC m t</kbd> | go to test-suite section
|
|
|
|
<kbd>SPC m m</kbd> | go to exposed modules
|
|
|
|
<kbd>SPC m l</kbd> | go to libary section
|
|
|
|
<kbd>SPC m n</kbd> | go to next subsection
|
|
|
|
<kbd>SPC m p</kbd> | go to previous subsection
|
|
|
|
<kbd>SPC m N</kbd> | go to next section
|
|
|
|
<kbd>SPC m P</kbd> | go to previous section
|
|
|
|
<kbd>SPC m f</kbd> | find or create source-file under the cursor
|
2014-12-21 16:03:27 +00:00
|
|
|
|
2014-12-02 04:22:45 +00:00
|
|
|
[Haskell]: https://www.haskell.org/
|
2014-12-30 04:15:45 +00:00
|
|
|
[cabal]: https://www.haskell.org/cabal/
|
2015-01-01 07:11:51 +00:00
|
|
|
[company-ghc]: https://github.com/iquiw/company-ghc
|
|
|
|
[hi2]: https://github.com/nilcons/hi2
|
2015-02-22 11:03:46 +00:00
|
|
|
[ghci-ng]: https://github.com/chrisdone/ghci-ng
|
2015-02-23 18:16:47 +00:00
|
|
|
[structured-haskell-mode]: https://github.com/chrisdone/structured-haskell-mode
|
2015-02-25 16:56:31 +00:00
|
|
|
[hindent]: https://github.com/chrisdone/hindent
|