Skip to content

Portable package manager for Neovim that runs everywhere Neovim runs. Easily install and manage LSP servers, DAP servers, linters, and formatters.

License

Notifications You must be signed in to change notification settings

joyspce/mason.nvim

Repository files navigation

nvim-lsp-installer

About

Neovim plugin that allows you to manage LSP servers (servers are installed inside :echo stdpath("data") by default). It works in tandem with lspconfig1 by registering a hook that enhances the PATH environment variable, allowing neovim's LSP client to locate the installed server executable.2

On top of just providing commands for installing & uninstalling LSP servers, it:

  • provides a graphical UI
  • provides the ability to check for, and upgrade to, new server versions through a single interface
  • supports installing custom versions of LSP servers (for example :LspInstall rust_analyzer@nightly)
  • relaxes the minimum requirements by attempting multiple different utilities (for example, only one of wget, curl, or Invoke-WebRequest is required for HTTP requests)
  • hosts a suite of system tests for all supported servers
  • has full support for Windows

1 - while lspconfig is the main target, this plugin may also be used for other use cases
2 - some servers don't provide an executable, in which case the full command to spawn the server is provided instead

Screenshots

Installation

Requires neovim >= 0.7.0 and nvim-lspconfig. The full requirements to install all servers are:

  • For Unix systems: git(1), curl(1) or wget(1), unzip(1), tar(1), gzip(1)
  • For Windows systems: powershell, git, tar, and 7zip or peazip or archiver or winzip or WinRAR
  • Node.js (LTS) & npm
  • Python3 & pip3
  • go >= 1.17
  • JDK
  • Ruby & gem
  • PHP & Composer
  • dotnet
  • pwsh
  • Julia
  • valac (and meson & ninja)
  • rebar3
  • cargo
use {
    "williamboman/nvim-lsp-installer",
    {
        "neovim/nvim-lspconfig",
        setup = function()
            require("nvim-lsp-installer").setup {}
        end
    }
}

vim-plug

Plug "williamboman/nvim-lsp-installer"
Plug "neovim/nvim-lspconfig"

Usage

Setup

In order for nvim-lsp-installer to register the necessary hooks at the right moment, make sure you call the .setup() function before you set up any servers with lspconfig!

require("nvim-lsp-installer").setup {}
Important if you use packer.nvim! (click to expand)

Do not separate the nvim-lsp-installer setup from lspconfig, for example via the config hook. Make sure to colocate the nvim-lsp-installer setup with the lspconfig setup. This is because load order of plugins is not guaranteed, leading to nvim-lsp-installer's config function potentially executing after lspconfig's.

❌ Do not do this:

use {
    {
        "williamboman/nvim-lsp-installer",
        config = function()
            require("nvim-lsp-installer").setup {}
        end
    },
    {
        "neovim/nvim-lspconfig",
        config = function()
            local lspconfig = require("lspconfig")
            lspconfig.sumneko_lua.setup {}
        end
    },
}

✅ Instead, do this:

use {
    "williamboman/nvim-lsp-installer",
    {
        "neovim/nvim-lspconfig",
        config = function()
            require("nvim-lsp-installer").setup {}
            local lspconfig = require("lspconfig")
            lspconfig.sumneko_lua.setup {}
        end
    }
}

Refer to the Configuration section for information about which settings are available.

Commands

  • :LspInstallInfo - opens a graphical overview of your language servers
  • :LspInstall [--sync] [server] ... - installs/reinstalls language servers. Runs in a blocking fashion if the --sync argument is passed (only recommended for scripting purposes).
  • :LspUninstall [--sync] <server> ... - uninstalls language servers. Runs in a blocking fashion if the --sync argument is passed (only recommended for scripting purposes).
  • :LspUninstallAll [--no-confirm] - uninstalls all language servers
  • :LspInstallLog - opens the log file in a new tab window
  • :LspPrintInstalled - prints all installed language servers

Configuration

You may optionally configure certain behavior of nvim-lsp-installer when calling the .setup() function.

Refer to the default configuration for all available settings.

Example:

require("nvim-lsp-installer").setup({
    ensure_installed = { "rust_analyzer", "sumneko_lua" }, -- ensure these servers are always installed
    automatic_installation = true, -- automatically detect which servers to install (based on which servers are set up via lspconfig)
    ui = {
        icons = {
            server_installed = "",
            server_pending = "",
            server_uninstalled = ""
        }
    }
})

Available LSPs

