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
- optimized for blazing fast startup times
- supports installing custom versions of LSP servers (for example
:LspInstall rust_analyzer@nightly
) - provides configurations for servers that aren't supported by nvim-lspconfig (
eslint
) - common install tasks are abstracted behind Lua APIs (has direct integration with libuv via vim.loop)
- full support for Windows
Requires neovim >= 0.5.0
and nvim-lspconfig. The full requirements to
install all servers are:
- For Unix systems: bash(1), 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
- javac
- Ruby & gem
use {
'neovim/nvim-lsp-config',
'williamboman/nvim-lsp-installer',
}
Plug 'neovim/nvim-lspconfig'
Plug 'williamboman/nvim-lsp-installer'
:LspInstallInfo
- opens a graphical overview of your language servers:LspInstall <server> ...
- installs/reinstalls language servers:LspUninstall <server> ...
- uninstalls language servers:LspUninstallAll
- uninstalls all language servers:LspInstallLog
- opens the log file in a new tab window:LspPrintInstalled
- prints all installed language servers
local lsp_installer = require("nvim-lsp-installer")
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 is exactly the same as lspconfig's setup function (:help lspconfig-quickstart)
server:setup(opts)
vim.cmd [[ do User LspAttachBuffers ]]
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 ok, rust_analyzer = lsp_installer_servers.get_server("rust_analyzer")
if ok then
if not rust_analyzer:is_installed() then
rust_analyzer:install()
end
end
You can configure certain behavior of nvim-lsp-installer by calling the .settings()
function.
Refer to the default configuration for all available settings.
Example:
require("nvim-lsp-installer").settings {
ui = {
icons = {
server_installed = "✓",
server_pending = "➜",
server_uninstalled = "✗"
}
}
}
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 = "◍",
},
},
-- 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,
-- Whether to allow LSP servers to share the same installation directory. For some servers, this effectively causes
-- more than one server to be installed (and uninstalled) when executing `:LspInstall` and `:LspUninstall`. For
-- example, installing `cssls` will also install both `jsonls` and `html` (and the other ways around), as these all
-- share the same underlying package.
allow_federated_servers = true,
}
Language | Server name |
---|---|
Angular | angularls |
Ansible | ansiblels |
Bash | bashls |
Bicep | bicep |
C# | omnisharp |
C++ | clangd |
CMake | cmake |
CSS | cssls |
Clojure | clojure_lsp |
Deno | denols |
Diagnostic (general purpose server) | diagnosticls |
Dlang | serve_d |
Docker | dockerls |
Dot | dotls |
EFM (general purpose server) | efm |
ESLint (docs) | eslintls |
Elixir | elixirls |
Elm | elmls |
Ember | ember |
Emmet | emmet_ls |
Fortran | fortls |
Go | gopls |
GraphQL | graphql |
Groovy | groovyls |
HTML | html |
Haskell | hls |
JSON | jsonls |
Java | jdtls |
Jedi | jedi_language_server |
Kotlin | kotlin_language_server |
LaTeX (unstable preview) | ltex |
LaTeX | texlab |
Lua | sumneko_lua |
OCaml | ocamlls |
PHP | intelephense |
PHP | phpactor |
Prisma | prismals |
Puppet | puppet |
PureScript | purescriptls |
Python | pylsp |
Python | pyright |
ReScript | rescriptls |
Rome | rome |
Ruby | solargraph |
Rust | rust_analyzer |
SQL | sqlls |
SQL | sqls |
Stylelint | stylelint_lsp |
Svelte | svelte |
Tailwind CSS | tailwindcss |
Terraform | terraformls |
Terraform (docs) | tflint |
TypeScript (docs) | tsserver |
VimL | vimls |
Vue | volar |
Vue | vuels |
XML | lemminx |
YAML | yamlls |
Zig | zls |
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.
- Command (and corresponding Lua API) to update outdated servers (e.g.,
:LspUpdate {server}
) - More helpful metadata displayed in the UI window
- Cross-platform CI for all server installers