1
0
Fork 0
numbers/nvim/lua/plugins/lsp/lsp-utils.lua

94 lines
3.2 KiB
Lua

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 <buffer> 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", "<cmd>lua vim.lsp.buf.declaration()<CR>", opts)
vim.api.nvim_buf_set_keymap(bufnr, "n", "gd", "<cmd>lua vim.lsp.buf.definition()<CR>", opts)
vim.api.nvim_buf_set_keymap(bufnr, "n", "gh", "<cmd>lua vim.lsp.buf.hover()<CR>", opts)
vim.api.nvim_buf_set_keymap(bufnr, "n", "gi", "<cmd>lua vim.lsp.buf.implementation()<CR>", opts)
vim.api.nvim_buf_set_keymap(bufnr, "n", "gr", "<cmd>lua vim.lsp.buf.references()<CR>", opts)
vim.api.nvim_buf_set_keymap(bufnr, "i", "<C-h>", "<cmd>lua vim.lsp.buf.signature_help()<CR>", opts)
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>rn", "<cmd>lua vim.lsp.buf.rename()<CR>", opts)
vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>ca", "<cmd>lua vim.lsp.buf.code_action()<CR>", opts)
vim.api.nvim_buf_set_keymap(bufnr, "n", "{g", "<cmd>lua vim.diagnostic.goto_prev()<CR>", opts)
vim.api.nvim_buf_set_keymap(bufnr, "n", "}g", "<cmd>lua vim.diagnostic.goto_next()<CR>", 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