Files
dotfiles/roles/nvim/files/lua/config/plugins/lsp/lspconfig.lua
2026-03-16 23:44:52 +01:00

101 lines
2.9 KiB
Lua

return {
'neovim/nvim-lspconfig',
event = { 'BufReadPre', 'BufNewFile' },
dependencies = {
'mason-org/mason.nvim',
'mason-org/mason-lspconfig.nvim',
'hrsh7th/cmp-nvim-lsp',
{ 'antosha417/nvim-lsp-file-operations', config = true },
{
'folke/lazydev.nvim',
ft = 'lua',
opts = {
library = {
{ path = '${3rd}/luv/library', words = { 'vim%.uv' } },
},
},
},
},
config = function()
local cmp_nvim_lsp = require('cmp_nvim_lsp')
local keymap = vim.keymap
local wk = require('which-key')
vim.api.nvim_create_autocmd('LspAttach', {
group = vim.api.nvim_create_augroup('UserLspConfig', {}),
callback = function(ev)
local function opts(desc)
return { desc = desc, buffer = ev.buf, silent = true }
end
keymap.set('n', 'gd', '<cmd>Telescope lsp_definitions<cr>', opts('Go to definition'))
keymap.set('n', 'gr', '<cmd>Telescope lsp_references<cr>', opts('Show LSP references'))
keymap.set('n', 'gD', vim.lsp.buf.declaration, opts('Go to declaration'))
keymap.set('n', 'gi', '<cmd>Telescope lsp_implementations<cr>', opts('Show LSP implementations'))
keymap.set('n', 'gt', '<cmd>Telescope lsp_type_definitions<cr>', opts('Show LSP type definitions'))
keymap.set('n', 'K', vim.lsp.buf.hover, opts('Show documentation'))
keymap.set('n', 'gE', vim.diagnostic.open_float, opts('Show diagnostics'))
keymap.set({ 'n', 'v' }, 'ga', vim.lsp.buf.code_action, opts('Show available code actions'))
wk.add({
{ '<leader>r', group = 'Rename' },
{ '<leader>rn', vim.lsp.buf.rename, desc = 'Smart Rename' },
})
end,
})
-- Apply default capabilities to all servers
local capabilities = cmp_nvim_lsp.default_capabilities()
vim.lsp.config('*', { capabilities = capabilities })
-- lua_ls: suppress vim global warnings, improve completion
vim.lsp.config('lua_ls', {
settings = {
Lua = {
diagnostics = {
globals = { 'vim' },
},
completion = {
callSnippet = 'Replace',
},
},
},
})
-- ts_ls: TypeScript/JavaScript/JSX/TSX
vim.lsp.config('ts_ls', {
cmd = { 'typescript-language-server', '--stdio' },
filetypes = {
'javascript',
'javascriptreact',
'typescript',
'typescriptreact',
},
init_options = {
hostInfo = 'neovim',
},
})
-- eslint: linting for JS/TS/React projects
vim.lsp.config('eslint', {
settings = {
workingDirectories = { mode = 'auto' },
},
})
-- Explicitly enable all mason-managed servers.
-- This is belt-and-suspenders alongside mason-lspconfig's automatic_enable,
-- ensuring servers start regardless of mason-lspconfig version.
vim.lsp.enable({ 'lua_ls', 'html', 'cssls', 'bashls', 'ts_ls', 'eslint' })
-- hyprls: not managed by mason, enable manually
vim.lsp.config('hyprls', {
cmd = { 'hyprls' },
filetypes = { 'hyprlang' },
root_dir = function(fname)
return vim.fn.getcwd()
end,
})
vim.lsp.enable('hyprls')
end,
}