aboutsummaryrefslogtreecommitdiff
path: root/runtime/doc/lsp.txt
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/doc/lsp.txt')
-rw-r--r--runtime/doc/lsp.txt161
1 files changed, 37 insertions, 124 deletions
diff --git a/runtime/doc/lsp.txt b/runtime/doc/lsp.txt
index f4819dc6f8..4f5a9dff9e 100644
--- a/runtime/doc/lsp.txt
+++ b/runtime/doc/lsp.txt
@@ -24,106 +24,15 @@ After installing a language server to your machine, you must let Neovim know
how to start and interact with that language server.
To do so, you can either:
-- Use the |vim.lsp.add_filetype_config()|, which solves the common use-case of
- a single server for one or more filetypes. This can also be used from vim
- via |lsp#add_filetype_config()|.
+- Use https://github.com/neovim/nvim-lsp and one of the existing servers there
+ or set up a new one using the `nvim_lsp/skeleton` interface (and contribute
+ it if you find it useful). This uses |vim.lsp.start_client()| under the
+ hood.
- Or |vim.lsp.start_client()| and |vim.lsp.buf_attach_client()|. These are the
backbone of the LSP API. These are easy to use enough for basic or more
complex configurations such as in |lsp-advanced-js-example|.
================================================================================
- *lsp-filetype-config*
-
-These are utilities specific to filetype based configurations.
-
- *lsp#add_filetype_config()*
- *vim.lsp.add_filetype_config()*
-lsp#add_filetype_config({config}) for Vim.
-vim.lsp.add_filetype_config({config}) for Lua
-
- These are functions which can be used to create a simple configuration which
- will start a language server for a list of filetypes based on the |FileType|
- event.
- It will lazily start start the server, meaning that it will only start once
- a matching filetype is encountered.
-
- The {config} options are the same as |vim.lsp.start_client()|, but
- with a few additions and distinctions:
-
- Additional parameters:~
- `filetype`
- {string} or {list} of filetypes to attach to.
- `name`
- A unique identifying string among all other servers configured with
- |vim.lsp.add_filetype_config|.
-
- Differences:~
- `root_dir`
- Will default to |getcwd()| instead of being required.
-
- NOTE: the function options in {config} like {config.on_init} are for Lua
- callbacks, not Vim callbacks.
->
- " Go example
- call lsp#add_filetype_config({
- \ 'filetype': 'go',
- \ 'name': 'gopls',
- \ 'cmd': 'gopls'
- \ })
- " Python example
- call lsp#add_filetype_config({
- \ 'filetype': 'python',
- \ 'name': 'pyls',
- \ 'cmd': 'pyls'
- \ })
- " Rust example
- call lsp#add_filetype_config({
- \ 'filetype': 'rust',
- \ 'name': 'rls',
- \ 'cmd': 'rls',
- \ 'capabilities': {
- \ 'clippy_preference': 'on',
- \ 'all_targets': v:false,
- \ 'build_on_save': v:true,
- \ 'wait_to_build': 0
- \ }})
-<
->
- -- From Lua
- vim.lsp.add_filetype_config {
- name = "clangd";
- filetype = {"c", "cpp"};
- cmd = "clangd -background-index";
- capabilities = {
- offsetEncoding = {"utf-8", "utf-16"};
- };
- on_init = vim.schedule_wrap(function(client, result)
- if result.offsetEncoding then
- client.offset_encoding = result.offsetEncoding
- end
- end)
- }
-<
- *vim.lsp.copy_filetype_config()*
-vim.lsp.copy_filetype_config({existing_name}, [{override_config}])
-
- You can use this to copy an existing filetype configuration and change it by
- specifying {override_config} which will override any properties in the
- existing configuration. If you don't specify a new unique name with
- {override_config.name} then it will try to create one and return it.
-
- Returns:~
- `name` the new configuration name.
-
- *vim.lsp.get_filetype_client_by_name()*
-vim.lsp.get_filetype_client_by_name({name})
-
- Use this to look up a client by its name created from
- |vim.lsp.add_filetype_config()|.
-
- Returns nil if the client is not active or the name is not valid.
-
-================================================================================
*lsp-core-api*
These are the core api functions for working with clients. You will mainly be
using |vim.lsp.start_client()| and |vim.lsp.buf_attach_client()| for operations
@@ -203,6 +112,12 @@ vim.lsp.start_client({config})
`vim.lsp.client_errors[code]` can be used to retrieve a human
understandable string.
+ `before_init(initialize_params, config)`
+ A function which is called *before* the request `initialize` is completed.
+ `initialize_params` contains the parameters we are sending to the server
+ and `config` is the config that was passed to `start_client()` for
+ convenience. You can use this to modify parameters before they are sent.
+
`on_init(client, initialize_result)`
A function which is called after the request `initialize` is completed.
`initialize_result` contains `capabilities` and anything else the server
@@ -485,18 +400,16 @@ vim.lsp.buf_notify({bufnr}, {method}, {params})
================================================================================
*lsp-logging*
- *lsp#set_log_level()*
-lsp#set_log_level({level})
+ *vim.lsp.set_log_level()*
+vim.lsp.set_log_level({level})
You can set the log level for language server client logging.
Possible values: "trace", "debug", "info", "warn", "error"
Default: "warn"
- Example: `call lsp#set_log_level("debug")`
+ Example: `lua vim.lsp.set_log_level("debug")`
- *lsp#get_log_path()*
*vim.lsp.get_log_path()*
-lsp#get_log_path()
vim.lsp.get_log_path()
Returns the path that LSP logs are written.
@@ -511,43 +424,43 @@ vim.lsp.log_levels
================================================================================
*lsp-omnifunc*
*vim.lsp.omnifunc()*
- *lsp#omnifunc*
-lsp#omnifunc({findstart}, {base})
vim.lsp.omnifunc({findstart}, {base})
To configure omnifunc, add the following in your init.vim:
>
- set omnifunc=lsp#omnifunc
-
- " This is optional, but you may find it useful
- autocmd CompleteDone * pclose
+ " Configure for python
+ autocmd Filetype python setl omnifunc=v:lua.vim.lsp.omnifunc
+
+ " Or with on_attach
+ start_client {
+ ...
+ on_attach = function(client, bufnr)
+ vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
+ end;
+ }
+
+ " This is optional, but you may find it useful
+ autocmd CompleteDone * pclose
<
================================================================================
*lsp-vim-functions*
+To use the functions from vim, it is recommended to use |v:lua| to interface
+with the Lua functions. No direct vim functions are provided, but the
+interface is still easy to use from mappings.
+
These methods can be used in mappings and are the equivalent of using the
request from lua as follows:
>
- lua vim.lsp.buf_request(0, "textDocument/hover", vim.lsp.protocol.make_text_document_position_params())
-<
-
- lsp#text_document_declaration()
- lsp#text_document_definition()
- lsp#text_document_hover()
- lsp#text_document_implementation()
- lsp#text_document_signature_help()
- lsp#text_document_type_definition()
-
->
" Example config
- autocmd Filetype rust,python,go,c,cpp setl omnifunc=lsp#omnifunc
- nnoremap <silent> ;dc :call lsp#text_document_declaration()<CR>
- nnoremap <silent> ;df :call lsp#text_document_definition()<CR>
- nnoremap <silent> ;h :call lsp#text_document_hover()<CR>
- nnoremap <silent> ;i :call lsp#text_document_implementation()<CR>
- nnoremap <silent> ;s :call lsp#text_document_signature_help()<CR>
- nnoremap <silent> ;td :call lsp#text_document_type_definition()<CR>
+ autocmd Filetype rust,python,go,c,cpp setl omnifunc=v:lua.vim.lsp.omnifunc
+ nnoremap <silent> ;dc <cmd>lua vim.lsp.buf.declaration()<CR>
+ nnoremap <silent> ;df <cmd>lua vim.lsp.buf.definition()<CR>
+ nnoremap <silent> ;h <cmd>lua vim.lsp.buf.hover()<CR>
+ nnoremap <silent> ;i <cmd>lua vim.lsp.buf.implementation()<CR>
+ nnoremap <silent> ;s <cmd>lua vim.lsp.buf.signature_help()<CR>
+ nnoremap <silent> ;td <cmd>lua vim.lsp.buf.type_definition()<CR>
<
================================================================================
*lsp-advanced-js-example*