Configs for the Nvim LSP client (:help lsp
).
See also :help lspconfig
.
local use = require('packer').use
require('packer').startup(function()
use 'wbthomason/packer.nvim' -- Package manager
use 'neovim/nvim-lspconfig' -- Configurations for Nvim LSP
end)
npm i -g pyright
require'lspconfig'.pyright.setup{}
nvim main.py
:LspInfo
to see the status or to troubleshoot.See server_configurations.md (:help lspconfig-all
from Nvim) for the full list of configs, including installation instructions and additional, optional, customization suggestions for each language server. For servers that are not on your system path (e.g., jdtls
, elixirls
), you must manually add cmd
to the setup
parameter. Most language servers can be installed in less than a minute.
nvim-lspconfig does not set keybindings or enable completion by default. The following example configuration provides suggested keymaps for the most commonly used language server functions, and manually triggered completion with omnifunc (<c-x><c-o>).
Note: you must pass the defined on_attach
as an argument to every setup {}
call and the keybindings in on_attach
only take effect on buffers with an active language server.
-- Mappings.
-- See `:help vim.diagnostic.*` for documentation on any of the below functions
local opts = { noremap=true, silent=true }
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float, opts)
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts)
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts)
vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist, opts)
-- Use an on_attach function to only map the following keys
-- after the language server attaches to the current buffer
local on_attach = function(client, bufnr)
-- Enable completion triggered by <c-x><c-o>
vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
-- Mappings.
-- See `:help vim.lsp.*` for documentation on any of the below functions
local bufopts = { noremap=true, silent=true, buffer=bufnr }
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts)
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts)
vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts)
vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts)
vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, bufopts)
vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, bufopts)
vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, bufopts)
vim.keymap.set('n', '<space>wl', function()
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
end, bufopts)
vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, bufopts)
vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, bufopts)
vim.keymap.set('n', '<space>ca', vim.lsp.buf.code_action, bufopts)
vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts)
vim.keymap.set('n', '<space>f', vim.lsp.buf.formatting, bufopts)
end
local lsp_flags = {
-- This is the default in Nvim 0.7+
debounce_text_changes = 150,
}
require('lspconfig')['pyright'].setup{
on_attach = on_attach,
flags = lsp_flags,
}
require('lspconfig')['tsserver'].setup{
on_attach = on_attach,
flags = lsp_flags,
}
require('lspconfig')['rust_analyzer'].setup{
on_attach = on_attach,
flags = lsp_flags,
-- Server-specific settings...
settings = {
["rust-analyzer"] = {}
}
}
Manual, triggered completion is provided by Nvim's builtin omnifunc. For autocompletion, a general purpose autocompletion plugin is required.
If you have an issue, the first step is to reproduce with a minimal configuration.
The most common reasons a language server does not start or attach are:
cmd
defined in each server's Lua module from the command line and see that the language server starts. If the cmd
is an executable name instead of an absolute path to the executable, ensure it is on your path.:set ft?
shows the filetype and not an empty value..git
folder, but each server defines the root config in the lua file. See server_configurations.md or the source for the list of root directories.on_attach
and capabilities
for each setup {}
if you want these to take effect.setup {}
twice for the same server. The second call to setup {}
will overwrite the first.Before reporting a bug, check your logs and the output of :LspInfo
. Add the following to your init.vim to enable logging:
vim.lsp.set_log_level("debug")
Attempt to run the language server, and open the log with:
:LspLog
Most of the time, the reason for failure is present in the logs.
:LspInfo
shows the status of active and configured language servers.:LspStart <config_name>
Start the requested server name. Will only successfully start if the command detects a root directory matching the current config. Pass autostart = false
to your .setup{}
call for a language server if you would like to launch clients solely with this command. Defaults to all servers matching current buffer filetype.:LspStop <client_id>
Defaults to stopping all buffer clients.:LspRestart <client_id>
Defaults to restarting all buffer clients.See the wiki for additional topics, including:
If you are missing a language server on the list in server_configurations.md, contributing a new configuration for it helps others, especially if the server requires special setup. Follow these steps:
lua/lspconfig/server_configurations/SERVER_NAME.lua
.