Integrate with mason.nvim
We can use mason.nvim and mason-lspconfig.nvim to help us manage the installation of language servers. And then we can use lspconfig to setup the servers only when they are installed.
Here is a basic example.
require('mason').setup({})
require('mason-lspconfig').setup({
-- Replace the language servers listed here
-- with the ones you want to install
ensure_installed = {'lua_ls', 'rust_analyzer'},
handlers = {
function(server_name)
require('lspconfig')[server_name].setup({})
end,
},
})
This config will tell mason-lspconfig
to install lua_ls and rust_analyzer automatically if they are missing. And lspconfig will handle the configuration of those servers.
The servers listed in the ensure_installed
option must be on this list.
Note that after you install a language server you will need to restart Neovim so the language server can be configured properly.
Configure a language server
If we need to add a custom configuration for a server, you'll need to add a property to handlers
. This new property must have the same name as the language server you want to configure, and you need to assign a function to it.
Lets use an imaginary language server called example_server
as an example.
--- in your own config you should replace
--- `example_server` with the name of a language server
require('mason-lspconfig').setup({
handlers = {
-- this first function is the "default handler"
-- it applies to every language server without a "custom handler"
function(server_name)
require('lspconfig')[server_name].setup({})
end,
-- this is the "custom handler" for `example_server`
example_server = function()
require('lspconfig').example_server.setup({
---
-- in here you can add your own
-- custom configuration
---
})
end,
},
})
Here we use the module lspconfig
to setup the language server and we add our custom config in the first argument of .example_server.setup()
.
Exclude a language server from the automatic setup
If we want to ignore a language server we can use an empty function as a handler. This will make mason-lspconfig
ignore the setup for the language server.
--- in your own config you should replace
--- `example_server` with the name of a language server
local noop = function() end
require('mason-lspconfig').setup({
handlers = {
-- this first function is the "default handler"
-- it applies to every language server without a "custom handler"
function(server_name)
require('lspconfig')[server_name].setup({})
end,
-- this is the "custom handler" for `example_server`
example_server = noop,
},
})
So example_server = noop
is the same thing as this.
example_server = function() end
When the time comes for mason-lspconfig
to setup example_server
it will execute an empty function.