spacemacs/layers/+tools/lsp/README.org

128 lines
6.9 KiB
Org Mode
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#+TITLE: LSP layer
* Table of Contents :TOC_4_gh:noexport:
- [[#description][Description]]
- [[#features][Features:]]
- [[#configuration][Configuration]]
- [[#derived-layers][Derived layers]]
- [[#spacemacslsp-bind-keys-for-mode-mode][=spacemacs/lsp-bind-keys-for-mode mode=]]
- [[#declared-prefixes][Declared prefixes]]
- [[#default-key-bindings][Default key bindings]]
- [[#variables][Variables]]
- [[#diagnostics][Diagnostics]]
- [[#future-additionsimprovements][Future additions/improvements]]
- [[#make-spacemacslsp-bind-keys-for-mode-bind-conditionally][Make =spacemacs/lsp-bind-keys-for-mode= bind conditionally]]
- [[#references][References]]
* Description
This layer adds support for basic language server protocol packages speaking
[[https://microsoft.github.io/language-server-protocol/specification][language server protocol]].
Different language servers may support the language server protocol to varying degrees
and they may also provide extensions; check the language servers website for
details.
=M-x lsp-capabilities= in a LSP buffer to list capabilities of the server.
** Features:
- Cross references (definitions, references, document symbol, workspace symbol
search and others)
- Workspace-wide symbol rename
- Symbol highlighting
- Flycheck
- Completion with =company-lsp=
- Signature help with eldoc
- Symbol documentation in a child frame (=lsp-ui-doc=)
- Navigation using imenu
* Configuration
The LSP ecosystem is based on two packages: [[https://github.com/emacs-lsp/lsp-mode][lsp-mode]] and [[https://github.com/emacs-lsp/lsp-ui][lsp-ui]].
Please check out their documentation.
If you add =lsp-*-enable= to major mode hooks for auto initialization of
language clients, customize =lsp-project-whitelist= =lsp-project-blacklist= to
disable projects you dont want to enable LSP.
** Derived layers
A number of elisp functions have been added to facilitate development of derived layers.
*** =spacemacs/lsp-bind-keys-for-mode mode=
This function binds keys to a number of lsp features useful for all/most modes for the given major mode.
It also declares some relevant keyboard shortcut prefixes.
**** Declared prefixes
The following prefixes have been declared:
| prefix | name | functional area |
|--------+----------------+----------------------------------------------------------------------------|
| ~m =~ | format | Source formatting |
| ~m g~ | goto | Source navigation |
| ~m h~ | help/hierarchy | Help and functions related to hierarchy (class relationships etc.) |
| ~m l~ | lsp/backend | Catchall. Restart LSP backend, other implementation-specific functionality |
| ~m r~ | refactor | What it says on the tin |
| ~m T~ | toggle | Toggle LSP backend features (documentation / symbol info overlays etc.) |
**** Default key bindings
The default bindings are listed below. Derived language server layers should extend this list.
| binding | function |
|---------+-------------------------------------------------|
| ~m = b~ | format buffer (lsp) |
|---------+-------------------------------------------------|
| ~m g i~ | goto implementation (lsp) |
| ~m g t~ | goto type-definition (lsp) |
| ~m g k~ | goto viewport symbol (avy) |
| ~m g m~ | browse file symbols (lsp-ui-imenu) |
| ~m g d~ | find definitions (lsp-ui-peek) |
| ~m g l~ | find implementations (lsp-ui-peek) |
| ~m g r~ | find references (lsp-ui-peek) |
| ~m g s~ | find-workspace-symbol (lsp-ui-peek) |
| ~m g p~ | jump prev (lsp-ui-peek stack - see Note 1) |
| ~m g n~ | jump next (lsp-ui-peek stack - see Note 1) |
| ~m g f~ | jump to flycheck error |
|---------+-------------------------------------------------|
| ~m h h~ | describe thing at point |
|---------+-------------------------------------------------|
| ~m l r~ | lsp-restart-workspace |
| ~m l a~ | execute code action |
|---------+-------------------------------------------------|
| ~m r r~ | rename |
|---------+-------------------------------------------------|
| ~m T d~ | toggle documentation overlay |
| ~m T F~ | toggle documentation overlay function signature |
| ~m T s~ | toggle symbol info overlay |
| ~m T S~ | toggle symbol info overlay symbol name |
| ~m T I~ | toggle symbol info overlay duplicates |
Note 1: There is a window local jump list dedicated to cross references
** Variables
A number of configuration variables have been exposed via the LSP layer =config.el=.
Sensible defaults have been provided, however they may all be overridden in your .spacemacs, or dynamically using the bindings added
under the derived mode t prefix by =(spacemacs/lsp-bind-keys-for-mode mode)=
| Variable name | Default | Description |
|---------------------------------+---------+-------------------------------------------------------------------------------------------|
| =lsp-ui-remap-xref-keybindings= | nil | When non-nil, xref key bindings remapped to lsp-ui-peek-find-{definition,references} |
| =lsp-ui-doc-enable= | t | When non-nil, the documentation overlay is displayed |
| =lsp-ui-doc-include-signature= | nil | When nil, signature omitted from lsp-ui-doc overlay (this is usually redundant) |
| =lsp-ui-sideline-enable= | t | When non-nil, the symbol information overlay is displayed |
| =lsp-ui-sideline-show-symbol= | nil | When non-nil, the symbol information overlay includes symbol name (redundant for c-modes) |
** Diagnostics
If some features do not work as expected, here is a common check list.
- =M-x lsp-capabilities= If the LSP workspace is initialized correctly
- =M-: xref-backend-functions= should be =(lsp--xref-backend)= for cross
references
- =M-: completion-at-point-functions= should be =(lsp-completion-at-point)= for
completion
* Future additions/improvements
** Make =spacemacs/lsp-bind-keys-for-mode= bind conditionally
i.e. only bind keys if the language server supports the capability (queried using =lsp-capabilities=).
=lsp-capabilities= uses current buffer to determine the language server, so this would probably entail adding the bindings dynamically in
a mode hook.
* References
- [[https://github.com/emacs-lsp/lsp-mode][lsp-mode repo]]
- [[https://github.com/emacs-lsp/lsp-ui][lsp-ui repo]]