57 lines
1.5 KiB
Lua
57 lines
1.5 KiB
Lua
-- REF: https://github.com/lukas-reineke/dotfiles/blob/master/vim/lua/lsp/diagnostics.lua
|
|
|
|
local M = {}
|
|
|
|
local serverity_map = {
|
|
"DiagnosticError",
|
|
"DiagnosticWarn",
|
|
"DiagnosticInfo",
|
|
"DiagnosticHint",
|
|
}
|
|
local icon_map = {
|
|
" ",
|
|
" ",
|
|
" ",
|
|
" ",
|
|
}
|
|
|
|
local function source_string(source, code)
|
|
if code then
|
|
return string.format(" [%s %s]", source, code)
|
|
else
|
|
return string.format(" [%s]", source)
|
|
end
|
|
end
|
|
|
|
M.line_diagnostics = function()
|
|
local bufnr, lnum = unpack(vim.fn.getcurpos())
|
|
local diagnostics = vim.diagnostic.get(bufnr, { lnum = lnum - 1, })
|
|
if vim.tbl_isempty(diagnostics) then
|
|
return
|
|
end
|
|
|
|
local lines = {}
|
|
|
|
for _, diagnostic in ipairs(diagnostics) do
|
|
table.insert(
|
|
lines,
|
|
icon_map[diagnostic.severity]
|
|
.. " "
|
|
.. diagnostic.message:gsub("\n", " ")
|
|
.. source_string(diagnostic.source, diagnostic.code)
|
|
)
|
|
end
|
|
|
|
local floating_bufnr, _ = vim.lsp.util.open_floating_preview(lines, "plaintext", {
|
|
border = vim.g.floating_window_border_dark,
|
|
focus_id = "line",
|
|
})
|
|
|
|
for i, diagnostic in ipairs(diagnostics) do
|
|
local message_length = #lines[i] - #source_string(diagnostic.source, diagnostic.code)
|
|
vim.api.nvim_buf_add_highlight(floating_bufnr, -1, serverity_map[diagnostic.severity], i - 1, 0, message_length)
|
|
vim.api.nvim_buf_add_highlight(floating_bufnr, -1, "DiagnosticSource", i - 1, message_length, -1)
|
|
end
|
|
end
|
|
|
|
return M
|