#+TITLE: lang/elixir
#+DATE:  June 24, 2019
#+SINCE: v2.0.9

* Table of Contents :TOC_3:noexport:
- [[#description][Description]]
  - [[#module-flags][Module flags]]
  - [[#plugins][Plugins]]
- [[#prerequisites][Prerequisites]]
  - [[#install-elixir][Install Elixir]]
    - [[#with-asdf][With ~asdf~]]
    - [[#arch-linux][Arch Linux]]
    - [[#gentoo-linux][Gentoo Linux]]
    - [[#opensuse][openSUSE]]
- [[#features][Features]]
- [[#appendix][Appendix]]
  - [[#commands][Commands]]

* Description
This module provides support for [[https://elixir-lang.org/][Elixir programming language]] via [[https://github.com/tonini/alchemist.el][alchemist.el]]
or [[https://github.com/elixir-lsp/elixir-ls/][elixir-ls]].

** Module flags
+ ~+lsp~ Enable LSP support. Requires [[https://github.com/elixir-lsp/elixir-ls/][elixir-ls]].

** Plugins
+ [[https://github.com/elixir-editors/emacs-elixir][elixir-mode]]
+ [[https://github.com/tonini/alchemist.el][alchemist.el]]
+ [[https://github.com/aaronjensen/flycheck-credo][flycheck-credo]]
+ [[https://github.com/ananthakumaran/exunit.el][exunit]]

* Prerequisites
You should have Elixir installed, for example, via your distribution's package
manager or a version management tool such as [[https://github.com/asdf-vm/asdf-elixir][asdf]].

If you want to add support for LSP ([[modules/tools/lsp][:tools lsp]]), be sure to install [[https://github.com/JakeBecker/elixir-ls/][elixir-ls]]
and enable ~:tools lsp~ in your ~init.el~.

To support linting with [[https://github.com/rrrene/credo][credo]], add ~:checkers syntax~ to your ~init.el~
** Install Elixir
*** With ~asdf~
#+BEGIN_SRC sh
asdf plugin-add elixir
asdf install elixir 1.9.1
#+END_SRC
*** Arch Linux
#+BEGIN_SRC sh :dir /sudo::
sudo pacman -S elixir
#+END_SRC
*** Gentoo Linux
#+BEGIN_SRC sh :dir /sudo::
sudo emerge -v dev-lang/elixir
#+END_SRC

*** openSUSE
#+BEGIN_SRC sh :dir /sudo::
sudo zypper install elixir
#+END_SRC
See [[https://elixir-lang.org/install.html]] for other operating systems
* Features
- Code completion (~:completion company~)
- Documentation lookup (~:tools lookup~)
- Mix integration
- Phoenix support
- ~iex~ integration (~:tools eval~)
- Syntax checking (~:checkers syntax~, using [[https://github.com/aaronjensen/flycheck-credo][flycheck-credo]]~)
* Appendix
** Commands
*** exunit-mode
The exunit-mode prefix is =SPC m t=.  Here is some examples:
|                                          |                  |                                                        |
| command                                  | key / ex command | description                                            |
|------------------------------------------+------------------+--------------------------------------------------------|
| ~exunit-verify-all~                        | =SPC m t a=        | Runs exunit on all files                               |
| ~exunit-rerun~                             | =SPC m t r=        | Re-runs last exunit command                            |
| ~exunit-verify~                            | =SPC m t v=        | Runs exunit on current file                            |
| ~exunit-verify-single~                     | =SPC m t s=        | Runs exunit for the item on cursor                     |
| ~exunit-toggle-file-and-test~              | =SPC m t t=        | Switch between implementation and test                 |
| ~exunit-toggle-file-and-test-other-window~ | =SPC m t T=        | Switch between implementation and test in other window |
