Skip to content

Commit afb6a3c

Browse files
committed
feat(lspconfig): mason/local lsp separation
nvim-lua#1590
1 parent 7a148a5 commit afb6a3c

File tree

1 file changed

+58
-41
lines changed

1 file changed

+58
-41
lines changed

lua/kickstart/plugins/lspconfig.lua

Lines changed: 58 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ return {
3232
},
3333
},
3434

35-
-- Allows extra capabilities provided by nvim-cmp
3635
'saghen/blink.cmp',
3736
},
3837
config = function()
@@ -207,18 +206,20 @@ return {
207206
-- LSP servers and clients are able to communicate to each other what features they support.
208207
-- By default, Neovim doesn't support everything that is in the LSP specification.
209208
-- When you add nvim-cmp, luasnip, etc. Neovim now has *more* capabilities.
210-
-- So, we create new capabilities with nvim cmp, and then broadcast that to the servers.
211-
local capabilities = require('blink.cmp').get_lsp_capabilities()
212209

213-
-- Enable the following language servers
214-
-- Feel free to add/remove any LSPs that you want here. They will automatically be installed.
215-
--
216-
-- Add any additional override configuration in the following tables. Available keys are:
217-
-- - cmd (table): Override the default command used to start the server
218-
-- - filetypes (table): Override the default list of associated filetypes for the server
219-
-- - capabilities (table): Override fields in capabilities. Can be used to disable certain LSP features.
220-
-- - settings (table): Override the default settings passed when initializing the server.
221-
-- For example, to see the options for `lua_ls`, you could go to: https://luals.github.io/wiki/settings/
210+
-- Language servers can broadly be installed in the following ways:
211+
-- 1) via the mason package manager; or
212+
-- 2) via your system's package manager; or
213+
-- 3) via a release binary from a language server's repo that's accessible somewhere on your system.
214+
215+
-- The servers table comprises of the following sub-tables:
216+
-- 1. mason
217+
-- 2. others
218+
-- Both these tables have an identical structure of language server names as keys and
219+
-- a table of language server configuration as values.
220+
---@class LspServersConfig
221+
---@field mason table<string, vim.lsp.Config>
222+
---@field others table<string, vim.lsp.Config>
222223
local servers = {
223224
-- clangd = {},
224225
-- gopls = {},
@@ -249,31 +250,42 @@ return {
249250
-- },
250251
-- },
251252
-- },
252-
texlab = {
253-
settings = {
254-
texlab = {
255-
bibtexFormatter = 'latexindent',
256-
chktex = {
257-
onEdit = false,
258-
onOpenAndSave = true,
253+
254+
-- Feel free to add/remove any LSPs here that you want to install via Mason.
255+
-- They will automatically be installed and setup.
256+
mason = {
257+
lua_ls = {
258+
-- cmd = {...},
259+
-- filetypes = { ...},
260+
-- capabilities = {},
261+
settings = {
262+
Lua = {
263+
completion = {
264+
callSnippet = 'Replace',
265+
},
266+
-- You can toggle below to ignore Lua_LS's noisy `missing-fields` warnings
267+
-- diagnostics = { disable = { 'missing-fields' } },
259268
},
260269
},
261270
},
262-
},
263-
lua_ls = {
264-
-- cmd = {...},
265-
-- filetypes = { ...},
266-
-- capabilities = {},
267-
settings = {
268-
Lua = {
269-
completion = {
270-
callSnippet = 'Replace',
271+
texlab = {
272+
settings = {
273+
texlab = {
274+
bibtexFormatter = 'latexindent',
275+
chktex = {
276+
onEdit = false,
277+
onOpenAndSave = true,
278+
},
271279
},
272-
-- You can toggle below to ignore Lua_LS's noisy `missing-fields` warnings
273-
-- diagnostics = { disable = { 'missing-fields' } },
274280
},
275281
},
276282
},
283+
284+
-- This table contains config for all language servers that are *not* installed via Mason.
285+
-- Structure is identical to the mason table from above.
286+
others = {
287+
-- dartls = {},
288+
},
277289
}
278290

279291
-- Ensure the servers and tools above are installed
@@ -284,27 +296,32 @@ return {
284296

285297
-- You can add other tools here that you want Mason to install
286298
-- for you, so that they are available from within Neovim.
287-
local ensure_installed = vim.tbl_keys(servers or {})
299+
local ensure_installed = vim.tbl_keys(servers.mason or {})
288300
vim.list_extend(ensure_installed, {
289301
'stylua', -- Used to format Lua code
290302
})
291303
require('mason-tool-installer').setup { ensure_installed = ensure_installed }
292304

305+
-- Either merge all additional server configs from the `servers.mason` and `servers.others` tables
306+
-- to the default language server configs as provided by nvim-lspconfig or
307+
-- define a custom server config that's unavailable on nvim-lspconfig.
308+
for server, config in pairs(vim.tbl_extend('keep', servers.mason, servers.others)) do
309+
if not vim.tbl_isempty(config) then
310+
vim.lsp.config(server, config)
311+
end
312+
end
313+
314+
-- After configuring our language servers, we now enable them
293315
require('mason-lspconfig').setup {
294316
ensure_installed = {},
295317
automatic_installation = false,
296318
automatic_enable = true,
297-
handlers = {
298-
function(server_name)
299-
local server = servers[server_name] or {}
300-
-- This handles overriding only values explicitly passed
301-
-- by the server configuration above. Useful when disabling
302-
-- certain features of an LSP (for example, turning off formatting for tsserver)
303-
server.capabilities = vim.tbl_deep_extend('force', {}, capabilities, server.capabilities or {})
304-
require('lspconfig')[server_name].setup(server)
305-
end,
306-
},
307319
}
320+
321+
-- Manually run vim.lsp.enable for all language servers that are *not* installed via Mason
322+
if not vim.tbl_isempty(servers.others) then
323+
vim.lsp.enable(vim.tbl_keys(servers.others))
324+
end
308325
end,
309326
},
310327
}

0 commit comments

Comments
 (0)