vim.fn.sign_define( "DiagnosticSignError", { text = " ", texthl = "DiagnosticSignError", numhl = "LspDiagnosticsLineNrError" } ) vim.fn.sign_define( "DiagnosticSignWarn", { text = " ", texthl = "DiagnosticSignWarn", numhl = "LspDiagnosticsLineNrWarning" } ) vim.fn.sign_define( "DiagnosticSignInformation", { text = " ", texthl = "DiagnosticSignInfo", numhl = "LspDiagnosticsLineNrInformation" } ) vim.fn.sign_define( "DiagnosticSignHint", { text = " ", texthl = "DiagnosticSignHint", numhl = "LspDiagnosticsLineNrHint" } ) vim.diagnostic.config({ virtual_text = false, update_in_insert = true, severity_sort = true, source = "always", }) local U = {} function U.fmt_on_save(client) if client.resolved_capabilities.document_formatting then vim.api.nvim_command("autocmd BufWritePre lua vim.lsp.buf.formatting_sync()") end end function U.capabilities() local capabilities = vim.lsp.protocol.make_client_capabilities() return require("cmp_nvim_lsp").update_capabilities(capabilities) end ---Disable formatting for servers. Handles by null-ls ---@source https://github.com/jose-elias-alvarez/null-ls.nvim/wiki/Avoiding-LSP-formatting-conflicts function U.disable_formatting(client) client.resolved_capabilities.document_formatting = false client.resolved_capabilities.document_range_formatting = false end function U.mappings(bufnr) local opts = { noremap = true, silent = true } vim.api.nvim_buf_set_keymap(bufnr, "n", "gD", "lua vim.lsp.buf.declaration()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "gd", "lua vim.lsp.buf.definition()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "gh", "lua vim.lsp.buf.hover()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "gi", "lua vim.lsp.buf.implementation()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "gr", "lua vim.lsp.buf.references()", opts) vim.api.nvim_buf_set_keymap(bufnr, "i", "", "lua vim.lsp.buf.signature_help()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "rn", "lua vim.lsp.buf.rename()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "ca", "lua vim.lsp.buf.code_action()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "{g", "lua vim.diagnostic.goto_prev()", opts) vim.api.nvim_buf_set_keymap(bufnr, "n", "}g", "lua vim.diagnostic.goto_next()", opts) end function U.goto_split(split_cmd) local handler = function(_, result, ctx) if result == nil or vim.tbl_isempty(result) then local _ = require("vim.lsp.log").info() and require("vim.lsp.log").info(ctx.method, "No location found") return nil end if split_cmd then vim.cmd(split_cmd) end if vim.tbl_islist(result) then vim.lsp.util.jump_to_location(result[1]) if #result > 1 then vim.lsp.util.set_qflist(vim.lsp.util.locations_to_items(result)) vim.api.nvim_command("copen") vim.api.nvim_command("wincmd p") end else vim.lsp.util.jump_to_location(result) end end return handler end function U.code_action_listener() local context = { diagnostics = vim.lsp.diagnostic.get_line_diagnostics() } local params = vim.lsp.util.make_range_params() params.context = context vim.lsp.buf_request(0, "textDocument/codeAction", params, function(err, _, result) end) end return U