return { "neovim/nvim-lspconfig", event = { "BufReadPre", "BufNewFile" }, dependencies = { "hrsh7th/cmp-nvim-lsp", { "antosha417/nvim-lsp-file-operations", config = true }, }, config = function() -- NOTE: LSP Keybinds vim.api.nvim_create_autocmd("LspAttach", { group = vim.api.nvim_create_augroup("UserLspConfig", {}), callback = function(ev) -- Buffer local mappings local opts = { buffer = ev.buf, silent = true } -- Keymaps opts.desc = "Show LSP references" vim.keymap.set("n", "gR", "Telescope lsp_references", opts) opts.desc = "Go to declaration" vim.keymap.set("n", "gD", vim.lsp.buf.declaration, opts) opts.desc = "Show LSP definitions" vim.keymap.set("n", "gd", "Telescope lsp_definitions", opts) opts.desc = "Show LSP implementations" vim.keymap.set("n", "gi", "Telescope lsp_implementations", opts) opts.desc = "Show LSP type definitions" vim.keymap.set("n", "gt", "Telescope lsp_type_definitions", opts) opts.desc = "See available code actions" vim.keymap.set({ "n", "v" }, "vca", function() vim.lsp.buf.code_action() end, opts) opts.desc = "Smart rename" vim.keymap.set("n", "rn", vim.lsp.buf.rename, opts) opts.desc = "Show buffer diagnostics" vim.keymap.set("n", "D", "Telescope diagnostics bufnr=0", opts) opts.desc = "Show line diagnostics" vim.keymap.set("n", "d", vim.diagnostic.open_float, opts) opts.desc = "Show documentation for what is under cursor" vim.keymap.set("n", "K", vim.lsp.buf.hover, opts) opts.desc = "Restart LSP" vim.keymap.set("n", "rs", ":LspRestart", opts) vim.keymap.set("i", "", function() vim.lsp.buf.signature_help() end, opts) end, }) -- Define sign icons for each severity local signs = { [vim.diagnostic.severity.ERROR] = " ", [vim.diagnostic.severity.WARN] = " ", [vim.diagnostic.severity.HINT] = "󰠠 ", [vim.diagnostic.severity.INFO] = " ", } -- Set diagnostic config vim.diagnostic.config({ signs = { text = signs, }, virtual_text = true, underline = true, update_in_insert = false, }) -- Setup servers local cmp_nvim_lsp = require("cmp_nvim_lsp") local capabilities = cmp_nvim_lsp.default_capabilities() -- Global LSP settings (applied to all servers) vim.lsp.config('*', { capabilities = capabilities, }) -- Configure and enable LSP servers -- lua_ls vim.lsp.config("lua_ls", { settings = { Lua = { diagnostics = { globals = { "vim" }, }, completion = { callSnippet = "Replace", }, workspace = { library = { [vim.fn.expand("$VIMRUNTIME/lua")] = true, [vim.fn.stdpath("config") .. "/lua"] = true, }, }, }, }, }) -- emmet_language_server vim.lsp.config("emmet_language_server", { filetypes = { "css", "eruby", "html", "javascript", "javascriptreact", "less", "sass", "scss", "pug", "typescriptreact", }, init_options = { includeLanguages = {}, excludeLanguages = {}, extensionsPath = {}, preferences = {}, showAbbreviationSuggestions = true, showExpandedAbbreviation = "always", showSuggestionsAsSnippets = false, syntaxProfiles = {}, variables = {}, }, }) -- emmet_ls vim.lsp.config("emmet_ls", { filetypes = { "html", "typescriptreact", "javascriptreact", "css", "sass", "scss", "less", "svelte", }, }) -- ts_ls (TypeScript/JavaScript) vim.lsp.config("ts_ls", { filetypes = { "javascript", "javascriptreact", "typescript", "typescriptreact", }, single_file_support = true, init_options = { preferences = { includeCompletionsForModuleExports = true, includeCompletionsForImportStatements = true, }, }, }) -- gopls vim.lsp.config("gopls", { settings = { gopls = { analyses = { unusedparams = true, }, staticcheck = true, gofumpt = true, }, }, }) -- tailwind vim.lsp.config("tailwindcss", { filetypes = { "html", "css", "javascript", "typescript", "javascriptreact", "typescriptreact", "svelte", "vue", "astro", }, init_options = { userLanguages = { astro = "html", }, }, }) vim.lsp.enable("lua_ls") vim.lsp.enable("emmet_language_server") vim.lsp.enable("emmet_ls") vim.lsp.enable("ts_ls") vim.lsp.enable("gopls") vim.lsp.enable("astro") vim.lsp.enable("tailwindcss") end, }