735321eda3
Commands and key bindings found via `alchemist-refcard` command. I've tried to adhere to Spacemacs conventions but where I couldn't find relevant conventions, I followed Alchemist's key bindings. Also, delete alchemist-refcard - approved by @syl20bnr at https://github.com/syl20bnr/spacemacs/pull/8746#issuecomment-301326850
245 lines
11 KiB
Org Mode
245 lines
11 KiB
Org Mode
#+TITLE: Elixir layer
|
|
|
|
[[file:img/elixir.png]] with [[file:img/alchemist.png]]
|
|
|
|
* Table of Contents :TOC_4_gh:noexport:
|
|
- [[#description][Description]]
|
|
- [[#install][Install]]
|
|
- [[#configuration][Configuration]]
|
|
- [[#flycheck][Flycheck]]
|
|
- [[#credo][Credo]]
|
|
- [[#dogma][Dogma]]
|
|
- [[#mix-compile][mix compile]]
|
|
- [[#key-bindings][Key bindings]]
|
|
- [[#refcard][Refcard]]
|
|
- [[#help][Help]]
|
|
- [[#mix][Mix]]
|
|
- [[#project][Project]]
|
|
- [[#evaluation-in-place][Evaluation in place]]
|
|
- [[#repl-interactions][REPL interactions]]
|
|
- [[#tests][Tests]]
|
|
- [[#compile][Compile]]
|
|
- [[#execute][Execute]]
|
|
- [[#code-definition-jump][Code Definition Jump]]
|
|
- [[#hex-packages][Hex (packages)]]
|
|
- [[#macro-expand][Macro expand]]
|
|
|
|
* Description
|
|
This layer adds support for [[http://elixir-lang.org/][Elixir]] .
|
|
|
|
[[https://github.com/tonini/alchemist.el][Alchemist]] brings the Elixir tooling to Emacs and comes with a bunch of features
|
|
like:
|
|
|
|
- Powerful IEx integration
|
|
- Mix integration
|
|
- Compile & Execution of Elixir code
|
|
- Inline code evaluation
|
|
- Documentation lookup
|
|
- Definition lookup
|
|
- Smart code completion
|
|
- Elixir project management
|
|
- Integration with [[http://company-mode.github.io/][company-mode]]
|
|
- Flycheck support for mix compile
|
|
- Flycheck support for [[https://github.com/rrrene/credo][credo]]
|
|
- Flycheck support for test results
|
|
|
|
* Install
|
|
To use this configuration layer, add it to your =~/.spacemacs=. You will need to
|
|
add =elixir= to the existing =dotspacemacs-configuration-layers= list in this
|
|
file.
|
|
|
|
* Configuration
|
|
** Flycheck
|
|
*Note:* since flycheck checkers are slow, the checks are enabled only at save
|
|
time.
|
|
|
|
*** Credo
|
|
You need to install [[https://github.com/rrrene/credo][credo]] into your project. For this, add the following snippet
|
|
to dependencies of your project (in file =mix.exs=):
|
|
|
|
#+BEGIN_SRC
|
|
{:credo, "~> 0.5", only: [:dev, :test]}
|
|
#+END_SRC
|
|
|
|
Then run in your shell:
|
|
|
|
#+BEGIN_SRC shell
|
|
$ mix deps.get
|
|
#+END_SRC
|
|
|
|
For more info about mix [[http://elixir-lang.org/getting-started/mix-otp/introduction-to-mix.html][see]].
|
|
|
|
You can tell flycheck-credo to call credo with the '--strict' argument.
|
|
|
|
#+BEGIN_SRC elisp
|
|
(setq flycheck-elixir-credo-strict t)
|
|
#+END_SRC
|
|
|
|
*** Dogma
|
|
In order to lint your code, you also need to install [[https://github.com/lpil/dogma][dogma]] into your project.
|
|
For this, add the following snippet to the dependencies in your =mix.exs= file:
|
|
|
|
#+BEGIN_SRC
|
|
{:dogma, "~> 0.1", only: [:dev]}
|
|
#+END_SRC
|
|
|
|
Then run in your shell:
|
|
|
|
#+BEGIN_SRC shell
|
|
$ mix deps.get
|
|
#+END_SRC
|
|
|
|
*** mix compile
|
|
*Important:*
|
|
|
|
Elixir compiler is based on macros and can execute arbitrary during compilation.
|
|
Therefore Spacemacs disable flycheck compilation checker by default.
|
|
|
|
To enable flycheck support for compilation errors *globally* the variable
|
|
=elixir-enable-compilation-checking= can be set explicitly to =t= in your
|
|
dotfile but it is not recommended to do so because of the limitation described
|
|
above.
|
|
|
|
Instead you should use directory local variables in order to enable the flycheck
|
|
checker only for certain projects. Directory local variables are stored in a
|
|
file named =.dir-local.el= usually at the root of a project. To easily add a
|
|
directory local variable use the key binding ~SPC f v d~ then choose the
|
|
=elixir-mode= and the variable name =elixir-enable-compilation-checking= with a
|
|
value of t. The result is a new file =.dir-local.el= with the following
|
|
contents:
|
|
|
|
#+BEGIN_SRC elisp
|
|
;;; Directory Local Variables
|
|
;;; For more information see (info "(emacs) Directory Variables")
|
|
|
|
((elixir-mode
|
|
(elixir-enable-compilation-checking . t)))
|
|
#+END_SRC
|
|
|
|
Spacemacs marks the variable =elixir-enable-compilation-checking= as safe so
|
|
Emacs won't ask you if the variable is safe whenever an elixir file is opened.
|
|
|
|
Remember that you can verify the flycheck checkers status with ~SPC e v~.
|
|
|
|
* Key bindings
|
|
** Refcard
|
|
You find and overview of all the key-bindings on the [[https://github.com/tonini/alchemist.el/blob/master/doc/alchemist-refcard.pdf][Alchemist-Refcard]].
|
|
|
|
** Help
|
|
|
|
| Key Binding | Description |
|
|
|-------------+-------------------------------------|
|
|
| ~SPC m h :~ | Run custom search for help |
|
|
| ~SPC m h h~ | Show help of the current expression |
|
|
| ~SPC m h H~ | Toggle through search history |
|
|
| ~SPC m h r~ | Show help for current region |
|
|
|
|
** Mix
|
|
|
|
| Key Binding | Description |
|
|
|-------------+------------------------------------------------------------|
|
|
| ~SPC m m :~ | Prompt for a =mix= command |
|
|
| ~SPC m m c~ | Compile the whole application |
|
|
| ~SPC m m h~ | Show help for a specific =mix= command |
|
|
| ~SPC m m x~ | Run the given expression in the Elixir application context |
|
|
|
|
** Project
|
|
|
|
| Key Binding | Description |
|
|
|-------------+------------------------------------------------------------|
|
|
| ~SPC m p t~ | Open project test directory and list all test files. |
|
|
| ~SPC m g t~ | Toggle between a file and its tests in the current window. |
|
|
| ~SPC m g T~ | Toggle between a file and its tests in other window. |
|
|
|
|
** Evaluation in place
|
|
|
|
| Key Binding | Description |
|
|
|-------------+-----------------------------------------|
|
|
| ~SPC m e b~ | Evaluate buffer |
|
|
| ~SPC m e B~ | Evaluate buffer and insert result |
|
|
| ~SPC m e l~ | Evaluate current line |
|
|
| ~SPC m e L~ | Evaluate current line and insert result |
|
|
| ~SPC m e r~ | Evaluate region |
|
|
| ~SPC m e R~ | Evaluate region and insert result |
|
|
|
|
** REPL interactions
|
|
|
|
| Key Binding | Description |
|
|
|-------------+-----------------------------------------------------------------|
|
|
| ~SPC m s c~ | Compiles the current buffer in the IEx process. |
|
|
| ~SPC m s i~ | Start an =iex= inferior process |
|
|
| ~SPC m s I~ | Start an IEx process with mix (=iex -S mix=) |
|
|
| ~SPC m s l~ | Send current line to REPL buffer |
|
|
| ~SPC m s L~ | Send current line to REPL buffer and focus it in =insert state= |
|
|
| ~SPC m s m~ | Reloads the module in the current buffer in your IEx process |
|
|
| ~SPC m s r~ | Send region to REPL buffer |
|
|
| ~SPC m s R~ | Send region to REPL buffer and focus it in =insert state= |
|
|
|
|
** Tests
|
|
|
|
| Key Binding | Description |
|
|
|-------------+---------------------------------------------------------------------------------------|
|
|
| ~SPC m g t~ | Open the test file for current buffer |
|
|
| ~SPC m t a~ | Run all the tests |
|
|
| ~SPC m t b~ | Run all the tests from current buffer |
|
|
| ~SPC m t B~ | Run all the tests from current file; if test file not found, after confirm, create it |
|
|
| ~SPC m t f~ | Choose test file to run |
|
|
| ~SPC m t t~ | Run test under point |
|
|
| ~SPC m t r~ | Rerun the last test |
|
|
| ~SPC m t n~ | Jump to next test |
|
|
| ~SPC m t N~ | Jump to previous test |
|
|
| ~SPC m t s~ | Run stale tests (~mix test --stale~) |
|
|
| ~SPC m t R~ | Toggle test report window |
|
|
|
|
** Compile
|
|
|
|
| Key Binding | Description |
|
|
|-------------+----------------------------------------------------|
|
|
| ~SPC m c :~ | Run a custom compile command with =elixirc= |
|
|
| ~SPC m c b~ | Compile the current buffer with elixirc. =elixirc= |
|
|
| ~SPC m c f~ | Compile the given filename with =elixirc= |
|
|
|
|
** Execute
|
|
|
|
| Key Binding | Description |
|
|
|-------------+--------------------------------------------|
|
|
| ~SPC m x :~ | Run a custom execute command with =elixir= |
|
|
| ~SPC m x b~ | Run the current buffer through =elixir= |
|
|
| ~SPC m x f~ | Run =elixir= with the given filename |
|
|
|
|
** Code Definition Jump
|
|
|
|
| Key Binding | Description |
|
|
|-------------+----------------------------------------------------|
|
|
| ~SPC m g g~ | Jump to the elixir expression definition at point. |
|
|
| ~SPC m .~ | Jump to the elixir expression definition at point. |
|
|
| ~SPC m g b~ | Pop back to where ~SPC m g g~ was last invoked. |
|
|
| ~SPC m ,~ | Pop back to where ~SPC m g g~ was last invoked. |
|
|
| ~SPC m g n~ | Jump to next symbol definition |
|
|
| ~SPC m g N~ | Jump to previous symbol definition |
|
|
| ~SPC m g j~ | Choose which symbol definition to jump to |
|
|
|
|
** Hex (packages)
|
|
|
|
Hex is the package manager for Elixir & Erlang ecosystem. See https://hex.pm .
|
|
|
|
| Key Binding | Description |
|
|
|-------------+----------------------------------------------------------|
|
|
| ~SPC m X i~ | Display Hex package information for the package at point |
|
|
| ~SPC m X r~ | Display Hex package releases for the package at point |
|
|
| ~SPC m X R~ | Display Hex package releases for a certain package |
|
|
| ~SPC m X I~ | Display Hex package info for a certain package |
|
|
| ~SPC m X s~ | Search for Hex packages |
|
|
|
|
** Macro expand
|
|
|
|
| Key Binding | Description |
|
|
|-------------+-----------------------------------------------------------------------------------|
|
|
| ~SPC m o l~ | Macro expand once the Elixir code on the current line |
|
|
| ~SPC m o L~ | Macro expand once the Elixir code on the current line and insert the result |
|
|
| ~SPC m o k~ | Macro expand completely the Elixir code on the current line |
|
|
| ~SPC m o K~ | Macro expand completely the Elixir code on the current line and insert the result |
|
|
| ~SPC m o i~ | Macro expand once the Elixir code on marked region |
|
|
| ~SPC m o I~ | Macro expand once the Elixir code on marked region once and insert the result |
|
|
| ~SPC m o r~ | Macro expand completely the Elixir code on marked region |
|
|
| ~SPC m o R~ | Macro expand completely the Elixir code on marked region and insert the result |
|