Skip to content

Commit d2e50a3

Browse files
committed
Manually patch in changes from nvim-lua#1590 to fix compatibility with mason-lspconfig 2.0 and nvim >0.1 that was causing my LSP config not to propogate to the LSP
1 parent ec14e9b commit d2e50a3

File tree

1 file changed

+120
-87
lines changed

1 file changed

+120
-87
lines changed

lua/kickstart/plugins/lspconfig.lua

Lines changed: 120 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -204,12 +204,19 @@ return {
204204
},
205205
}
206206

207+
-- NOTE: I have patched this file based on the changes in https://github.com/nvim-lua/kickstart.nvim/pull/1590 to fix compatibility with mason-lspconfig 2.0 and nvim >0.11
208+
207209
-- LSP servers and clients are able to communicate to each other what features they support.
208210
-- By default, Neovim doesn't support everything that is in the LSP specification.
209211
-- When you add blink.cmp, luasnip, etc. Neovim now has *more* capabilities.
210212
-- So, we create new capabilities with blink.cmp, and then broadcast that to the servers.
211-
local capabilities = require('blink.cmp').get_lsp_capabilities()
213+
-- NOTE: The following line is now commented as blink.cmp extends capabilities by default from its internal code:
214+
-- https://github.com/Saghen/blink.cmp/blob/102db2f5996a46818661845cf283484870b60450/plugin/blink-cmp.lua
215+
-- It has been left here as a comment for educational purposes (as the predecessor completion plugin required this explicit step).
216+
--
217+
-- local capabilities = require("blink.cmp").get_lsp_capabilities()
212218

219+
-- Filetypes to load with ltex_plus LSP below
213220
local ltex_plus_filetypes = {
214221
'bib',
215222
'context',
@@ -230,90 +237,111 @@ return {
230237
'typst',
231238
'xhtml',
232239
}
240+
-- Language servers can broadly be installed in the following ways:
241+
-- 1) via the mason package manager; or
242+
-- 2) via your system's package manager; or
243+
-- 3) via a release binary from a language server's repo that's accessible somewhere on your system.
233244

