local wk = require("which-key") require("mason-lspconfig").setup({ automatic_installation = true, }) vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, { border = "rounded", close_events = { "CursorMoved", "BufHidden", "InsertCharPre" }, }) vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, { border = "rounded", }) require("aerial").setup({}) local capabilities = require("cmp_nvim_lsp").default_capabilities() local augroup = vim.api.nvim_create_augroup("LspFormatting", {}) local lsp_rename_mapping = { function() vim.lsp.buf.rename() end, "Rename LSP symbol", } local lsp_references_mapping = { "TroubleToggle lsp_references", "LSP references", } local on_attach = function(client, bufnr) vim.api.nvim_buf_set_option(bufnr, "omnifunc", "v:lua.vim.lsp.omnifunc") -- Normal mappings wk.register({ c = { a = { "lua vim.lsp.buf.code_action()", "Code action" }, r = lsp_rename_mapping, f = { "lua vim.lsp.buf.format()", "Format file", }, o = { "AerialToggle!", "Toggle outline" }, x = { "lua vim.diagnostic.open_float({source= true})", "Show line diagnostics" }, R = lsp_references_mapping, t = { name = "Trouble", t = { "TroubleToggle", "Trouble Toggle" }, r = lsp_references_mapping, w = { "TroubleToggle lsp_workspace_diagnostics", "Workspace diagnostics" }, d = { "TroubleToggle lsp_document_diagnostics", "Document diagnostics" }, q = { "TroubleToggle quickfix", "Quickfix" }, l = { "TroubleToggle loclist", "Location list" }, }, g = { name = "Go to", D = { "lua vim.lsp.buf.declaration()", "Go to declaration" }, d = { "lua vim.lsp.buf.definition()", "Go to definition" }, i = { "lua vim.lsp.buf.implementation()", "Go to implementation" }, t = { "lua vim.lsp.buf.type_definition()", "Go to type definition" }, }, }, }, { prefix = "", buffer = bufnr, }) -- Visual mappings wk.register({ c = { a = { "lua vim.lsp.buf.code_action()", "Range code action" }, f = { "lua vim.lsp.buf.format()", "Range formatting", }, }, }, { mode = "v", prefix = "", buffer = bufnr, }) -- No leader mappings wk.register({ gd = { "lua vim.lsp.buf.definition()", "Go to definition" }, K = { "lua vim.lsp.buf.hover()", "LSP Hover" }, ["lua vim.lsp.buf.signature_help()", "LSP Signature" }, [""] = lsp_rename_mapping, ["[["] = { "AerialPrevUp", "Outline previous" }, ["]]"] = { "AerialNext", "Outline next" }, }, { buffer = bufnr, }) if client.supports_method("textDocument/formatting") then vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr }) vim.api.nvim_create_autocmd("BufWritePre", { group = augroup, buffer = bufnr, callback = function() if vim.g.format_on_save == 1 then vim.lsp.buf.format({ bufnr = bufnr }) end end, }) end end local settings = { capabilities = capabilities, on_attach = on_attach, } -- Neovim require("neodev").setup({}) local servers = { "clangd", "pyright", "rust_analyzer", "gopls", "tailwindcss", "jsonls", "lua_ls", } for _, lsp in pairs(servers) do require("lspconfig")[lsp].setup(settings) end -- JSON require("lspconfig").jsonls.setup(vim.tbl_deep_extend("force", settings, { settings = { json = { schemas = require("schemastore").json.schemas(), validate = { enable = true, }, }, }, })) -- Typescript require("typescript").setup({ disable_commands = false, debug = false, server = settings, }) -- null-ls local null_ls = require("null-ls") vim.g.format_on_save = 1 function _G.toggle_format_on_save() if vim.g.format_on_save == 1 then vim.g.format_on_save = 0 print("Disabled format on save") else vim.g.format_on_save = 1 print("Enabled format on save") end end require("null-ls").setup({ timeout_ms = 5000, sources = { -- General null_ls.builtins.code_actions.refactoring, null_ls.builtins.completion.spell, null_ls.builtins.diagnostics.trail_space, null_ls.builtins.formatting.trim_newlines, null_ls.builtins.formatting.trim_whitespace, -- Git null_ls.builtins.code_actions.gitrebase, null_ls.builtins.code_actions.gitsigns, -- GitHub null_ls.builtins.diagnostics.actionlint, -- Shell null_ls.builtins.code_actions.shellcheck, null_ls.builtins.diagnostics.shellcheck, null_ls.builtins.formatting.shfmt, -- C/C++ null_ls.builtins.formatting.clang_format, null_ls.builtins.formatting.cmake_format, -- Web null_ls.builtins.formatting.prettier, -- null_ls.builtins.code_actions.eslint_d, null_ls.builtins.code_actions.eslint, null_ls.builtins.diagnostics.eslint, -- null_ls.builtins.formatting.eslint, null_ls.builtins.diagnostics.stylelint, null_ls.builtins.formatting.stylelint, null_ls.builtins.formatting.rustywind, -- Markdown null_ls.builtins.formatting.remark, -- Lua -- null_ls.builtins.diagnostics.luacheck, null_ls.builtins.formatting.stylua, -- Python null_ls.builtins.diagnostics.flake8, null_ls.builtins.formatting.black, null_ls.builtins.formatting.isort, -- PHP null_ls.builtins.diagnostics.phpstan, -- Go null_ls.builtins.formatting.gofmt, -- Rust null_ls.builtins.formatting.rustfmt, }, }) vim.api.nvim_create_autocmd("LspAttach", { callback = function(args) vim.bo[args.buf].formatexpr = nil end, }) require("nvim-lightbulb").setup({ autocmd = { enabled = false, }, sign = { enabled = false, }, virtual_text = { enabled = false, }, }) require("fidget").setup({})