# Clojure contribution layer for Spacemacs
![logo_clojure](img/clojure.png) ![logo_cider](img/cider.png)
**Table of Contents**
- [Clojure contribution layer for Spacemacs](#clojure-contribution-layer-for-spacemacs)
- [Description](#description)
- [Features](#features)
- [Install](#install)
- [Layer](#layer)
- [Pretty Symbols](#pretty-symbols)
- [Cider and clj-refactor](#cider-and-clj-refactor)
- [Quick Start with lein](#quick-start-with-lein)
- [More details](#more-details)
- [Key Bindings](#key-bindings)
- [Documentation](#documentation)
- [Evaluation](#evaluation)
- [Goto](#goto)
- [REPL](#repl)
- [Tests](#tests)
- [Refactoring](#refactoring)
- [Reformatting](#reformatting)
## Description
This layer adds support for [Clojure][] language using [Cider][].
## Features
- REPL via [cider][]
- Refactoring via [clj-refactor][]
- Auto completion via [ac-cider][]
- Automatic formatting via [align-cljlet][]
## Install
### Layer
To use this contribution add it to your `~/.spacemacs`
```elisp
(setq-default dotspacemacs-configuration-layers '(clojure))
```
### Pretty Symbols
Pretty symbols for anonymous functions, set literals and partial, like `(λ [a] (+ a 5))`, `ƒ(+ % 5)`, `∈{2 4 6}` and `Ƥ`.
To enable this feature, add the following snippet to the dotspacemacs/config
section of your `~/.spacemacs` file:
```elisp
(setq clojure-enable-fancify-symbols t)
```
Or set this variable when loading the configuration layer:
```elisp
(setq-default dotspacemacs-configuration-layers
'((clojure :variables clojure-enable-fancify-symbols t)))
```
### Cider and clj-refactor
#### Quick Start with lein
- Install `lein` via your OS package manager.
- Create a file `~/.lein/profiles.clj` with the following content:
```clj
{:user {:plugins [[cider/cider-nrepl "0.9.0-SNAPSHOT"]
[refactor-nrepl "0.3.0-SNAPSHOT"]]
:dependencies [[alembic "0.3.2"]
[org.clojure/tools.nrepl "0.2.7"]]}}
```
#### More details
More info regarding installation of nREPL middleware can be found here:
- cider: [cider repo][cider_install]
- clj-refactor: [refactor-nrepl][]
## Key Bindings
### Documentation
Key Binding | Description
----------------------|------------------------------------------------------------
SPC m d d | cider doc
SPC m d g | cider grimoire
SPC m d j | cider javadoc
### Evaluation
Key Binding | Description
----------------------|------------------------------------------------------------
SPC m e b | eval buffer
SPC m e e | eval last sexp
SPC m e f | eval function at point
SPC m e r | eval region
### Goto
Key Binding | Description
----------------------|------------------------------------------------------------
SPC m g g | goto var
SPC m g e | goto error
SPC m g r | goto resource
SPC m g b | go back
### REPL
Key Binding | Description
----------------------|------------------------------------------------------------
SPC m s b | send and eval buffer in REPL
SPC m s B | send and eval buffer and switch to REPL in `insert state`
SPC m s e | send and eval last sexp in REPL
SPC m s E | send and eval last sexp and switch to REPL in `insert state`
SPC m s f | send and eval function in REPL
SPC m s F | send and eval function and switch to REPL in `insert state`
SPC m s i | start REPL (cider-jack-in)
SPC m s n | send and eval ns form in REPL
SPC m s N | send and eval ns form and switch to REPL in `insert state`
SPC m s q | kill REPL (cider-quit)
SPC m s r | send and eval region in REPL
SPC m s R | send and eval region and switch to REPL in `insert state`
SPC m s s | switch to REPL
### Tests
Key Binding | Description
----------------------|------------------------------------------------------------
SPC m t t | run tests
### Refactoring
Key Binding | Description
------------------------|------------------------------------------------------------
SPC m r a d | add declaration
SPC m r a i | add import to ns
SPC m r a m | add missing libspec
SPC m r a p | add project dependency
SPC m r a r | add require to ns
SPC m r a u | add use to ns
SPC m r c c | cycle coll
SPC m r c i | cycle if
SPC m r c n | clean ns
SPC m r c p | cycle privacy
SPC m r d k | destructure keys
SPC m r e f | extract function
SPC m r e l | expand let
SPC m r f u | find usages
SPC m r h d | hotload dependency
SPC m r i l | introduce let
SPC m r m f | move form
SPC m r m l | move to let
SPC m r p c | project clean
SPC m r p f | promote function
SPC m r r d | remove debug fns
SPC m r r f | rename file
SPC m r r l | remove let
SPC m r r r | remove unused requires
SPC m r r s | rename symbol
SPC m r r u | replace use
SPC m r s n | sort ns
SPC m r s p | sort project dependencies
SPC m r s r | stop referring
SPC m r t f | thread first all
SPC m r t h | thread
SPC m r t l | thread last all
SPC m r u a | unwind all
SPC m r u w | unwind
### Reformatting
Forms currently handled:
- let
- when-let
- if-let
- binding
- loop
- with-open
- literal hashes {}
- defroute
- cond
- condp (except :>> subforms)
More info [here][align-cljlet].
Key Binding | Description
------------------------|------------------------------------------------------------
SPC m f l | reformat current form
[Clojure]: http://clojure.org
[Cider]: https://github.com/clojure-emacs/cider
[cider_install]: https://github.com/clojure-emacs/cider#installation
[clojure-mode]: https://github.com/clojure-emacs/clojure-mode
[clj-refactor]: https://github.com/clojure-emacs/clj-refactor.el
[ac-cider]: https://github.com/clojure-emacs/ac-cider
[align-cljlet]: https://github.com/gstamp/align-cljlet
[refactor-nrepl]: https://github.com/clojure-emacs/refactor-nrepl