#+TITLE: Idris layer

#+TAGS: general|layer|programming|pure

[[file:img/idris.png]]

* Table of Contents                     :TOC_5_gh:noexport:
- [[#description][Description]]
  - [[#features][Features:]]
- [[#install][Install]]
  - [[#layer][Layer]]
  - [[#idris][Idris]]
- [[#key-bindings][Key bindings]]
  - [[#shorthands][Shorthands]]
  - [[#interactive-editing][Interactive editing]]
  - [[#documentation][Documentation]]
  - [[#repl][REPL]]
  - [[#active-term-manipulations][Active term manipulations]]
  - [[#build-system][Build system]]

* Description
This layer adds support for the [[https://www.idris-lang.org/][Idris]] language to Spacemacs.

** Features:
- Syntax highlighting
- Syntax checking via =flycheck=
- Integration of the =Idris= REPL
- Integration of the =Idris= build system

* Install
** Layer
To use this configuration layer, add it to your =~/.spacemacs=. You will need to
add =idris= to the existing =dotspacemacs-configuration-layers= list in this
file.

** Idris
Idris can be installed using =Haskell's cabal=:

#+BEGIN_SRC sh
  cabal install idris
#+END_SRC

Binaries are also available for some platforms at
[[https://www.idris-lang.org/pages/download.html]]

* Key bindings
** Shorthands
Several (but not all) of the evil-leader shorthands that =idris-mode= provides
are reproduced under the local leader.

| Key binding | Description                                                                     |
|-------------+---------------------------------------------------------------------------------|
| ~SPC m c~   | Case split the pattern variable under point, or make it into a case expression. |
| ~SPC m d~   | Create an initial pattern match clause for a type declaration.                  |
| ~SPC m l~   | Extract lemma from hole                                                         |
| ~SPC m p~   | Attempt to solve a metavariable automatically.                                  |
| ~SPC m r~   | Load current buffer into Idris.                                                 |
| ~SPC m t~   | Get the type for the identifier under point.                                    |
| ~SPC m w~   | Add a with block for the pattern-match clause under point.                      |

** Interactive editing

| Key binding | Description                                                                                |
|-------------+--------------------------------------------------------------------------------------------|
| ~SPC m i a~ | Attempt to solve a metavariable automatically.                                             |
| ~SPC m i c~ | Case split the pattern variable under point, or make it into a case expression.            |
| ~SPC m i e~ | Extract a metavariable or provisional definition name to an explicit top level definition. |
| ~SPC m i m~ | Add missing pattern-match cases to an existing definition.                                 |
| ~SPC m i r~ | Refine by name, without recursive proof search.                                            |
| ~SPC m i s~ | Create an initial pattern match clause for a type declaration.                             |
| ~SPC m i w~ | Add a with block for the pattern-match clause under point.                                 |

** Documentation

| Key binding | Description                                           |
|-------------+-------------------------------------------------------|
| ~SPC m h a~ | Search the documentation for a string.                |
| ~SPC m h d~ | Search the documentation for the name under point.    |
| ~SPC m h s~ | Search the documentation regarding a particular type. |
| ~SPC m h t~ | Get the type for the identifier under point.          |

** REPL

| Key binding | Description                                                                            |
|-------------+----------------------------------------------------------------------------------------|
| ~SPC m s b~ | Load the current buffer into Idris.                                                    |
| ~SPC m s B~ | Load the current buffer into Idris and switch to REPL in insert state                  |
| ~SPC m s i~ | Start Idris inferior process                                                           |
| ~SPC m s n~ | Extend the region to be loaded one line at a time.                                     |
| ~SPC m s N~ | Extend the region to be loaded one line at a time and switch to REPL in insert state   |
| ~SPC m s p~ | Contract the region to be loaded one line at a time                                    |
| ~SPC m s P~ | Contract the region to be loaded one line at a time and switch to REPL in insert state |
| ~SPC m s s~ | Switch to REPL buffer                                                                  |
| ~SPC m s q~ | Quit the Idris process                                                                 |

** Active term manipulations

| Key binding | Description                                   |
|-------------+-----------------------------------------------|
| ~SPC m m c~ | Show the core language for the term at point. |
| ~SPC m m i~ | Show implicits for the term at point.         |
| ~SPC m m h~ | Hide implicits for the term at point.         |
| ~SPC m m n~ | Normalize the term at point.                  |

** Build system

| Key binding | Description                                                                |
|-------------+----------------------------------------------------------------------------|
| ~SPC m b c~ | Build the package.                                                         |
| ~SPC m b C~ | Clean the package, removing =.ibc= files                                   |
| ~SPC m b i~ | Install the package to the user's repository, building first if necessary. |
| ~SPC m b p~ | Open package file.                                                         |

When inside a package file, you can insert a field with ~SPC m f~.
