222 lines
7.2 KiB
Lua
222 lines
7.2 KiB
Lua
-- Copyright (c) 2020-2021 hoob3rt
|
|
-- MIT license, see LICENSE for more details.
|
|
local lualine_require = require 'lualine_require'
|
|
local modules = lualine_require.lazy_require {
|
|
highlight = 'lualine.highlight',
|
|
utils = 'lualine.utils.utils',
|
|
utils_notices = 'lualine.utils.notices',
|
|
}
|
|
|
|
local Diagnostics = lualine_require.require('lualine.component'):new()
|
|
|
|
local function check_deprecated_options(options)
|
|
if options.color_error or options.color_warn or options.color_info or options.color_hint then
|
|
options.diagnostics_color = options.diagnostics_color or {}
|
|
require('lualine.utils.notices').add_notice(string.format [[
|
|
### diagnostics.options.colors
|
|
Previously colors in diagnostics section was set with color_error, color_warning..
|
|
separate options . They've been unified under diagnostics_color options.
|
|
Now it should be something like:
|
|
```lua
|
|
{ 'diagnostics',
|
|
sources = {'nvim_lsp'},
|
|
diagnostics_color = {
|
|
error = color_error,
|
|
warning = color_warning,
|
|
info = color_info,
|
|
hint = color_hint,
|
|
}
|
|
}
|
|
```
|
|
]])
|
|
options.diagnostics_color.error = options.color_error
|
|
options.diagnostics_color.warning = options.color_warning
|
|
options.diagnostics_color.info = options.color_info
|
|
options.diagnostics_color.hint = options.color_hint
|
|
end
|
|
end
|
|
|
|
local default_symbols = {
|
|
icons = {
|
|
error = ' ', -- xf659
|
|
warn = ' ', -- xf529
|
|
info = ' ', -- xf7fc
|
|
hint = ' ', -- xf838
|
|
},
|
|
no_icons = { error = 'E:', warn = 'W:', info = 'I:', hint = 'H:' },
|
|
}
|
|
|
|
local default_options = {
|
|
colored = true,
|
|
update_in_insert = false,
|
|
sources = nil,
|
|
sections = { 'error', 'warn', 'info', 'hint' },
|
|
diagnostics_color = {
|
|
error = {
|
|
fg = modules.utils.extract_highlight_colors('LspDiagnosticsDefaultError', 'fg')
|
|
or modules.utils.extract_highlight_colors('DiffDelete', 'fg')
|
|
or '#e32636',
|
|
},
|
|
warn = {
|
|
fg = modules.utils.extract_highlight_colors('LspDiagnosticsDefaultWarning', 'fg')
|
|
or modules.utils.extract_highlight_colors('DiffText', 'fg')
|
|
or '#ffa500',
|
|
},
|
|
info = {
|
|
fg = modules.utils.extract_highlight_colors('LspDiagnosticsDefaultInformation', 'fg')
|
|
or modules.utils.extract_highlight_colors('Normal', 'fg')
|
|
or '#ffffff',
|
|
},
|
|
hint = {
|
|
fg = modules.utils.extract_highlight_colors('LspDiagnosticsDefaultHint', 'fg')
|
|
or modules.utils.extract_highlight_colors('DiffChange', 'fg')
|
|
or '#273faf',
|
|
},
|
|
},
|
|
}
|
|
-- Initializer
|
|
Diagnostics.new = function(self, options, child)
|
|
-- Run super()
|
|
local new_diagnostics = self._parent:new(options, child or Diagnostics)
|
|
-- Apply default options
|
|
new_diagnostics.options = vim.tbl_deep_extend('keep', new_diagnostics.options or {}, default_options)
|
|
check_deprecated_options(new_diagnostics.options)
|
|
-- Apply default symbols
|
|
new_diagnostics.symbols = vim.tbl_extend(
|
|
'keep',
|
|
new_diagnostics.options.symbols or {},
|
|
new_diagnostics.options.icons_enabled ~= false and default_symbols.icons or default_symbols.no_icons
|
|
)
|
|
-- Initialize highlight groups
|
|
if new_diagnostics.options.colored then
|
|
new_diagnostics.highlight_groups = {
|
|
error = modules.highlight.create_component_highlight_group(
|
|
new_diagnostics.options.diagnostics_color.error,
|
|
'diagnostics_error',
|
|
new_diagnostics.options
|
|
),
|
|
warn = modules.highlight.create_component_highlight_group(
|
|
new_diagnostics.options.diagnostics_color.warn,
|
|
'diagnostics_warn',
|
|
new_diagnostics.options
|
|
),
|
|
info = modules.highlight.create_component_highlight_group(
|
|
new_diagnostics.options.diagnostics_color.info,
|
|
'diagnostics_info',
|
|
new_diagnostics.options
|
|
),
|
|
hint = modules.highlight.create_component_highlight_group(
|
|
new_diagnostics.options.diagnostics_color.hint,
|
|
'diagnostics_hint',
|
|
new_diagnostics.options
|
|
),
|
|
}
|
|
end
|
|
|
|
-- Error out no source
|
|
if new_diagnostics.options.sources == nil then
|
|
print 'no sources for diagnostics configured'
|
|
return ''
|
|
end
|
|
-- Initialize variable to store last update so we can use it in insert
|
|
-- mode for no update_in_insert
|
|
new_diagnostics.last_update = ''
|
|
return new_diagnostics
|
|
end
|
|
|
|
Diagnostics.update_status = function(self)
|
|
if not self.options.update_in_insert and vim.api.nvim_get_mode().mode:sub(1, 1) == 'i' then
|
|
return self.last_update
|
|
end
|
|
local error_count, warning_count, info_count, hint_count = 0, 0, 0, 0
|
|
local diagnostic_data = self.get_diagnostics(self.options.sources)
|
|
for _, data in pairs(diagnostic_data) do
|
|
error_count = error_count + data.error
|
|
warning_count = warning_count + data.warn
|
|
info_count = info_count + data.info
|
|
hint_count = hint_count + data.hint
|
|
end
|
|
local result = {}
|
|
local data = {
|
|
error = error_count,
|
|
warn = warning_count,
|
|
info = info_count,
|
|
hint = hint_count,
|
|
}
|
|
if self.options.colored then
|
|
local colors = {}
|
|
for name, hl in pairs(self.highlight_groups) do
|
|
colors[name] = modules.highlight.component_format_highlight(hl)
|
|
end
|
|
for _, section in ipairs(self.options.sections) do
|
|
if data[section] ~= nil and data[section] > 0 then
|
|
table.insert(result, colors[section] .. self.symbols[section] .. data[section])
|
|
end
|
|
end
|
|
else
|
|
for _, section in ipairs(self.options.sections) do
|
|
if data[section] ~= nil and data[section] > 0 then
|
|
table.insert(result, self.symbols[section] .. data[section])
|
|
end
|
|
end
|
|
end
|
|
self.last_update = ''
|
|
if result[1] ~= nil then
|
|
self.last_update = table.concat(result, ' ')
|
|
end
|
|
return self.last_update
|
|
end
|
|
|
|
Diagnostics.diagnostic_sources = {
|
|
nvim_lsp = function()
|
|
local error_count = vim.lsp.diagnostic.get_count(0, 'Error')
|
|
local warning_count = vim.lsp.diagnostic.get_count(0, 'Warning')
|
|
local info_count = vim.lsp.diagnostic.get_count(0, 'Information')
|
|
local hint_count = vim.lsp.diagnostic.get_count(0, 'Hint')
|
|
return error_count, warning_count, info_count, hint_count
|
|
end,
|
|
coc = function()
|
|
local data = vim.b.coc_diagnostic_info
|
|
if data then
|
|
return data.error, data.warning, data.information, data.hint
|
|
else
|
|
return 0, 0, 0, 0
|
|
end
|
|
end,
|
|
ale = function()
|
|
local ok, data = pcall(vim.fn['ale#statusline#Count'], vim.fn.bufnr())
|
|
if ok then
|
|
return data.error + data.style_error, data.warning + data.style_warning, data.info, 0
|
|
else
|
|
return 0, 0, 0, 0
|
|
end
|
|
end,
|
|
}
|
|
|
|
Diagnostics.get_diagnostics = function(sources)
|
|
local result = {}
|
|
for index, source in ipairs(sources) do
|
|
if type(source) == 'string' then
|
|
local error_count, warning_count, info_count, hint_count = Diagnostics.diagnostic_sources[source]()
|
|
result[index] = {
|
|
error = error_count,
|
|
warn = warning_count,
|
|
info = info_count,
|
|
hint = hint_count,
|
|
}
|
|
elseif type(source) == 'function' then
|
|
local source_result = source()
|
|
source_result = type(source_result) == 'table' and source_result or {}
|
|
result[index] = {
|
|
error = source_result.error or 0,
|
|
warn = source_result.warn or 0,
|
|
info = source_result.info or 0,
|
|
hint = source_result.hint or 0,
|
|
}
|
|
end
|
|
end
|
|
return result
|
|
end
|
|
|
|
return Diagnostics
|