local on_attach = function(client, bufnr) local augroup = vim.api.nvim_create_augroup("LspFormatting", {}) -- Mappings. vim.keymap.set("n", "K", "lua vim.lsp.buf.hover()") vim.keymap.set("n", "", "lua vim.lsp.buf.signature_help()") vim.keymap.set("n", "", "lua vim.lsp.buf.type_definition()") vim.keymap.set("n", "", "lua vim.lsp.buf.rename()()") vim.keymap.set("n", "wl", "lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))") vim.keymap.set("n", "wa", "lua vim.lsp.buf.add_workspace_folder()") vim.keymap.set("n", "wr", "lua vim.lsp.buf.remove_workspace_folder()") 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() vim.lsp.buf.format() end, }) end -- use vim's default coloring client.server_capabilities.semanticTokensProvider = nil for _, group in ipairs(vim.fn.getcompletion("@lsp", "highlight")) do vim.api.nvim_set_hl(0, group, {}) end end local nvim_lsp = require('lspconfig') local capabilities = vim.lsp.protocol.make_client_capabilities() -- LSPs local servers = { "clangd", "dartls", "gleam", "lua_ls", "ocamllsp", "pyright", "rnix", "ruff_lsp", "terraformls", "vimls", } for _, lsp in ipairs(servers) do nvim_lsp[lsp].setup { capabilities = capabilities, on_attach = on_attach } end nvim_lsp.rust_analyzer.setup({ on_attach = on_attach, capabilities = capabilities, settings = { ["rust-analyzer"] = { imports = { granularity = { group = "module", }, prefix = "self", }, cargo = { buildScripts = { enable = true, }, }, procMacro = { enable = true }, checkOnSave = { command = "clippy", }, } } }) vim.g.code_action_menu_window_border = 'single' -- symbols-outline.nvim vim.g.symbols_outline = { highlight_hovered_item = true, show_guides = true, auto_preview = false, -- experimental position = 'right', keymaps = { close = "", goto_location = "", focus_location = "o", hover_symbol = "", rename_symbol = "r", code_actions = "a" }, lsp_blacklist = {} } -- LSP Enable diagnostics vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, { virtual_text = false, underline = true, signs = true, update_in_insert = false }) -- Send diagnostics to quickfix list do local method = "textDocument/publishDiagnostics" local default_handler = vim.lsp.handlers[method] vim.lsp.handlers[method] = function(err, method, result, client_id, bufnr, config) default_handler(err, method, result, client_id, bufnr, config) local diagnostics = vim.diagnostic.get() local qflist = {} for bufnr, diagnostic in pairs(diagnostics) do for _, d in ipairs(diagnostic) do d.bufnr = bufnr d.lnum = d.range.start.line + 1 d.col = d.range.start.character + 1 d.text = d.message table.insert(qflist, d) end end end end