return { { "neovim/nvim-lspconfig", event = { "BufReadPost", "BufNewFile" }, cmd = { "LspInfo", "LspInstall", "LspUninstall" }, dependencies = { "j-hui/fidget.nvim", "RRethy/vim-illuminate", "hrsh7th/cmp-nvim-lsp", }, config = function() local map = require("helpers.keys").map map('n', 'e', vim.diagnostic.open_float, "lsp: open diagnostics float") map('n', '[d', vim.diagnostic.goto_prev, "lsp: goto previous diagnostic") map('n', ']d', vim.diagnostic.goto_next, "lsp: goto next diagnostic") -- set up cool signs for diagnostics local signs = { Error = " ", Warn = "", Hint = "", Info = "" } for type, icon in pairs(signs) do local hl = "DiagnosticSign" .. type vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" }) end -- Diagnostic config local config = { virtual_text = false, signs = { active = signs, }, update_in_insert = true, underline = true, severity_sort = true, float = { focusable = true, style = "minimal", border = "rounded", source = "always", header = "", prefix = "", }, } vim.diagnostic.config(config) -- this function gets run when an lsp connects to a particular buffer. local on_attach = function(_, bufnr) map = require("helpers.keys").lsp_map map("lr", vim.lsp.buf.rename, bufnr, "lsp: rename symbol") map("la", vim.lsp.buf.code_action, bufnr, "lsp: code action") map("ld", vim.lsp.buf.type_definition, bufnr, "lsp: type definition") map("ls", require("telescope.builtin").lsp_document_symbols, bufnr, "lsp: document symbols") map("gd", vim.lsp.buf.definition, bufnr, "lsp: goto definition") map("gD", vim.lsp.buf.declaration, bufnr, "lsp: goto declaration") map("gr", require("telescope.builtin").lsp_references, bufnr, "lsp: goto references") map("gI", vim.lsp.buf.implementation, bufnr, "lsp: goto implementation") map("K", vim.lsp.buf.hover, bufnr, "lsp: hover documentation") map("", vim.lsp.buf.signature_help, bufnr, "lsp: signature help") -- Create a command `:Format` local to the LSP buffer vim.api.nvim_buf_create_user_command(bufnr, "Format", function(_) vim.lsp.buf.format() end, { desc = "lsp: format current buffer" }) map("fm", "Format", bufnr, "lsp: format current buffer") end -- nvim-cmp supports additional completion capabilities, so broadcast that to servers local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities = require("cmp_nvim_lsp").default_capabilities(capabilities) -- misc. local lspconfig = require('lspconfig') local servers = { 'ts_ls', 'jsonls', 'eslint', 'cssls', 'html', 'vala_ls', 'gopls' } for _, lsp in pairs(servers) do lspconfig[lsp].setup { on_attach = on_attach, capabilites = capabilities, } end -- typst/tinymist require("lspconfig")["tinymist"].setup({ on_attach = on_attach, capabilities = capabilities, single_file_support = true, root_dir = function() return vim.fn.getcwd() end, settings = { formatterMode = "typstyle", } }) -- lua require("lspconfig")["lua_ls"].setup({ on_attach = on_attach, capabilities = capabilities, settings = { Lua = { completion = { callSnippet = "Replace", }, diagnostics = { globals = { "vim" }, }, workspace = { library = { [vim.fn.expand("$VIMRUNTIME/lua")] = true, [vim.fn.stdpath("config") .. "/lua"] = true, }, }, }, }, }) -- python require("lspconfig")["pylsp"].setup({ on_attach = on_attach, capabilities = capabilities, settings = { pylsp = { plugins = { -- we had to disable this here for ruff + black to work pycodestyle = { enabled = false, }, ruff = { enabled = true, extendSelect = { "I" }, }, black = { enabled = true, }, }, }, }, }) -- efm require("lspconfig")["efm"].setup({ on_attach = on_attach, settings = { initializationOptions = { documentFormatting = true, documentRangeFormatting = true, hover = true, documentSymbol = true, codeAction = true, completion = true } }, capabilities = capabilities, filetypes = { 'sh', 'tex' }, }) vim.g.rustaceanvim = { -- Plugin configuration tools = { }, -- LSP configuration server = { on_attach = on_attach, vim.lsp.inlay_hint.enable(true), default_settings = { -- rust-analyzer language server configuration ['rust-analyzer'] = { }, }, }, -- DAP configuration dap = { }, } lspconfig.harper_ls.setup { on_attach = on_attach, capabilities = capabilities, settings = { ["harper-ls"] = { linters = { spell_check = true, spelled_numbers = false, an_a = true, sentence_capitalization = true, unclosed_quotes = true, wrong_quotes = false, long_sentences = true, repeated_words = true, spaces = true, matcher = true, correct_number_suffix = true, number_suffix_capitalization = true, multiple_sequential_pronouns = true, linking_verbs = false, avoid_curses = true, } } }, filetypes = { "markdown", "rust", "typescript", "typescriptreact", "javascript", "python", "c", "cpp", "ruby", "swift", "csharp", "toml", "lua", "gitcommit", "java", "html", "vimwiki" } } end, }, { "j-hui/fidget.nvim", event = "VeryLazy", opts = { progress = { suppress_on_insert = true, display = { render_limit = 4, progress_icon = { pattern = "triangle", }, }, }, }, }, { 'mrcjkb/rustaceanvim', version = '^5', -- Recommended lazy = false, -- This plugin is already lazy }, { "folke/lazydev.nvim", ft = "lua", }, { 'fatih/vim-go' }, { "danymat/neogen", config = true, opts = { snippet_engine = "luasnip", languages = { python = { template = { annotation_convention = "reST", } } } } } }