Retour au classement

neovim/nvim-lspconfig

Lua

Quickstart configs for Nvim LSP

vimnvimneovimlsplanguage-server-protocollanguage-serverplugin
Croissance des étoiles
Étoiles
13.8k
Forks
2.5k
Croissance hebdomadaire
Issues
28
5k10k
janv. 2023mars 2024mai 2025juil. 2026
README

nvim-lspconfig

nvim-lspconfig is a collection of LSP server configurations for the Nvim LSP client.

View all configs, or run :help lspconfig-all from Nvim.

Important ⚠️

  • require('lspconfig') (the legacy "framework" of nvim-lspconfig) is deprecated in favor of vim.lsp.config (Nvim 0.11+).
    • The lspconfig.lua module will be dropped. Calls to require('lspconfig') will show a warning, which will later become an error.
  • nvim-lspconfig itself is NOT deprecated. It provides server-specific configs.
    • The configs live in the lsp/ directory. vim.lsp.config automatically finds them and merges them with any local lsp/*.lua configs defined by you or a plugin.
    • The old configs in lua/lspconfig/ are deprecated and will be removed.

Migration instructions

  1. Upgrade to Nvim 0.11+
  2. (Optional) Use vim.lsp.config('…') (not require'lspconfig'.….setup{}) to customize or define a config.
  3. Use vim.lsp.enable('…') (not require'lspconfig'.….setup{}) to enable a config, so that it activates for its filetypes.

Support

These configs are best-effort and supported by the community (you). See contributions.

Install

LuaRocks

  • Requires Nvim 0.11.3+.
    • Support for Nvim 0.10 will be removed. Upgrade Nvim and nvim-lspconfig before reporting an issue.
  • With Nvim 0.12+, you can use the builtin vim.pack plugin manager:
    vim.pack.add{
      { src = 'https://github.com/neovim/nvim-lspconfig' },
    }
    
  • Or install nvim-lspconfig using Vim's "packages" feature:
    git clone https://github.com/neovim/nvim-lspconfig ~/.config/nvim/pack/nvim/start/nvim-lspconfig
    
  • Or use a 3rd-party plugin manager.

Quickstart

  1. Install a language server, e.g. pyright
    npm i -g pyright
    
  2. Enable its config in your init.lua (:help lsp-quickstart).
    vim.lsp.enable('pyright')
    
  3. Ensure your project/workspace contains a root marker as specified in :help lspconfig-all.
  4. Open a code file in Nvim. LSP will attach and provide diagnostics.
    nvim main.py
    
  5. Run :checkhealth vim.lsp to see the status or to troubleshoot.

See :help lspconfig-all for the full list of server-specific details. For servers not on your $PATH (e.g., jdtls, elixirls), you must manually set the cmd parameter:

vim.lsp.config('jdtls', {
  cmd = { '/path/to/jdtls' },
})

Commands

  • :LspInfo (alias to :checkhealth vim.lsp) shows the status of active and configured language servers.
  • :lsp enable [<config_name>] (:LspStart for Nvim 0.11 or older) Start the requested server name. Will only successfully start if the command detects a root directory matching the current config.
  • :lsp disable [<config_name>] (:LspStop for Nvim 0.11 or older) Stops the given server. Defaults to stopping all servers active on the current buffer. To force stop use :LspStop!
  • :lsp restart [<client_name>] (:LspRestart for Nvim 0.11 or older) Restarts the given client, and attempts to reattach to all previously attached buffers. Defaults to restarting all active servers.

Configuration

Nvim sets default options and mappings when LSP is active in a buffer:

To customize, see:

Extra settings can be specified for each LSP server. With Nvim 0.11+ you can extend a config by calling vim.lsp.config('…', {…}).

vim.lsp.config('rust_analyzer', {
  -- Server-specific settings. See `:help lsp-quickstart`
  settings = {
    ['rust-analyzer'] = {},
  },
})

Config priority

Configs are sourced in this order:

  1. lsp/ in 'runtimepath'
  2. after/lsp/ in 'runtimepath'
  3. vim.lsp.config()

If you install nvim-lspconfig or similar plugins, the order that configs are applied depends on the load order. To ensure that your own config "wins" and overrides the others, use after/lsp/ and/or vim.lsp.config() to override/extend the defaults.

Creating a config

As code

  1. Run :lua vim.lsp.config('foo', {cmd={'true'}})
  2. Run :lua vim.lsp.enable('foo')
  3. Run :checkhealth vim.lsp, the new config is listed under "Enabled Configurations". 😎

As a file

  1. Create a file after/lsp/foo.lua somewhere on your 'runtimepath'.
    :exe 'edit' stdpath('config') .. '/after/lsp/foo.lua'
    
  2. Add this code to the file (or copy any of the examples from the lsp/ directory in this repo):
    return {
      cmd = { 'true' },
    }
    
  3. Save the file (with ++p to ensure its parent directory is created).
    :write ++p
    
  4. Enable the config.
    :lua vim.lsp.enable('foo')
    
  5. Run :checkhealth vim.lsp, the new config is listed under "Enabled Configurations". 🌈

LSP Settings Type Annotations

nvim-lspconfig generates Lua type definitions for each supported LSP server. By manually adding annotations (e.g., ---@type lspconfig.settings.server_name), you enable auto-completion and diagnostics for your server settings.

Example:

---@type vim.lsp.Config
local config = {
  ---@type lspconfig.settings.lua_ls
  settings = {
    Lua = {
      runtime = {
        version = 'LuaJIT',
      },
      workspace = {
        preloadFileSize = 10000,
        library = {
          vim.env.VIMRUNTIME,
        }
      },
    },
  },
}

vim.lsp.config('lua_ls', config)

Troubleshooting

Start with :checkhealth vim.lsp to troubleshoot. The most common reasons a language server does not start or attach are:

  1. Language server is not installed. nvim-lspconfig does not install language servers for you. You should be able to run the cmd defined in the config from the command line and see that the language server starts. If the cmd is a name instead of an absolute path, ensure it is on your $PATH.

  2. Missing filetype plugins. Some languages are not detected by Nvim because they have not yet been added to the filetype detection system. Ensure :set filetype? shows the filetype and not an empty value.

  3. Not triggering root detection. Some language servers require a "workspace", which is found by looking for an ancestor directory that contains a "root marker". The most common root marker is .git/, but each config defines other "root marker" names. Root markers/directories are listed in :help lspconfig-all.

    You can also explicitly set a root instead of relying on automatic detection by enabling 'exrc' and adding an .nvim.lua at the desired root dir with the following code:

    vim.lsp.config('<client name>', {
      root_dir = vim.fn.fnamemodify(debug.getinfo(1, 'S').source:sub(2), ':p:h'),
    })
    

    Note that prior to nvim 0.12 exrc file is executed only if it's inside of a cwd where you start nvim.

Bug reports

If you found a bug with LSP functionality, report it to Neovim core.

Before reporting a bug, check your logs and the output of :checkhealth vim.lsp. Add this to your init.lua to enable verbose logging:

vim.lsp.log.set_level('debug')

Attempt to run the language server, then run :LspLog to open the log. Most of the time, the reason for failure is present in the logs.

Contributions

If a language server is missing from configs.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 lsp/<server_name>.lua.
  3. Ask questions on GitHub Discussions or in the Neovim Matrix room.

Release process

To publish a release:

  • Create and push a new tag.
  • After pushing the tag, a GitHub action will automatically package the plugin and publish the release to LuaRocks.

License

Copyright Neovim contributors. All rights reserved.

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

See LICENSE.md

Dépôts similaires
neovim/neovim

Vim-fork focused on extensibility and usability

Vim ScriptOtherneovimc
neovim.io
101.3k7k
junegunn/fzf

:cherry_blossom: A command-line fuzzy finder

GoGo ModulesMIT Licensefzfgo
junegunn.github.io/fzf/
81.9k2.8k
LeCoupa/awesome-cheatsheets

👩‍💻👨‍💻 Awesome cheatsheets for popular programming languages, frameworks and development tools. They include everything you should know in one single file.

JavaScriptnpmMIT Licensecheatsheetsjavascript
lecoupa.github.io/awesome-cheatsheets/
46.2k6.7k
helix-editor/helix

A post-modern modal text editor.

Rustcrates.ioMozilla Public License 2.0text-editorvim
helix-editor.com
45.5k3.6k
vim/vim

The official Vim repository

Vim ScriptVim Licensevimc
vim.org
40.7k6.1k
sxyazi/yazi

💥 Blazing fast terminal file manager written in Rust, based on async I/O.

Rustcrates.ioMIT Licenseasyncioconcurrency
yazi-rs.github.io
40.6k945
lapce/lapce

Lightning-fast and Powerful Code Editor written in Rust

Rustcrates.ioApache License 2.0code-editordeveloper-tools
lap.dev/lapce/
38.7k1.3k
junegunn/vim-plug

:hibiscus: Minimalist Vim Plugin Manager

Vim ScriptMIT Licensevim
junegunn.github.io/vim-plug/
35.7k1.9k
NvChad/NvChad

Blazing fast Neovim framework providing solid defaults and a beautiful UI, enhancing your neovim experience.

LuaGNU General Public License v3.0nvimneovim
nvchad.com
28.4k2.2k
ycm-core/YouCompleteMe

A code-completion engine for Vim

PythonPyPIGNU General Public License v3.0vimcode-completion
ycm-core.github.io/YouCompleteMe/
25.9k2.8k
neoclide/coc.nvim

Nodejs extension host for vim & neovim, load extensions like VSCode and host language servers.

TypeScriptnpmOtherautocompletionlanguage-client
25.2k957
syl20bnr/spacemacs

A community-driven Emacs distribution - The best editor is neither Emacs nor Vim, it's Emacs *and* Vim!

Emacs LispGNU General Public License v3.0emacsvim
spacemacs.org
24.6k4.8k