local misc = require("core.misc") local map, auto = misc.map, misc.auto local M = {} -- TODO: find a way to make the qflist current item be the one closest to the -- cursor whenever we open it local function on_list(opts) vim.fn.setqflist({}, "r", opts) if #opts.items > 1 then vim.cmd.copen() end vim.cmd(".cc! 1") end ---@type vim.lsp.util.open_floating_preview.Opts local popup_opts = { border = vim.g.border_style } ---@type vim.lsp.buf.hover.Opts ---@diagnostic disable-next-line: assign-type-mismatch local hover_opts = vim.tbl_deep_extend("force", popup_opts, {}) ---@type vim.lsp.buf.signature_help.Opts ---@diagnostic disable-next-line: assign-type-mismatch local signature_opts = vim.tbl_deep_extend("force", popup_opts, {}) ---@type vim.lsp.ListOpts local list_opts = { on_list = on_list } ---@type vim.lsp.LocationOpts ---@diagnostic disable-next-line: assign-type-mismatch local location_opts = vim.tbl_deep_extend("force", list_opts, {}) -- disable the default keybinds (they're bad) for _, bind in ipairs({ "grn", "gra", "gri", "grr" }) do pcall(vim.keymap.del, "n", bind) end --- setup basic options on lsp attach ---@param bufnr number buffer number local function attach(bufnr) local opts = { buffer = bufnr, nowait = true } -- LSP actions map("n", "K", function() vim.lsp.buf.hover(hover_opts) end, opts) map("n", "gd", function() vim.lsp.buf.definition(location_opts) end, opts) map("n", "gD", function() vim.lsp.buf.declaration(location_opts) end, opts) map("n", "gi", function() vim.lsp.buf.implementation(location_opts) end, opts) map("n", "gy", function() vim.lsp.buf.type_definition(location_opts) end, opts) map("n", "gr", function() vim.lsp.buf.references(nil, list_opts) end, opts) map("n", "", function() vim.lsp.buf.signature_help(signature_opts) end, opts) map("n", { "r", "" }, vim.lsp.buf.rename, opts) map("n", { "gA", "" }, vim.lsp.buf.code_action, { buffer = bufnr, desc = "check code actions", }) -- Diagnostics map("n", "[d", function() vim.diagnostic.jump({ count = -1 }) end, opts) map("n", "]d", function() vim.diagnostic.jump({ count = 1 }) end, opts) end function M.setup() vim.diagnostic.config { virtual_text = false, virtual_lines = { only_current_line = true }, update_in_insert = false, underline = true, severity_sort = true, signs = { text = { [vim.diagnostic.severity.ERROR] = "x", [vim.diagnostic.severity.WARN] = "!", [vim.diagnostic.severity.INFO] = "i", [vim.diagnostic.severity.HINT] = "h", } } } -- set default capabilities and attach function vim.lsp.config['*'] = { capabilities = vim.lsp.protocol.make_client_capabilities() } -- make my attach function always run auto("LspAttach", { callback = function(event) attach(event.buf) end }) end return M