dotfiles/config/nvim/lua/fschauen/diagnostic.lua

138 lines
3.9 KiB
Lua

local M = {}
---Show diagnostics in a floating window.
---@param opts table|nil: options passed along to `vim.diagnostic.open_float`.
M.open_float = function(opts) vim.diagnostic.open_float(opts) end
---Toggle diagnostics in the given buffer.
---@param bufnr integer|nil: Buffer number (0 for current buffer, nil for all buffers.
M.toggle = function(bufnr)
local filter = { bufnr = bufnr or 0 }
if vim.diagnostic.is_enabled(filter) then
vim.diagnostic.enable(false, filter)
else
vim.diagnostic.enable(true, filter)
end
end
---Hide currently displayed diagnostics.
---@param bufnr integer|nil: Buffer number (0 for current buffer, nil for all buffers.
M.hide = function(bufnr) vim.diagnostic.hide(nil, bufnr or 0) end
local icons = require("fschauen.util.icons")
local diagnostics_opts = function(severity)
severity = severity or vim.diagnostic.severity.WARN
return {
underline = false,
virtual_text = {
spacing = 6,
prefix = icons.ui.Circle,
severity = {
min = severity,
},
},
virtual_lines = {
severity = {
min = severity,
},
},
jump = {
wrap = false,
severity = {
min = severity,
},
},
float = {
border = "rounded",
},
severity_sort = true,
signs = {
text = {
[vim.diagnostic.severity.ERROR] = icons.diagnostics.Error,
[vim.diagnostic.severity.HINT] = icons.diagnostics.Hint,
[vim.diagnostic.severity.INFO] = icons.diagnostics.Info,
[vim.diagnostic.severity.WARN] = icons.diagnostics.Warn,
},
},
}
end
---Select minimum diagnostic severity for which to show virtual text.
M.select_virtual_text_severity = function()
if not pcall(require, "telescope") then
vim.notify("Telescope not available!", vim.log.levels.ERROR)
return
end
local display_row = require("telescope.pickers.entry_display").create {
separator = "",
items = { { width = 3 }, { remaining = true } },
}
local make_display = function(entry)
return display_row {
{ entry.value.icon, entry.value.highlight },
{ entry.value.title, entry.value.highlight },
}
end
local opts = require("telescope.themes").get_dropdown()
require("telescope.pickers")
.new(opts, {
prompt_title = "Min. severity for virtual text:",
finder = require("telescope.finders").new_table {
results = {
{
title = "Error",
severity = vim.diagnostic.severity.ERROR,
icon = icons.diagnostics_bold.Error,
highlight = "DiagnosticError",
},
{
title = "Warning",
severity = vim.diagnostic.severity.WARN,
icon = icons.diagnostics_bold.Warn,
highlight = "DiagnosticWarn",
},
{
title = "Info",
severity = vim.diagnostic.severity.INFO,
icon = icons.diagnostics_bold.Info,
highlight = "DiagnosticInfo",
},
{
title = "Hint",
severity = vim.diagnostic.severity.HINT,
icon = icons.diagnostics_bold.Hint,
highlight = "DiagnosticHint",
},
},
entry_maker = function(entry)
return { value = entry, ordinal = entry.title, display = make_display }
end,
},
sorter = require("telescope.config").values.generic_sorter(opts),
attach_mappings = function(prompt_bufnr, _)
local actions = require("telescope.actions")
actions.select_default:replace(function()
actions.close(prompt_bufnr)
local selection = require("telescope.actions.state").get_selected_entry()
vim.diagnostic.config(diagnostics_opts(selection.value.severity))
end)
return true
end,
})
:find()
end
---Customize nvim's diagnostics display.
M.setup = function() vim.diagnostic.config(diagnostics_opts()) end
return M