return { "neovim/nvim-lspconfig", dependencies = { { "williamboman/mason.nvim", config = true }, "williamboman/mason-lspconfig.nvim", "WhoIsSethDaniel/mason-tool-installer.nvim", "hrsh7th/cmp-nvim-lsp", -- useful LSP status updates { "j-hui/fidget.nvim", opts = {} }, }, config = function() vim.api.nvim_create_autocmd("LspAttach", { group = vim.api.nvim_create_augroup("nyanko-lsp-attach", { clear = true }), callback = function(event) -- highlight references of the word under cursor local client = vim.lsp.get_client_by_id(event.data.client_id) if client and client.supports_method(vim.lsp.protocol.Methods.textDocument_documentHighlight) then local highlight_augroup = vim.api.nvim_create_augroup("nyanko-lsp-highlight", { clear = false }) vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI", }, { buffer = event.buf, group = highlight_augroup, callback = vim.lsp.buf.document_highlight, }) vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI", }, { buffer = event.buf, group = highlight_augroup, callback = vim.lsp.buf.clear_references, }) vim.api.nvim_create_autocmd("LspDetach", { group = vim.api.nvim_create_augroup("nyanko-lsp-detach", { clear = true }), callback = function(detach_event) vim.lsp.buf.clear_references() vim.api.nvim_clear_autocmds({ group = "nyanko-lsp-highlight", buffer = detach_event.buf, }) end, }) end end, }) local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities = vim.tbl_deep_extend("force", capabilities, require("cmp_nvim_lsp").default_capabilities()) local servers = { clangd = {}, lua_ls = { settings = { Lua = { completion = { callSnippet = "replace", }, }, }, }, html = {}, cssls = {}, eslint = { settings = { workingDirectories = { mode = "auto" }, }, }, jsonls = { settings = { json = { schemas = { { fileMatch = { "package.json" }, url = "https://json.schemastore.org/package.json", }, { fileMatch = { "tsconfig*.json" }, url = "https://json.schemastore.org/tsconfig.json", }, { fileMatch = { ".prettierrc", ".prettierrc.json" }, url = "https://json.schemastore.org/prettierrc.json", }, { fileMatch = { ".eslintrc", ".eslintrc.json" }, url = "https//json.schemastore.org/eslintrc.json", }, }, }, }, }, ts_ls = {}, tailwindcss = { settings = { tailwindCSS = { experimental = { classRegex = { "tw`([^`]*)", 'tw="([^"]*)', 'tw={"([^"}]*)', "tw\\.\\w+`([^`]*)", "tw\\(.*?\\)`([^`]*)", { "clsx\\(([^)]*)\\)", "(?:'|\"|`)([^']*)(?:'|\"|`)" }, { "classnames\\(([^)]*)\\)", "'([^']*)'" }, { "cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]" }, { "cn\\(([^)]*)\\)", "(?:'|\"|`)([^']*)(?:'|\"|`)" }, }, }, }, }, }, } require("mason").setup() vim.keymap.set("n", "om", "Mason", { desc = "[O]pen [M]ason" }) local ensure_installed = vim.tbl_keys(servers or {}) vim.list_extend(ensure_installed, { "stylua", -- used to format lua code "prettierd", }) require("mason-tool-installer").setup({ ensure_installed = ensure_installed, }) require("mason-lspconfig").setup({ ensure_installed = {}, automatic_installation = false, handlers = { function(server_name) local server = servers[server_name] or {} server.capabilities = vim.tbl_deep_extend("force", {}, capabilities, server.capabilities or {}) require("lspconfig")[server_name].setup(server) end, }, }) end, }