2021-10-11 09:21:38 +00:00
-- Copyright (c) 2020-2021 hoob3rt
-- MIT license, see LICENSE for more details.
2022-01-02 11:38:39 +00:00
local lualine_require = require ( ' lualine_require ' )
2022-02-01 08:04:03 +00:00
local modules = lualine_require.lazy_require {
2021-10-11 09:21:38 +00:00
default_config = ' lualine.components.diagnostics.config ' ,
sources = ' lualine.components.diagnostics.sources ' ,
highlight = ' lualine.highlight ' ,
utils = ' lualine.utils.utils ' ,
utils_notices = ' lualine.utils.notices ' ,
2022-02-01 08:04:03 +00:00
}
2021-10-11 09:21:38 +00:00
local M = lualine_require.require ( ' lualine.component ' ) : extend ( )
M.diagnostics_sources = modules.sources . sources
M.get_diagnostics = modules.sources . get_diagnostics
-- Initializer
function M : init ( options )
-- Run super()
M.super . init ( self , options )
-- Apply default options
self.options = vim.tbl_deep_extend ( ' keep ' , self.options or { } , modules.default_config . options )
-- Apply default symbols
self.symbols = vim.tbl_extend (
' keep ' ,
self.options . symbols or { } ,
self.options . icons_enabled ~= false and modules.default_config . symbols.icons
or modules.default_config . symbols.no_icons
)
-- Initialize highlight groups
if self.options . colored then
self.highlight_groups = {
error = modules.highlight . create_component_highlight_group (
self.options . diagnostics_color.error ,
' diagnostics_error ' ,
2022-03-02 13:37:08 +00:00
self.options ,
false
2021-10-11 09:21:38 +00:00
) ,
warn = modules.highlight . create_component_highlight_group (
self.options . diagnostics_color.warn ,
' diagnostics_warn ' ,
2022-03-02 13:37:08 +00:00
self.options ,
false
2021-10-11 09:21:38 +00:00
) ,
info = modules.highlight . create_component_highlight_group (
self.options . diagnostics_color.info ,
' diagnostics_info ' ,
2022-03-02 13:37:08 +00:00
self.options ,
false
2021-10-11 09:21:38 +00:00
) ,
hint = modules.highlight . create_component_highlight_group (
self.options . diagnostics_color.hint ,
' diagnostics_hint ' ,
2022-03-02 13:37:08 +00:00
self.options ,
false
2021-10-11 09:21:38 +00:00
) ,
}
end
-- Initialize variable to store last update so we can use it in insert
-- mode for no update_in_insert
2021-10-26 08:34:41 +00:00
self.last_diagnostics_count = { }
2022-01-12 16:13:02 +00:00
-- Error out no source
if # self.options . sources < 1 then
modules.utils_notices . add_notice (
' ### diagnostics.sources \n \n no sources for diagnostics configured. \n Please specify which diagnostics source you want lualine to use with `sources` option. \n '
)
end
2021-10-11 09:21:38 +00:00
end
function M : update_status ( )
2022-01-04 13:17:16 +00:00
local bufnr = vim.api . nvim_get_current_buf ( )
2021-10-26 08:34:41 +00:00
local diagnostics_count
2021-10-11 09:21:38 +00:00
local result = { }
2021-10-26 08:34:41 +00:00
if self.options . update_in_insert or vim.api . nvim_get_mode ( ) . mode : sub ( 1 , 1 ) ~= ' i ' then
local error_count , warning_count , info_count , hint_count = 0 , 0 , 0 , 0
local diagnostic_data = modules.sources . get_diagnostics ( self.options . sources )
-- sum all the counts
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
diagnostics_count = {
error = error_count ,
warn = warning_count ,
info = info_count ,
hint = hint_count ,
}
-- Save count for insert mode
self.last_diagnostics_count [ bufnr ] = diagnostics_count
else -- Use cached count in insert mode with update_in_insert disabled
diagnostics_count = self.last_diagnostics_count [ bufnr ] or { error = 0 , warn = 0 , info = 0 , hint = 0 }
end
2021-10-21 11:55:35 +00:00
local always_visible = false
if type ( self.options . always_visible ) == ' boolean ' then
always_visible = self.options . always_visible
elseif type ( self.options . always_visible ) == ' function ' then
always_visible = self.options . always_visible ( )
end
2021-10-12 14:04:47 +00:00
-- format the counts with symbols and highlights
2021-10-11 09:21:38 +00:00
if self.options . colored then
2022-03-06 02:10:34 +00:00
local colors , bgs = { } , { }
2021-10-11 09:21:38 +00:00
for name , hl in pairs ( self.highlight_groups ) do
colors [ name ] = modules.highlight . component_format_highlight ( hl )
2022-03-06 02:10:34 +00:00
bgs [ name ] = modules.utils . extract_highlight_colors ( colors [ name ] : match ( ' %%#(.-)# ' ) , ' bg ' )
2021-10-11 09:21:38 +00:00
end
2022-03-06 02:10:34 +00:00
local previous_section , padding
2021-10-11 09:21:38 +00:00
for _ , section in ipairs ( self.options . sections ) do
2021-10-26 08:34:41 +00:00
if diagnostics_count [ section ] ~= nil and ( always_visible or diagnostics_count [ section ] > 0 ) then
2022-03-06 02:10:34 +00:00
padding = previous_section and ( bgs [ previous_section ] ~= bgs [ section ] ) and ' ' or ' '
previous_section = section
table.insert ( result , colors [ section ] .. padding .. self.symbols [ section ] .. diagnostics_count [ section ] )
2021-10-11 09:21:38 +00:00
end
end
else
for _ , section in ipairs ( self.options . sections ) do
2021-10-26 08:34:41 +00:00
if diagnostics_count [ section ] ~= nil and ( always_visible or diagnostics_count [ section ] > 0 ) then
table.insert ( result , self.symbols [ section ] .. diagnostics_count [ section ] )
2021-10-11 09:21:38 +00:00
end
end
end
2021-10-26 08:34:41 +00:00
return table.concat ( result , ' ' )
2021-10-11 09:21:38 +00:00
end
return M