Files
nvim-config-kickstart/lua/lsp.lua
Fabrice Mouhartem 3815c4fc54 feat!(plugins): remove mason
BREAKING CHANGE: remove the need for `mason` and thus lsp plugins have
to be installed system-wide
2025-07-14 11:26:37 +02:00

137 lines
4.9 KiB
Lua

local lspattach = vim.api.nvim_create_augroup("LspMapping", { clear = true })
-- This function gets run when an LSP connects to a particular buffer.
vim.api.nvim_create_autocmd("LspAttach", {
group = lspattach,
callback = function(args)
-- NOTE: Remember that lua is a real programming language, and as such it is possible
-- to define small helper and utility functions so you don't have to repeat yourself
-- many times.
--
-- In this case, we create a function that lets us more easily define mappings specific
-- for LSP related items. It sets the mode, buffer and description for us each time.
local nmap = function(keys, func, desc)
if desc then
desc = 'LSP: ' .. desc
end
vim.keymap.set('n', keys, func, { buffer = args.buf, silent = true, desc = desc })
end
nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame')
nmap('<leader>c', vim.lsp.buf.code_action, '[C]ode action') -- NOTE: to see if ca is needed
nmap('<leader>f', function() -- https://stackoverflow.com/a/74303272
vim.lsp.buf.code_action({
filter = function(a)
return a.isPreferred
end,
apply = true
})
end, 'code action: [F]ix'
)
nmap('gd', require('telescope.builtin').lsp_definitions, '[G]oto [D]efinition')
nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences')
nmap('gI', require('telescope.builtin').lsp_implementations, '[G]oto [I]mplementation')
nmap('<leader>D', require('telescope.builtin').lsp_type_definitions, 'Type [D]efinition')
nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols')
nmap('<leader>dd', function()
local new_config = not vim.diagnostic.config().virtual_lines
vim.diagnostic.config({ virtual_lines = new_config })
end, '[D]iagnostic toggle virtual lines')
nmap('<leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols')
-- See `:help K` for why this keymap
nmap('K', vim.lsp.buf.hover, 'Hover Documentation')
nmap('<C-k>', vim.lsp.buf.signature_help, 'Signature Documentation')
-- Lesser used LSP functionality
nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
nmap('<leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder')
nmap('<leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder')
nmap('<leader>wl', function()
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
end, '[W]orkspace [L]ist Folders')
-- Create a command `:Format` local to the LSP buffer
vim.api.nvim_buf_create_user_command(args.buf, 'Format', function(_)
vim.lsp.buf.format()
end, { desc = 'Format current buffer with LSP' })
end,
})
-- document existing key chains
require('which-key').add {
-- { "<leader>c", group = "[C]ode" },
-- { "<leader>c_", hidden = true },
{ "<leader>d", group = "[D]ocument / [D]iagnostic" },
{ "<leader>d_", hidden = true },
{ "<leader>g", group = "[G]it" },
{ "<leader>g_", hidden = true },
{ "<leader>h", group = "Git [H]unk" },
{ "<leader>h_", hidden = true },
{ "<leader>r", group = "[R]ename" },
{ "<leader>r_", hidden = true },
{ "<leader>s", group = "[S]earch" },
{ "<leader>s_", hidden = true },
{ "<leader>t", group = "[T]oggle" },
{ "<leader>t_", hidden = true },
{ "<leader>w", group = "[W]orkspace" },
{ "<leader>w_", hidden = true },
}
-- register which-key VISUAL mode
-- required for visual <leader>hs (hunk stage) to work
require('which-key').add {
{ "<leader>", group = "VISUAL <leader>", mode = "v" },
{ "<leader>h", desc = "Git [H]unk", mode = "v" },
}
-- nvim-cmp supports additional completion capabilities, so broadcast that to servers
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities)
-- [[ System LSPs ]]
local setup_godot_dap = function()
local dap = require("dap")
dap.adapters.godot = {
type = "server",
host = "127.0.0.1",
port = 6006,
}
dap.configurations.gdscript = {
{
launch_game_instance = false,
launch_scene = false,
name = "Launch scene",
project = "${workspaceFolder}",
request = "launch",
type = "godot",
},
}
end
setup_godot_dap()
-- [[ lsp configurations ]]
vim.lsp.config("lua_ls", {
settings = {
Lua = {
workspace = { checkThirdParty = false },
telemetry = { enable = false },
-- NOTE: toggle below to ignore Lua_LS's noisy `missing-fields` warnings
-- diagnostics = { disable = { 'missing-fields' } },
},
}
})
vim.diagnostic.config({ virtual_lines = true })
vim.lsp.enable({
-- managed in lsp directory
"ltex_ls_plus", "rust-analyzer", "gdscript",
-- managed by lsp-config
"tinymist", "texlab", "clangd", "pyright", "ts_ls", "eslint", "lua_ls", "bashls"
})