234-
-- Enable the following language servers
235-
-- Feel free to add/remove any LSPs that you want here. They will automatically be installed.
236-
--
237-
-- Add any additional override configuration in the following tables. Available keys are:
238-
-- - cmd (table): Override the default command used to start the server
239-
-- - filetypes (table): Override the default list of associated filetypes for the server
240-
-- - capabilities (table): Override fields in capabilities. Can be used to disable certain LSP features.
241-
-- - settings (table): Override the default settings passed when initializing the server.
242-
-- For example, to see the options for `lua_ls`, you could go to: https://luals.github.io/wiki/settings/
245+
-- The servers table comprises of the following sub-tables:
246+
-- 1. mason
247+
-- 2. others
248+
-- Both these tables have an identical structure of language server names as keys and
249+
-- a table of language server configuration as values.
250+
---@class LspServersConfig
251+
---@field mason table<string, vim.lsp.Config>
252+
---@field others table<string, vim.lsp.Config>
243253
local servers = {
244-
-- gopls = {},
245-
-- pyright = {},
246-
-- rust_analyzer = {},
247-
-- ... etc. See `:help lspconfig-all` for a list of all the pre-configured LSPs
254+
-- Enable the following language servers
255+
-- Feel free to add/remove any LSPs that you want here. They will automatically be installed.
248256
--
249-
awk_ls = {},
250-
bashls = {},
251-
clangd = {}, -- TODO: setup compile_commands.json generation for any projects that need to use this LSP
252-
-- csharp_ls = {}, -- or use omnisharp or rosyln_ls instead?
253-
omnisharp = {},
254-
css_variables = {},
255-
cssls = {},
256-
docker_compose_language_service = {},
257-
dockerls = {},
258-
eslint = {},
259-
-- gdscript = {}, -- TODO: in docs but causes mason error
260-
-- gdshader_lsp = {}, -- TODO: in docs but causes mason error
261-
gh_actions_ls = {},
262-
gitlab_ci_ls = {},
263-
glsl_analyzer = {},
264-
gradle_ls = {},
265-
graphql = {},
266-
groovyls = {},
267-
html = {},
268-
-- java_language_server = {}, -- Note - for fancier use cases jdtls lsp or nvim-jdtls plugin may be better -- TODO: mason errors during install
269-
jqls = {},
270-
jsonls = {},
271-
kotlin_language_server = {},
272-
ltex_plus = {
273-
filetypes = ltex_plus_filetypes,
274-
settings = {
275-
ltex = {
276-
enabled = ltex_plus_filetypes,
257+
-- Add any additional override configuration in the following tables. Available keys are:
258+
-- - cmd (table): Override the default command used to start the server
259+
-- - filetypes (table): Override the default list of associated filetypes for the server
260+
-- - capabilities (table): Override fields in capabilities. Can be used to disable certain LSP features.
261+
-- - settings (table): Override the default settings passed when initializing the server.
262+
-- For example, to see the options for `lua_ls`, you could go to: https://luals.github.io/wiki/settings/
263+
--
264+
-- Feel free to add/remove any LSPs here that you want to install via Mason. They will automatically be installed and setup.
265+
mason = {
266+
-- gopls = {},
267+
-- pyright = {},
268+
-- rust_analyzer = {},
269+
-- ... etc. See `:help lspconfig-all` for a list of all the pre-configured LSPs
270+
--
271+
awk_ls = {},
272+
bashls = {},
273+
clangd = {}, -- TODO: setup compile_commands.json generation for any projects that need to use this LSP
274+
-- csharp_ls = {}, -- or use omnisharp or rosyln_ls instead?
275+
omnisharp = {},
276+
css_variables = {},
277+
cssls = {},
278+
docker_compose_language_service = {},
279+
dockerls = {},
280+
eslint = {},
281+
-- gdscript = {}, -- TODO: in docs but causes mason error
282+
-- gdshader_lsp = {}, -- TODO: in docs but causes mason error
283+
gh_actions_ls = {},
284+
gitlab_ci_ls = {},
285+
glsl_analyzer = {},
286+
gradle_ls = {},
287+
graphql = {},
288+
groovyls = {},
289+
html = {},
290+
-- java_language_server = {}, -- Note - for fancier use cases jdtls lsp or nvim-jdtls plugin may be better -- TODO: mason errors during install
291+
jqls = {},
292+
jsonls = {},
293+
kotlin_language_server = {},
294+
ltex_plus = {
295+
filetypes = ltex_plus_filetypes,
296+
settings = {
297+
ltex = {
298+
enabled = ltex_plus_filetypes,
299+
},
277300
},
278-
},
279-
}, -- LaTeX, Markdown, etc. LSP
280-
281-
lua_ls = {
282-
-- cmd = { ... },
283-
-- filetypes = { ... },
284-
-- capabilities = {},
285-
settings = {
286-
Lua = {
287-
completion = {
288-
callSnippet = 'Replace',
301+
}, -- LaTeX, Markdown, etc. LSP
302+
303+
lua_ls = {
304+
-- cmd = { ... },
305+
-- filetypes = { ... },
306+
-- capabilities = {},
307+
settings = {
308+
Lua = {
309+
completion = {
310+
callSnippet = 'Replace',
311+
},
312+
-- You can toggle below to ignore Lua_LS's noisy `missing-fields` warnings
313+
-- diagnostics = { disable = { 'missing-fields' } },
289314
},
290-
-- You can toggle below to ignore Lua_LS's noisy `missing-fields` warnings
291-
-- diagnostics = { disable = { 'missing-fields' } },
292315
},
293316
},
294-
},
295317

296-
-- metals = {}, -- Scala LSP -- TODO: in docs but causes mason error
297-
perlnavigator = {}, -- Other ones that have about the same level of activity are perlls and perlpls
298-
pico8_ls = {},
299-
ruby_lsp = {}, -- or use solargraph? see also standardrb, syntax_tree, and typeprof
300-
spyglassmc_language_server = {}, -- Minecraft datapacks, may require additional configuration
301-
sqls = {}, -- See also the confusingly similarly named sqlls, and sqruff
302-
terraformls = {}, -- This is the official hashicorp one, see also terraform_lsp
303-
tflint = {},
304-
typos_lsp = {}, -- Code spellchecker
305-
306-
-- Some languages (like typescript) have entire language plugins that can be useful:
307-
-- https://github.com/pmizio/typescript-tools.nvim
308-
--
309-
-- But for many setups, the LSP (`ts_ls`) will work just fine
310-
ts_ls = {}, -- see also ts_query_ls, tsgo
318+
-- metals = {}, -- Scala LSP -- TODO: in docs but causes mason error
319+
perlnavigator = {}, -- Other ones that have about the same level of activity are perlls and perlpls
320+
pico8_ls = {},
321+
ruby_lsp = {}, -- or use solargraph? see also standardrb, syntax_tree, and typeprof
322+
spyglassmc_language_server = {}, -- Minecraft datapacks, may require additional configuration
323+
sqls = {}, -- See also the confusingly similarly named sqlls, and sqruff
324+
terraformls = {}, -- This is the official hashicorp one, see also terraform_lsp
325+
tflint = {},
326+
typos_lsp = {}, -- Code spellchecker
327+
328+
-- Some languages (like typescript) have entire language plugins that can be useful:
329+
-- https://github.com/pmizio/typescript-tools.nvim
330+
--
331+
-- But for many setups, the LSP (`ts_ls`) will work just fine
332+
ts_ls = {}, -- see also ts_query_ls, tsgo
311333

312-
vacuum = {}, -- OpenAPI/Swagger linter/analyzer, requires filetypes to be registered
313-
vimls = {}, -- Vimscript
314-
yamlls = {},
334+
vacuum = {}, -- OpenAPI/Swagger linter/analyzer, requires filetypes to be registered
335+
vimls = {}, -- Vimscript
336+
yamlls = {},
315337

316-
-- TODO: There are a shitload of python LSPs - research and pick one
338+
-- TODO: There are a shitload of python LSPs - research and pick one
339+
},
340+
-- This table contains config for all language servers that are *not* installed via Mason.
341+
-- Structure is identical to the mason table from above.
342+
others = {
343+
-- dartls = {},
344+
},
317345
}
318346

319347
-- Ensure the servers and tools above are installed
@@ -329,26 +357,31 @@ return {
329357
--
330358
-- You can add other tools here that you want Mason to install
331359
-- for you, so that they are available from within Neovim.
332-
local ensure_installed = vim.tbl_keys(servers or {})
360+
local ensure_installed = vim.tbl_keys(servers.mason or {})
333361
vim.list_extend(ensure_installed, {
334362
'stylua', -- Used to format Lua code
335363
})
336364
require('mason-tool-installer').setup { ensure_installed = ensure_installed }
337365

366+
-- Either merge all additional server configs from the `servers.mason` and `servers.others` tables
367+
-- to the default language server configs as provided by nvim-lspconfig or
368+
-- define a custom server config that's unavailable on nvim-lspconfig.
369+
for server, config in pairs(vim.tbl_extend('keep', servers.mason, servers.others)) do
370+
if not vim.tbl_isempty(config) then
371+
vim.lsp.config(server, config)
372+
end
373+
end
374+
375+
-- After configuring our language servers, we now enable them
338376
require('mason-lspconfig').setup {
339377
ensure_installed = {}, -- explicitly set to an empty table (Kickstart populates installs via mason-tool-installer)
340-
automatic_installation = false,
341-
handlers = {
342-
function(server_name)
343-
local server = servers[server_name] or {}
344-
-- This handles overriding only values explicitly passed
345-
-- by the server configuration above. Useful when disabling
346-
-- certain features of an LSP (for example, turning off formatting for ts_ls)
347-
server.capabilities = vim.tbl_deep_extend('force', {}, capabilities, server.capabilities or {})
348-
require('lspconfig')[server_name].setup(server)
349-
end,
350-
},
378+
automatic_enable = true, -- automatically run vim.lsp.enable() for all servers that are installed via Mason
351379
}
380+
381+
-- Manually run vim.lsp.enable for all language servers that are *not* installed via Mason
382+
if not vim.tbl_isempty(servers.others) then
383+
vim.lsp.enable(vim.tbl_keys(servers.others))
384+
end
352385
end,
353386
},
354387
}

0 commit comments

Comments
 (0)