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', 'Telescope lsp_definitions', opts('Go to definition')) keymap.set('n', 'gr', 'Telescope lsp_references', opts('Show LSP references')) keymap.set('n', 'gD', vim.lsp.buf.declaration, opts('Go to declaration')) keymap.set('n', 'gi', 'Telescope lsp_implementations', opts('Show LSP implementations')) keymap.set('n', 'gt', 'Telescope lsp_type_definitions', 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({ { 'r', group = 'Rename' }, { '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, }