Language Server name
AWK awk_ls
Angular angularls
Ansible ansiblels
Arduino (docs!!!) arduino_language_server
Assembly (GAS/NASM, GO) asm_lsp
AsyncAPI spectral
Bash bashls
Beancount beancount
Bicep bicep
C ccls
C clangd
C# csharp_ls
C# omnisharp
C++ ccls
C++ clangd
CMake cmake
CSS cssls
CSS cssmodules_ls
Clarity clarity_lsp
Clojure clojure_lsp
CodeQL codeqlls
Crystal crystalline
Crystal scry
Cucumber cucumber_language_server
Dart dartls
Deno denols
Dhall dhall_lsp_server
Diagnostic (general purpose server) diagnosticls
Dlang serve_d
Docker dockerls
Dot dotls
EFM (general purpose server) efm
ESLint (docs) eslint
Elixir elixirls
Elm elmls
Ember ember
Emmet emmet_ls
Erlang erlangls
F# fsautocomplete
Flux flux_lsp
Foam (OpenFOAM) foam_ls
Fortran fortls
Go golangci_lint_ls
Go gopls
Grammarly grammarly
GraphQL graphql
Groovy groovyls
HTML html
Haskell hls
Haxe haxe_language_server
Hoon hoon_ls
JSON jsonls
Java jdtls
JavaScript quick_lint_js
JavaScript tsserver
Jsonnet jsonnet_ls
Julia julials
Kotlin kotlin_language_server
LaTeX ltex
LaTeX texlab
Lelwel lelwel_ls
Lua sumneko_lua
Markdown prosemd_lsp
Markdown remark_ls
Markdown zeta_note
Markdown zk
Metamath Zero mm0_ls
Nickel nickel_ls
Nim nimls
OCaml ocamlls
OCaml ocamllsp
Objective C ccls
OneScript, 1C:Enterprise bsl_ls
OpenAPI spectral
OpenCL opencl_ls
PHP intelephense
PHP phpactor
PHP psalm
Perl perlnavigator
Powershell powershell_es
Prisma prismals
Puppet puppet
PureScript purescriptls
Python jedi_language_server
Python pyright
Python sourcery
Python (docs) pylsp
R r_language_server
ReScript rescriptls
Reason reason_ls
Robot Framework robotframework_ls
Rome rome
Ruby solargraph
Rust rust_analyzer
SQL sqlls
SQL sqls
Salt salt_ls
Shopify Theme Check theme_check
Slint slint_lsp
Solidity solang
Solidity solc
Solidity (VSCode) solidity_ls
Sorbet sorbet
Sphinx esbonio
Stylelint stylelint_lsp
Svelte svelte
Swift sourcekit
SystemVerilog svls
SystemVerilog verible
TOML taplo
Tailwind CSS tailwindcss
Terraform terraformls
Terraform (docs) tflint
TypeScript tsserver
Vala vala_ls
VimL vimls
Vue volar
Vue vuels
XML lemminx
YAML yamlls
Zig zls

Custom servers

You can create your own installers by using the same APIs nvim-lsp-installer itself uses. Refer to CUSTOM_SERVERS.md for more information.

Logo

Illustrations in the logo are derived from @Kaligule's "Robots" collection.

Default configuration

local DEFAULT_SETTINGS = {
    -- A list of servers to automatically install if they're not already installed. Example: { "rust_analyzer", "sumneko_lua" }
    ensure_installed = {},
    -- Whether servers that are set up (via lspconfig) should be automatically installed if they're not already installed.
    -- Can either be:
    --   - false: Servers are not automatically installed.
    --   - true: All servers set up via lspconfig are automatically installed.
    --   - { exclude: string[] }: All servers set up via lspconfig, except the ones provided in the list, are automatically installed.
    --       Example: automatic_installation = { exclude = { "rust_analyzer", "solargraph" } }
    automatic_installation = false,
    ui = {
        icons = {
            -- The list icon to use for installed servers.
            server_installed = "",
            -- The list icon to use for servers that are pending installation.
            server_pending = "",
            -- The list icon to use for servers that are not installed.
            server_uninstalled = "",
        },
        keymaps = {
            -- Keymap to expand a server in the UI
            toggle_server_expand = "<CR>",
            -- Keymap to install the server under the current cursor position
            install_server = "i",
            -- Keymap to reinstall/update the server under the current cursor position
            update_server = "u",
            -- Keymap to check for new version for the server under the current cursor position
            check_server_version = "c",
            -- Keymap to update all installed servers
            update_all_servers = "U",
            -- Keymap to check which installed servers are outdated
            check_outdated_servers = "C",
            -- Keymap to uninstall a server
            uninstall_server = "X",
        },
    },

    -- The directory in which to install all servers.
    install_root_dir = path.concat { vim.fn.stdpath "data", "lsp_servers" },

    pip = {
        -- These args will be added to `pip install` calls. Note that setting extra args might impact intended behavior
        -- and is not recommended.
        --
        -- Example: { "--proxy", "https://proxyserver" }
        install_args = {},
    },

    -- Controls to which degree logs are written to the log file. It's useful to set this to vim.log.levels.DEBUG when
    -- debugging issues with server installations.
    log_level = vim.log.levels.INFO,

    -- Limit for the maximum amount of servers to be installed at the same time. Once this limit is reached, any further
    -- servers that are requested to be installed will be put in a queue.
    max_concurrent_installers = 4,
}

About

Portable package manager for Neovim that runs everywhere Neovim runs. Easily install and manage LSP servers, DAP servers, linters, and formatters.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Lua 99.8%
  • Other 0.2%