williamboman/nvim-lsp-installer

github github
lsp-installer
star 939
stars
alert-circle 21
open issues
users 5
subscribers
git-branch 83
forks
CREATED

2021-04-04

UPDATED

1 hour ago


About

Companion plugin for nvim-lspconfig that allows you to seamlessly install LSP servers locally (inside :echo stdpath("data")).

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

  • provides a graphical UI
  • is optimized for blazing fast startup times
  • provides the ability to check for new server versions
  • 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)
  • allows you to install and setup servers without having to restart neovim
  • hosts a suite of system tests for all supported servers
  • has full support for Windows

Screenshots

Installation

Requires neovim >= 0.6.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
  • Node.js (LTS) & npm
  • Python3 & pip3
  • go >= 1.17
  • JDK
  • Ruby & gem
  • PHP & Composer
  • dotnet
  • pwsh
  • Julia
  • valac (and meson & ninja)
  • rebar3

Packer

use {
    'neovim/nvim-lspconfig',
    'williamboman/nvim-lsp-installer',
}

vim-plug

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

Usage

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

Setup

The recommended way of setting up your installed servers is to do it directly through nvim-lsp-installer. By doing so, nvim-lsp-installer will make sure to inject any necessary properties before calling lspconfig's setup function for you. You may find a minimal example below. To see how you can override the default settings for a server, refer to the Wiki.

local lsp_installer = require("nvim-lsp-installer")

-- Register a handler that will be called for each installed server when it's ready (i.e. when installation is finished
-- or if the server is already installed).
lsp_installer.on_server_ready(function(server)
    local opts = {}

    -- (optional) Customize the options passed to the server
    -- if server.name == "tsserver" then
    --     opts.root_dir = function() ... end
    -- end

    -- This setup() function will take the provided server configuration and decorate it with the necessary properties
    -- before passing it onwards to lspconfig.
    -- Refer to https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md
    server:setup(opts)
end)

For more advanced use cases you may also interact with more APIs nvim-lsp-installer has to offer, for example the following (refer to :help nvim-lsp-installer for more docs).

local lsp_installer_servers = require('nvim-lsp-installer.servers')

local servers = {
    "rust_analyzer",
    "clangd",
    "pyright",
}

-- Loop through the servers listed above.
for _, server_name in pairs(servers) do
    local server_available, server = lsp_installer_servers.get_server(server_name)
    if server_available then
        server:on_ready(function ()
            -- When this particular server is ready (i.e. when installation is finished or the server is already installed),
            -- this function will be invoked. Make sure not to use the "catch-all" lsp_installer.on_server_ready()
            -- function to set up servers, to avoid doing setting up a server twice.
            local opts = {}
            server:setup(opts)
        end)
        if not server:is_installed() then
            -- Queue the server to be installed.
            server:install()
        end
    end
end

Configuration

You can configure certain behavior of nvim-lsp-installer by calling the .settings() function.

Make sure to provide your settings before any other interactions with nvim-lsp-installer!

Refer to the default configuration for all available settings.

Example:

local lsp_installer = require("nvim-lsp-installer")

lsp_installer.settings({
    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
Clojure clojure_lsp
CodeQL codeqlls
Crystal crystalline
Cucumber cucumber_language_server
Dart dartls
Deno denols
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
Foam (OpenFOAM) foam_ls
Fortran fortls
Go golangci_lint_ls
Go gopls
Grammarly grammarly
GraphQL graphql
Groovy groovyls
HTML html
Haskell hls
JSON jsonls
Java jdtls
JavaScript quick_lint_js
JavaScript tsserver
Jsonnet jsonnet_ls
Julia julials
Kotlin kotlin_language_server
LaTeX ltex
LaTeX texlab
Lua sumneko_lua
Markdown remark_ls
Markdown zk
Nim nimls
OCaml ocamlls
Objective C ccls
OneScript, 1C:Enterprise bsl_ls
OpenAPI spectral
OpenCL opencl_ls
PHP intelephense
PHP phpactor
PHP psalm
Powershell powershell_es
Prisma prismals
Puppet puppet
PureScript purescriptls
Python jedi_language_server
Python pyright
Python (docs) pylsp
ReScript rescriptls
Rome rome
Ruby solargraph
Rust (wiki) rust_analyzer
SQL sqlls
SQL sqls
Solidity solang
Solidity solc
Solidity (VSCode) solidity_ls
Sorbet sorbet
Sphinx esbonio
Stylelint stylelint_lsp
Svelte svelte
Swift sourcekit
SystemVerilog verible
TOML taplo
Tailwind CSS tailwindcss
Terraform terraformls
Terraform (docs) tflint
TypeScript (docs) 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.

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

Roadmap

  • Command (and corresponding Lua API) to update outdated servers (e.g., :LspUpdateAll)

Default configuration

local DEFAULT_SETTINGS = {
    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 a server
            install_server = "i",
            -- Keymap to reinstall/update a server
            update_server = "u",
            -- Keymap to update all installed servers
            update_all_servers = "U",
            -- 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,
}