#+TITLE: F# layer

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

[[file:img/fsharp.png]]

* Table of Contents                     :TOC_5_gh:noexport:
- [[#description][Description]]
  - [[#features][Features:]]
- [[#install][Install]]
- [[#configuration][Configuration]]
  - [[#choosing-a-backend][Choosing a backend]]
    - [[#eglot][Eglot]]
    - [[#lsp][LSP]]
- [[#key-bindings][Key bindings]]
  - [[#repl][REPL]]

* Description
This layer adds support for F# language using [[https://github.com/fsharp/fsharpbinding][fsharpbinding]] and [[https://github.com/fsharp/fsharpbinding][fsharp-mode]].

** Features:
- Auto-completion
- Syntax-checking
- Syntax highlighting
- REPL

* Install
To use this configuration layer, add it to your =~/.spacemacs=. You will need to
add =fsharp= to the existing =dotspacemacs-configuration-layers= list in this file.
In addition you require the .NET Core executable in your path.

* Configuration
All layer configurations can be done by setting layer variables in your dotfile.
No custom user config lines are necessary

** Choosing a backend
This layer provides two alternative backends to choose from.

*** Eglot
This is the default choice if nothing is set and no lsp layer
is loaded in your dotfile. This mode provides straight forward
IDE capabilities by means of an external server using the LSP
protocol using =eglot-mode= a lightweight LSP client.
The server is started automatically when a fsharp file is
opened.

This backend is best used if small applications are edited.
To set explicitly set the following in your dotfile:

#+BEGIN_SRC emacs-lisp
  (fsharp :variables fsharp-backend 'eglot)
#+END_SRC

*** LSP
For proper IDE support this backend should be used. It is
also based on an external LSP server however it is using a
more elaborate client providing a lot of standard feature
which are not available by the lightweight alternative.
The server is started automatically when a fsharp file is
opened. The key bindings are the same for all lsp modes
so if you are already familiar with one you should be
able to work the same in all modes.

To set explicitly do the following in your dotfile:

#+BEGIN_SRC emacs-lisp
  (fsharp :variables
          fsharp-backend 'lsp)
#+END_SRC

Normally LSP mode should install the matching server for
you if you require a specific version you need to install it
yourself from [[https://github.com/fsharp/FsAutoComplete][here]].

NOTE: Key bindings for LSP are defined in the
LSP layer. Also it is advisable to have a look
at the autocomplete layer for an optimal
intellisense config for LSP.

* Key bindings

| Key binding | Description          |
|-------------+----------------------|
| ~SPC m c c~ | Build the project    |
| ~SPC m g a~ | Go to alternate file |

** REPL

| Key binding              | Description                                                      |
|--------------------------+------------------------------------------------------------------|
| ~SPC m s b~              | Send buffer to the REPL                                          |
| ~SPC m s B~              | Send buffer to the REPL and switch to the REPL in =insert state= |
| ~SPC m s i~ or ~SPC m '​~ | Start a REPL process                                             |
| ~SPC m s p~              | Send phrase to the REPL                                          |
| ~SPC m s P~              | Send phrase to the REPL and switch to the REPL in =insert state= |
| ~SPC m s r~              | Send region to the REPL                                          |
| ~SPC m s R~              | Send region to the REPL and switch to the REPL in =insert state= |
