local misc = require('core.misc') local map, include = misc.map, misc.include local M = {} local function on_list(options) vim.fn.setqflist({}, 'r', options) if #options.items > 1 then vim.cmd.copen() end vim.cmd("cc! 1") end local function _w(func) return function() func({ border = "solid", max_width = math.floor(vim.o.columns * 0.7), }, { on_list = on_list }) end 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', _w(vim.lsp.buf.hover), opts) map('n', 'gd', _w(vim.lsp.buf.definition), opts) map('n', 'gD', _w(vim.lsp.buf.declaration), opts) map('n', 'gi', _w(vim.lsp.buf.implementation), opts) map('n', 'gy', _w(vim.lsp.buf.type_definition), opts) map('n', 'gr', _w(vim.lsp.buf.references), opts) map('n', '', _w(vim.lsp.buf.signature_help), opts) map('n', { 'r', '' }, _w(vim.lsp.buf.rename), opts) map('n', 'gA', _w(vim.lsp.buf.code_action), { buffer = bufnr, desc = 'check code actions', }) map('n', '', _w(vim.lsp.buf.code_action), { buffer = bufnr, desc = 'check code actions' }) -- Diagnostics map('n', '[d', function() if not vim.fn.has("nvim-0.11") then vim.diagnostic.goto_prev() else vim.diagnostic.jump({ count = -1 }) end end, opts) map('n', ']d', function() if not vim.fn.has("nvim-0.11") then vim.diagnostic.goto_next() else vim.diagnostic.jump({ count = 1 }) end end, opts) -- map('n', 'qD', vim.diagnostic.setqflist, 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", } } } if not vim.fn.has("nvim-0.11") then vim.lsp.handlers['textDocument/hover'] = vim.lsp.with( vim.lsp.handlers.hover, { border = 'solid' }) vim.lsp.handlers['textDocument/signatureHelp'] = vim.lsp.with( vim.lsp.handlers.signature_help, { border = 'solid' }) end -- set default capabilities include('lspconfig.util').default_config.capabilities = M.capabilities -- run whenever a client attaches vim.api.nvim_create_autocmd('LspAttach', { callback = function(event) -- map keybinds attach(event.buf) end }) end --- capabilities that are to be used in lsp servers, for those setup through --- lspconfig, this is already set as the default. Incase there is a server --- not setup through lspconfig this function may be called to receive the --- proper capabilities data. M.capabilities = vim.lsp.protocol.make_client_capabilities() --- add capabilities to the default capabilities string ---@param new_capabilities lsp.ClientCapabilities function M.add_capabilities(new_capabilities) vim.tbl_deep_extend('force', M.capabilities, new_capabilities) end return M