feat(diagnostics): add padding when using different background colors (#594)

* feat(diagnostics): add padding when using different background colors

When each "sub-section" of the diagnostics components have a different background the rendering is off when
multiple more than one of them is shown.

* chore: fix typo and spelling
This commit is contained in:
Camille Dejoye 2022-03-06 03:10:34 +01:00 committed by GitHub
parent a1304ea8b6
commit 91142983d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 109 additions and 6 deletions

View File

@ -104,13 +104,17 @@ function M:update_status()
-- format the counts with symbols and highlights -- format the counts with symbols and highlights
if self.options.colored then if self.options.colored then
local colors = {} local colors, bgs = {}, {}
for name, hl in pairs(self.highlight_groups) do for name, hl in pairs(self.highlight_groups) do
colors[name] = modules.highlight.component_format_highlight(hl) colors[name] = modules.highlight.component_format_highlight(hl)
bgs[name] = modules.utils.extract_highlight_colors(colors[name]:match('%%#(.-)#'), 'bg')
end end
local previous_section, padding
for _, section in ipairs(self.options.sections) do for _, section in ipairs(self.options.sections) do
if diagnostics_count[section] ~= nil and (always_visible or diagnostics_count[section] > 0) then if diagnostics_count[section] ~= nil and (always_visible or diagnostics_count[section] > 0) then
table.insert(result, colors[section] .. self.symbols[section] .. diagnostics_count[section]) 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])
end end
end end
else else

View File

@ -752,4 +752,103 @@ describe('Lualine', function()
end) end)
end) end)
end) end)
describe('diagnostics', function()
local diagnostics_conf = vim.deepcopy(config)
diagnostics_conf.sections = {
lualine_a = { {
'diagnostics',
symbols = { error = 'E:', warn = 'W:', info = 'I:', hint = 'H:' },
diagnostics_color = {
error = { bg = "#a89984", fg = "#ff0000" },
warn = { bg = "#a89984", fg = "#ffa500" },
info = { bg = "#a89984", fg = "#add8e6" },
hint = { bg = "#a89984", fg = "#d3d3d3" },
},
sources = { function() return {} end },
} },
lualine_b = {},
lualine_c = {},
lualine_x = {},
lualine_y = {},
lualine_z = {},
}
it('does not show without diagnostics', function()
local conf = vim.deepcopy(diagnostics_conf)
require('lualine').setup(conf)
statusline:expect([===[
highlights = {
1: lualine_c_normal = { bg = "#3c3836", fg = "#a89984" }
}
|{1: }|
]===])
end)
it('shows only positive diagnostics', function()
local conf = vim.deepcopy(diagnostics_conf)
conf.sections.lualine_a[1].sources[1] = function() return { error = 0, warn = 0, info = 1, hint = 0 } end
require('lualine').setup(conf)
statusline:expect([===[
highlights = {
1: lualine_a_diagnostics_info = { bg = "#a89984", fg = "#add8e6" }
2: lualine_transitional_lualine_a_diagnostics_info_to_lualine_c_normal = { bg = "#3c3836", fg = "#a89984" }
3: lualine_c_normal = { bg = "#3c3836", fg = "#a89984" }
}
|{1: I:1 }
{2:}
{3: }|
]===])
end)
it('shows all diagnostics with same background', function()
local conf = vim.deepcopy(diagnostics_conf)
conf.sections.lualine_a[1].sources[1] = function() return { error = 1, warn = 2, info = 3, hint = 4 } end
require('lualine').setup(conf)
statusline:expect([===[
highlights = {
1: lualine_a_diagnostics_error = { bg = "#a89984", fg = "#ff0000" }
2: lualine_a_diagnostics_warn = { bg = "#a89984", fg = "#ffa500" }
3: lualine_a_diagnostics_info = { bg = "#a89984", fg = "#add8e6" }
4: lualine_a_diagnostics_hint = { bg = "#a89984", fg = "#d3d3d3" }
5: lualine_transitional_lualine_a_diagnostics_hint_to_lualine_c_normal = { bg = "#3c3836", fg = "#a89984" }
6: lualine_c_normal = { bg = "#3c3836", fg = "#a89984" }
}
|{1: E:1 }
{2:W:2 }
{3:I:3 }
{4:H:4 }
{5:}
{6: }|
]===])
end)
it('shows all diagnostics with padding when background changes', function()
local conf = vim.deepcopy(diagnostics_conf)
conf.sections.lualine_a[1].sources[1] = function() return { error = 1, warn = 2, info = 3, hint = 4 } end
conf.sections.lualine_a[1].diagnostics_color = {
error = { bg = "#ff0000", fg = "#a89984" },
warn = { bg = "#ffa500", fg = "#a89984" },
info = { bg = "#add8e6", fg = "#a89984" },
hint = { bg = "#add8e6", fg = "#a89984" },
}
require('lualine').setup(conf)
statusline:expect([===[
highlights = {
1: lualine_a_diagnostics_error = { bg = "#ff0000", fg = "#a89984" }
2: lualine_a_diagnostics_warn = { bg = "#ffa500", fg = "#a89984" }
3: lualine_a_diagnostics_info = { bg = "#add8e6", fg = "#a89984" }
4: lualine_a_diagnostics_hint = { bg = "#add8e6", fg = "#a89984" }
5: lualine_transitional_lualine_a_diagnostics_hint_to_lualine_c_normal = { bg = "#3c3836", fg = "#add8e6" }
6: lualine_c_normal = { bg = "#3c3836", fg = "#a89984" }
}
|{1: E:1 }
{2: W:2 }
{3: I:3 }
{4:H:4 }
{5:}
{6: }|
]===])
end)
end)
end) end)

View File

@ -5,23 +5,23 @@
--- ---
--- ###Uses: --- ###Uses:
--- ---
--- Create a new instence with status width 120 & for active statusline --- Create a new instance with status width 120 & for active statusline
--- like following. --- like following.
--- ---
--- ``lua --- ``lua
--- local statusline = require('tests.statusline').new(120, 'active') --- local statusline = require('tests.statusline').new(120, 'active')
--- ``` --- ```
--- ---
--- To create a new instence with status width 80 & for inactive statusline use following. --- To create a new instance with status width 80 & for inactive statusline use following.
--- ---
--- ``lua --- ``lua
--- local statusline = require('tests.statusline').new(120, 'inactive') --- local statusline = require('tests.statusline').new(120, 'inactive')
--- ``` --- ```
--- ---
--- Now setup the state you want to test. --- Now setup the state you want to test.
--- To test you'll call `expect` pmethod on statusline for example. --- To test you'll call `expect` method on statusline for example.
--- ---
--- To create a new instence with status width 80 & tabline --- To create a new instance with status width 80 & tabline
--- ---
--- ``lua --- ``lua
--- local statusline = require('tests.statusline').new(120, 'tabline') --- local statusline = require('tests.statusline').new(120, 'tabline')