neovim / nvim-lspconfig

Quickstart configs for Nvim LSP
Apache License 2.0
9.98k stars 2.04k forks source link
language-server language-server-protocol lsp neovim nvim plugin vim

nvim-lspconfig

Configs for the Nvim LSP client (:help lsp).

See also :help lspconfig.

Install

LuaRocks

Quickstart

  1. Install a language server, e.g. pyright
    npm i -g pyright
  2. Add the language server setup to your init.lua.
    require'lspconfig'.pyright.setup{}
  3. Launch Nvim, the language server will attach and provide diagnostics.
    nvim main.py
  4. Run :checkhealth lsp 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.

Configuration

Nvim sets some default options whenever a buffer attaches to an LSP client. See :h lsp-config for more details. In particular, the following options are set:

Nvim also maps K to vim.lsp.buf.hover() in Normal mode.

Nvim 0.10 and newer creates the following default maps unconditionally:

Further customization can be achieved using the LspAttach autocommand event. The LspDetach autocommand event can be used to "cleanup" mappings if a buffer becomes detached from an LSP server. See :h LspAttach and :h LspDetach for details and examples. See :h lsp-buf for details on other LSP functions.

Additional configuration options can be provided for each LSP server by passing arguments to the setup function. See :h lspconfig-setup for details. Example:

local lspconfig = require('lspconfig')
lspconfig.rust_analyzer.setup {
  -- Server-specific settings. See `:help lspconfig-setup`
  settings = {
    ['rust-analyzer'] = {},
  },
}

Troubleshooting

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:

  1. The language server is not installed. nvim-lspconfig does not install language servers for you. You should be able to run the 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.
  2. Missing filetype plugins. Certain languages are not detecting by vim/neovim because they have not yet been added to the filetype detection system. Ensure :set ft? shows the filetype and not an empty value.
  3. Not triggering root detection. Some language servers will only start if it is opened in a directory, or child directory, containing a file which signals the root of the project. Most of the time, this is a .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.
  4. You must pass capabilities for each setup {} if you want these to take effect.
  5. Do not call 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.

Commands

Wiki

See the wiki for additional topics, including:

Contributions

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:

  1. Read CONTRIBUTING.md.
  2. Create a new file at lua/lspconfig/server_configurations/SERVER_NAME.lua.
  3. Ask questions on GitHub Discussions or in the Neovim Matrix room.

Release process

To publish a release:

License

Copyright Neovim contributors. All rights reserved.

nvim-lspconfig is licensed under the terms of the Apache 2.0 license.

See LICENSE.md