return { { dependencies = { { 'williamboman/mason.nvim' }, { 'williamboman/mason-lspconfig.nvim' }, }, 'neovim/nvim-lspconfig', lazy = false, priority = 800, config = function() require("mason").setup() require("mason-lspconfig").setup() local capabilities = require('cmp_nvim_lsp').default_capabilities() -- Use a loop to conveniently call 'setup' on multiple servers and -- map buffer local keybindings when the language server attaches local servers = { "bashls", "clangd", "cssls", "dockerls", "gopls", "htmx", "jsonls", "marksman", "ruff", "rust_analyzer", "taplo", "ts_ls", "ty", "yamlls" } for _, lsp in ipairs(servers) do vim.lsp.config(lsp, { capabilities = capabilities, flags = { debounce_text_changes = 150, }, }) vim.lsp.enable(lsp) end vim.lsp.config('basedpyright', { settings = { basedpyright = { disableOrganizeImports = true, }, python = { analysis = { ignore = { '*' }, }, }, } }) vim.lsp.enable('basedpyright') vim.lsp.config('lua_ls', { on_init = function(client) local path = client.workspace_folders[1].name if vim.loop.fs_stat(path .. '/.luarc.json') or vim.loop.fs_stat(path .. '/.luarc.jsonc') then return end client.config.settings.Lua = vim.tbl_deep_extend('force', client.config.settings.Lua, { runtime = { -- Tell the language server which version of Lua you're using -- (most likely LuaJIT in the case of Neovim) version = 'LuaJIT' }, -- Make the server aware of Neovim runtime files workspace = { checkThirdParty = false, library = { vim.env.VIMRUNTIME -- Depending on the usage, you might want to add additional paths here. -- "${3rd}/luv/library" -- "${3rd}/busted/library", } -- or pull in all of 'runtimepath'. NOTE: this is a lot slower -- library = vim.api.nvim_get_runtime_file("", true) } }) end, settings = { Lua = { format = { enable = true, defaultConfig = { indent_style = "space", indent_size = "2", } }, }, }, capabilities = capabilities, }) vim.lsp.enable('lua_ls') vim.lsp.config('html', { filetypes = { 'html', 'htmldjango' }, capabilities = capabilities, flags = { debounce_text_changes = 150, }, }) vim.lsp.enable('html') vim.lsp.config('intelephense', { filetypes = { 'php' }, capabilities = capabilities, flags = { debounce_text_changes = 150, }, init_options = { licenceKey = '~/.config/intelephense/licence.txt', }, }) vim.lsp.enable('intelephense') -- Use LspAttach autocommand to only map the following keys -- after the language server attaches to the current buffer vim.api.nvim_create_autocmd('LspAttach', { group = vim.api.nvim_create_augroup('UserLspConfig', {}), callback = function(ev) -- Enable completion triggered by vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc' local opts = { buffer = ev.buf } vim.keymap.set('n', 'gd', 'lua vim.lsp.buf.definition()', { noremap = true }) vim.keymap.set('v', 'f', vim.lsp.buf.format, { noremap = true, silent = true }) vim.keymap.set('n', 'f', function() vim.lsp.buf.format { async = true } end, opts) end, }) vim.api.nvim_create_autocmd("LspAttach", { group = vim.api.nvim_create_augroup('lsp_attach_disable_ruff_hover', { clear = true }), callback = function(args) local client = vim.lsp.get_client_by_id(args.data.client_id) if client == nil then return end if client.name == 'ruff' then -- Disable hover in favor of Pyright client.server_capabilities.hoverProvider = false end end, desc = 'LSP: Disable hover capability from Ruff', }) -- Disable diagnostics for gen.nvim vim.api.nvim_create_autocmd({ "LspAttach" }, { group = vim.api.nvim_create_augroup("lsp_disable", { clear = true }), pattern = 'gen.nvim', callback = function(args) vim.diagnostic.enable(false, { bufnr = args.buf }) end, }) vim.api.nvim_create_autocmd({ "BufWritePost" }, { pattern = '*.py', callback = function() vim.lsp.buf.code_action { context = { only = { 'source.fixAll.ruff' }, }, apply = true, } vim.lsp.buf.format { async = true } end }) end, }, }