#+TITLE: julia layer

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

[[file:img/julia.png]]

* Table of Contents                     :TOC_5_gh:noexport:
- [[#description][Description]]
  - [[#features][Features:]]
- [[#install][Install]]
  - [[#lsp][LSP]]
- [[#options][Options]]
- [[#key-bindings][Key bindings]]

* Description
This layer adds support for [[https://julialang.org][Julia]] to Spacemacs.

** Features:
- Syntax highlighting
- Repl support
- Linting
- Completion
- Jump-to-definition
- Documentation on hover

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

** LSP
This layer can be used with [[https://github.com/JuliaEditorSupport/LanguageServer.jl][LanguageServer.jl]] and Emacs [[https://github.com/emacs-lsp/lsp-mode][lsp-mode]] to provide
richer, IDE-like capabilities. To use this layer with lsp, you must do the
following:
1. =LanguageServer.jl= should be configured automatically, if not, see the
   documentation of =lsp-julia=.
2. define the layer variable =julia-backend= to =lsp= in your dotfile

To enable language server functionality with this layer, follow the instructions
for installation, and then install this layer with:

#+BEGIN_SRC emacs-lisp
  (setq-default
   dotspacemacs-configuration-layers
   '(
     (julia :variables julia-backend 'lsp)))
#+END_SRC

=LanguageServer.jl= tends to have a very long startup time. In the worst case,
=lsp-mode= might give up on the language server before its started, but
regardless usage of =lsp-mode= with Julia can cause long delays when first
opening files. 

By default, the langage server looks for the julia enviornment in =~/.julia/enviornments/v1.0=.
However, unless julia 1.0 is being used, the enviornment path will be incorrect.
Code completions from imported packages will not work. To fix this, set =lsp-julia-default-environment=
to =~/.julia/enviornments/v<your julia version>=. For more information and configuration
options, see [[https://github.com/gdkrmr/lsp-julia][lsp-julia documentation]].

* Options
While =julia-mode= is perfectly usable without configuration or other packages,
you can choose to replace the default functionality of using [[https://github.com/tpapp/julia-repl/][julia-repl]] as the
layer's interactive REPL with the ess REPL and other functionality that comes
with it. To do so, install this layer with:

#+BEGIN_SRC emacs-lisp
  (setq-default
   dotspacemacs-configuration-layers
   '(
     (julia :variables julia-mode-enable-ess t)))
#+END_SRC

* Key bindings

| Key binding | Description                                                                            |
|-------------+----------------------------------------------------------------------------------------|
| ~TAB~       | Expands latex macro (e.g. =\delta=).                                                   |
| ~SPC m l~   | Expands latex macro (e.g. =\delta=).                                                   |
|-------------+----------------------------------------------------------------------------------------|
| ~SPC m = =~ | Indent line                                                                            |
| ~SPC m = d~ | Deindent line                                                                          |
| ~SPC m = q~ | Indent Sexp                                                                            |
|-------------+----------------------------------------------------------------------------------------|
| ~SPC m '~   | Brings up Julia Repl (starts new one or focuses existing).                             |
| ~SPC m r~   | Brings up Julia Repl (starts new one or focuses existing).                             |
| ~SPC m h h~ | Calls ~@doc~ macro on symbol under cursor.                                             |
|-------------+----------------------------------------------------------------------------------------|
| ~SPC m s a~ | Activate the project of the current buffer (call with prefix to activate home project) |
| ~SPC m s d~ | ~cd~ into the buffer directory                                                         |
| ~SPC m s i~ | Brings up Julia Repl (starts new one or focuses existing).                             |
| ~SPC m s b~ | Sends buffer to REPL.                                                                  |
| ~SPC m s t~ | Sends buffer to REPL via ~Revise.includet~.                                            |
| ~SPC m s l~ | Sends line to REPL.                                                                    |
| ~SPC m s s~ | Sends line to REPL.                                                                    |
| ~SPC m s r~ | Sends region or line to REPL.                                                          |
| ~SPC m s m~ | Call ~@macroexpand~ on an expression                                                   |
| ~SPC m s e~ | Call ~@edit~ on an expression                                                          |
| ~SPC m s v~ | Prompt and set a Julia REPL inferior buffer name for the current buffer                |
|-------------+----------------------------------------------------------------------------------------|
| ~SPC m e a~ | Activate the project of the current buffer (call with prefix to activate home project) |
| ~SPC m e d~ | ~cd~ into the buffer directory                                                         |
| ~SPC m e i~ | Brings up Julia Repl (starts new one or focuses existing).                             |
| ~SPC m e b~ | Sends buffer to REPL.                                                                  |
| ~SPC m e t~ | Sends buffer to REPL via ~Revise.includet~.                                            |
| ~SPC m e l~ | Sends line to REPL.                                                                    |
| ~SPC m e s~ | Sends line to REPL.                                                                    |
| ~SPC m e r~ | Sends region or line to REPL.                                                          |
| ~SPC m e m~ | Call ~@macroexpand~ on an expression                                                   |
| ~SPC m e e~ | Call ~@edit~ on an expression                                                          |
| ~SPC m e v~ | Prompt and set a Julia REPL inferior buffer name for the current buffer                |
