#+TITLE: Erlang layer

#+TAGS: general|layer|multi-paradigm|programming

[[file:img/erlang.png]]

* Table of Contents                     :TOC_5_gh:noexport:
- [[#description][Description]]
  - [[#features][Features:]]
- [[#install][Install]]
  - [[#layer][Layer]]
  - [[#choosing-a-backend][Choosing a backend]]
- [[#configuration][Configuration]]
  - [[#erlang-mode][erlang-mode]]
  - [[#lsp][LSP]]
  - [[#debugger][Debugger]]
- [[#key-bindings][Key bindings]]
  - [[#erlang-mode-1][erlang-mode]]
  - [[#lsp-1][LSP]]
  - [[#dap][DAP]]

* Description
This layer adds support for [[https://erlang.org/][Erlang]].

Enabling [[https://github.com/emacs-lsp/lsp-mode][Lsp-mode]] brings IDE like
features following =Language Server Protocol=, through [[https://erlang-ls.github.io/][erlang_ls]]

** Features:
- Syntax highlighting
- Syntax checking via =Flycheck= integration
- Auto-completion via =Company= integration
- Code Completion
- Go To Definition
- Go To Implementation for OTP Behaviours
- Signature Suggestions
- Compiler Diagnostics
- [[https://erlang.org/doc/man/dialyzer.html][Dialyzer]] Diagnostics
- [[https://github.com/inaka/elvis][Elvis]] Diagnostics
- [[http://erlang.org/doc/apps/edoc/chapter.html][Edoc]]
- Navigation for Included Files
- Find/Peek References
- Outline
- Workspace Symbols
- Code Folding
- Interactive debugger using [[https://github.com/emacs-lsp/dap-mode][dap-mode]]

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

** Choosing a backend
=company-erlang= uses gtags to provide a very basic working environment, it is
the default backend.

You can improve the IDE-like experience by choosing the =lsp= backend, to do so,
first add the =lsp= layer to =dotspacemacs-configuration-layers=, then, set the
layer variable =erlang-backend=:

#+BEGIN_SRC elisp
  (erlang :variables erlang-backend 'lsp)
#+END_SRC

Alternatively the =lsp= backend will be automatically chosen if the layer =lsp=
is used and you did not specify any value for =erlang-backend=.

* Configuration
** erlang-mode
To find the manual page for the function under the cursor you can either set
=erlang-man-root-dir= to erlang man root directory path in the layer definition:

#+BEGIN_SRC elisp
  (erlang :variables erlang-man-root-dir "*path_to_folder*/otp_22/lib/erlang/man")
#+END_SRC

or let =erlang-mode= download it by executing ~M-x erlang-man-download-ask~.

** LSP
The =lsp= backend uses [[https://erlang-ls.github.io/][erlang_ls]] as its language server implementation.

Clone the project to your system and compile it:

#+BEGIN_SRC bash
  make
#+END_SRC

*Note:* Ensure you have =erlang_ls= in your =PATH=...

You can install it:

#+BEGIN_SRC bash
  make install
#+END_SRC

** Debugger
The =dap= backend uses [[https://erlang-ls.github.io/][erlang_ls-dap]] implementation. Information about configuring
a project to use the debugger can be found [[https://erlang-ls.github.io/articles/tutorial-debugger/][here]].

If you are using =erlang_ls= backend, probably you have =els_dap= already
installed, otherwise, follow the instructions.

Clone the project to your system and compile it to produce the =els_dap= escript:

#+BEGIN_SRC bash
  rebar3 as dap escriptize
#+END_SRC

or

#+BEGIN_SRC bash
  make
#+END_SRC

=els_dap= will be found at "erlang_ls/_build/dap/bin/"

*Note:* Ensure you have =els_dap= in your =PATH=...

* Key bindings
** erlang-mode

| Key binding | Description                                                     |
|-------------+-----------------------------------------------------------------|
| ~C-c C-a~   | Align arrows ("->")                                             |
| ~C-c C-c~   | Comment region                                                  |
| ~C-c C-d~   | Display function manual at point                                |
| ~C-c C-j~   | Generate a new clause                                           |
| ~C-c C-q~   | Indent function                                                 |
| ~C-c C-u~   | Uncomment region                                                |
| ~C-c C-y~   | Insert, at the point, the argument list of the previous clause. |
| ~C-c C-z~   | Display the erlang-shell or start a new                         |
| ~C-c M-a~   | Move backward to previous start of clause.                      |
| ~C-c M-e~   | Move to the end of the current clause.                          |
| ~C-c M-h~   | Put mark at end of clause, point at beginning.                  |

** LSP
You will find an overview of all the key bindings on the [[https://github.com/syl20bnr/spacemacs/tree/develop/layers/%2Btools/lsp#key-bindings][lsp layer description]].

** DAP
You will find an overview of all the key bindings on the [[https://github.com/syl20bnr/spacemacs/tree/develop/layers/%2Btools/dap#key-bindings][dap layer description]].
