1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-23 17:50:04 +08:00
SpaceVim/docs/layers/language-server-protocol.md

226 lines
10 KiB
Markdown
Raw Normal View History

2017-12-22 20:52:38 +08:00
---
title: "SpaceVim language server protocol layer"
description: "This layers provides language server protocol for vim and neovim"
---
2018-06-23 14:37:41 +08:00
# [Available Layers](../) >> lsp
2017-12-22 20:52:38 +08:00
<!-- vim-markdown-toc GFM -->
- [Description](#description)
- [Features](#features)
- [Install](#install)
- [Install language server](#install-language-server)
2017-12-22 20:52:38 +08:00
- [Configuration](#configuration)
- [neovim(`>=0.5.0`)](#neovim050)
- [vim or neovim(`<0.5.0`)](#vim-or-neovim050)
2017-12-22 20:52:38 +08:00
- [Key bindings](#key-bindings)
<!-- vim-markdown-toc -->
## Description
2021-10-05 23:39:59 +08:00
This layers adds extensive support for [language-server-protocol](https://microsoft.github.io/language-server-protocol/).
By default, this layer use following language server client implementations:
2017-12-23 15:34:37 +08:00
2021-10-05 23:39:59 +08:00
1. vim-lsp: for vim
2. LanguageClient-neovim: for neovim
3. built-in lsp: for neovim(>=0.5.0)
2017-12-23 15:34:37 +08:00
2017-12-22 20:52:38 +08:00
## Features
2017-12-23 15:34:37 +08:00
- Asynchronous calls
- Code completion (provided by [autocomplete](https://spacevim.org/layers/autocomplete/) layer)
2017-12-23 15:34:37 +08:00
- Lint on the fly
- Rename symbol
- Hover/Get identifier info.
2017-12-23 15:34:37 +08:00
- Goto definition.
- Goto reference locations.
- Workspace/Document symbols query.
- Formatting.
- Code Action/Fix.
2021-06-21 20:39:29 +08:00
**Note:** All these features depend on the implementation of the language server, please
2018-05-21 21:13:54 +08:00
check the list of [Language Servers](https://microsoft.github.io/language-server-protocol/implementors/servers/)
2017-12-23 15:34:37 +08:00
2017-12-22 20:52:38 +08:00
## Install
2021-06-21 20:39:29 +08:00
To use this configuration layer, update your custom configuration file with:
2018-05-21 21:13:54 +08:00
```toml
[[layers]]
name = "lsp"
```
2017-12-22 20:52:38 +08:00
### Install language server
2021-06-21 20:39:29 +08:00
**Ada**
2021-06-21 20:39:29 +08:00
After installing AdaCore's GNAT Studio, add the directory containing `ada_language_server` to your PATH variable.
For instance, if the GNAT Studio 2020 was installed, `ada_language_server` is present by default in
`/opt/GNAT/2020/libexec/gnatstudio/als`.
**Bash**
```sh
npm i -g bash-language-server
```
**JavaScript:**
```sh
npm install -g javascript-typescript-langserver
```
**Python:**
```sh
pip install --user python-language-server
```
**julia:**
The `LanguageServer` package must be installed in Julia (0.6 or greater), i.e.
```sh
julia> Pkg.clone("https://github.com/JuliaEditorSupport/LanguageServer.jl")
```
With new package system in Julia 0.7 and above, we have a package mode in Julia REPL.
in REPL, hit `]` to enter the package management mode, then `add LanguageServer` to install the package.
2018-08-18 16:41:50 +08:00
**PureScript**
```sh
npm install -g purescript-language-server
```
2018-09-09 13:13:55 +08:00
**Vue:**
```sh
npm install vue-language-server -g
```
2019-01-29 23:27:59 +08:00
**css:**
```sh
npm install -g vscode-css-languageserver-bin
```
**ruby:**
```sh
gem install solargraph
```
**Elm:**
```sh
npm install -g @elm-tooling/elm-language-server
npm install -g elm elm-test elm-format
```
**vim**
```
npm install -g vim-language-server
```
2017-12-22 20:52:38 +08:00
## Configuration
### neovim(`>=0.5.0`)
If you are using `nvim(>=0.5.0)`. You need to use `enabled_clients` to specific the language servers.
for example:
```toml
[[layers]]
name = 'lsp'
enabled_clients = ['vimls', 'clangd']
```
To override the command of client, you may need to use `override_client_cmds` option:
```toml
[[layers]]
name = "lsp"
enabled_clients = ['vimls', 'clangd']
[layers.override_client_cmds]
vimls = ["vim-language-server", "--stdio"]
```
### vim or neovim(`<0.5.0`)
2020-02-22 09:44:21 +08:00
To enable lsp support for a specified filetype, you may need to load this layer with `filetypes` option, for example:
2017-12-22 20:52:38 +08:00
2018-05-21 21:13:54 +08:00
```toml
[[layers]]
name = "lsp"
filetypes = [
"rust",
"javascript"
]
2017-12-22 20:52:38 +08:00
```
2017-12-22 21:50:03 +08:00
default language server commands:
| language | server command |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `ada` | `['ada_language_server']` |
| `c` | `['clangd']` |
| `cpp` | `['clangd']` |
| `crystal` | `['scry']` |
| `css` | `['css-languageserver', '--stdio']` |
| `dart` | `['dart_language_server']` |
| `elm` | `['elm-language-server']` |
| `go` | `['gopls']` |
| `haskell` | `['hie', '--lsp']` |
| `html` | `['html-languageserver', '--stdio']` |
| `javascript` | `['typescript-language-server', '--stdio']` |
| `javascriptreact` | `['typescript-language-server', '--stdio']` |
| `julia` | `['julia', '--startup-file=no', '--history-file=no', '-e', 'using LanguageServer; server = LanguageServer.LanguageServerInstance(STDIN, STDOUT, false); server.runlinter = true; run(server);']` |
| `objc` | `['clangd']` |
| `objcpp` | `['clangd']` |
| `php` | `['php', 'path/to/bin/php-language-server.php']` |
| `purescript` | `['purescript-language-server', '--stdio']` |
| `python` | `['pyls']` |
| `ruby` | `['solargraph', 'stdio']` |
| `reason` | `['ocaml-language-server']` |
| `rust` | `['rustup', 'run', 'nightly', 'rls']` |
| `sh` | `['bash-language-server', 'start']` |
| `typescript` | `['typescript-language-server', '--stdio']` |
| `typescriptreact` | `['typescript-language-server', '--stdio']` |
| `vim` | `['vim-language-server', '--stdio']` |
| `vue` | `['vls']` |
2017-12-22 21:50:03 +08:00
To override the server command, you may need to use `override_cmd` option:
2018-05-21 21:13:54 +08:00
```toml
[[layers]]
name = "lsp"
filetypes = [
"rust",
"javascript"
]
[layers.override_cmd]
rust = ["rustup", "run", "nightly", "rls"]
2017-12-22 21:50:03 +08:00
```
2017-12-22 20:52:38 +08:00
## Key bindings
2017-12-23 15:10:00 +08:00
| Key Binding | Description |
| --------------- | ------------- |
| `K` / `SPC l d` | show document |
| `SPC l e` | rename symbol |
if the checkers layer is not loaded, these key bindings will be added:
| Key | description |
| --------- | ------------------------------------------------------------ |
| `SPC e c` | clear errors |
| `SPC e n` | jump to the position of next error |
| `SPC e N` | jump to the position of previous error |
| `SPC e p` | jump to the position of previous error |
| `SPC e l` | display a list of all the errors |
| `SPC e L` | display a list of all the errors and focus the errors buffer |