feat: change active color of `buffers`, `tabs` & `windows` component according to mode (#971)
- Added `M.get_mode_suffix()` in `highlight.lua` to simplify retrieving the mode suffix. - Fixed graphical bug occurring when `buffers` component color was changed. - Separators would not change to new color. - Fixed by adding the mode suffix to the highlight name in `M.component_format_highlight` if the output of `highlight.fn()` is a string. - Added `use_mode_colors` option to `buffers`, `tabs`, and `windows` components. - If it's set to true, the component's colors will change with the mode, as most other components do. - Updated readme.
This commit is contained in:
parent
dd823a69ca
commit
7f5f2d811d
|
@ -504,6 +504,9 @@ sections = {
|
||||||
alpha = 'Alpha'
|
alpha = 'Alpha'
|
||||||
}, -- Shows specific buffer name for that filetype ( { `filetype` = `buffer_name`, ... } )
|
}, -- Shows specific buffer name for that filetype ( { `filetype` = `buffer_name`, ... } )
|
||||||
|
|
||||||
|
-- Automatically updates active buffer color to match color of other components (will be overidden if buffers_color is set)
|
||||||
|
use_mode_colors = false,
|
||||||
|
|
||||||
buffers_color = {
|
buffers_color = {
|
||||||
-- Same values as the general color option can be used here.
|
-- Same values as the general color option can be used here.
|
||||||
active = 'lualine_{section}_normal', -- Color for active buffer.
|
active = 'lualine_{section}_normal', -- Color for active buffer.
|
||||||
|
@ -667,6 +670,9 @@ sections = {
|
||||||
-- 1: Shows tab_name
|
-- 1: Shows tab_name
|
||||||
-- 2: Shows tab_nr + tab_name
|
-- 2: Shows tab_nr + tab_name
|
||||||
|
|
||||||
|
-- Automatically updates active tab color to match color of other components (will be overidden if buffers_color is set)
|
||||||
|
use_mode_colors = false,
|
||||||
|
|
||||||
tabs_color = {
|
tabs_color = {
|
||||||
-- Same values as the general color option can be used here.
|
-- Same values as the general color option can be used here.
|
||||||
active = 'lualine_{section}_normal', -- Color for active tab.
|
active = 'lualine_{section}_normal', -- Color for active tab.
|
||||||
|
@ -714,6 +720,9 @@ sections = {
|
||||||
|
|
||||||
disabled_buftypes = { 'quickfix', 'prompt' }, -- Hide a window if its buffer's type is disabled
|
disabled_buftypes = { 'quickfix', 'prompt' }, -- Hide a window if its buffer's type is disabled
|
||||||
|
|
||||||
|
-- Automatically updates active window color to match color of other components (will be overidden if buffers_color is set)
|
||||||
|
use_mode_colors = false,
|
||||||
|
|
||||||
windows_color = {
|
windows_color = {
|
||||||
-- Same values as the general color option can be used here.
|
-- Same values as the general color option can be used here.
|
||||||
active = 'lualine_{section}_normal', -- Color for active window.
|
active = 'lualine_{section}_normal', -- Color for active window.
|
||||||
|
|
|
@ -18,6 +18,7 @@ local default_options = {
|
||||||
fzf = 'FZF',
|
fzf = 'FZF',
|
||||||
alpha = 'Alpha',
|
alpha = 'Alpha',
|
||||||
},
|
},
|
||||||
|
use_mode_colors = false,
|
||||||
buffers_color = {
|
buffers_color = {
|
||||||
active = nil,
|
active = nil,
|
||||||
inactive = nil,
|
inactive = nil,
|
||||||
|
@ -35,7 +36,7 @@ local default_options = {
|
||||||
---@param is_active boolean
|
---@param is_active boolean
|
||||||
---@return string hl name
|
---@return string hl name
|
||||||
local function get_hl(section, is_active)
|
local function get_hl(section, is_active)
|
||||||
local suffix = is_active and '_normal' or '_inactive'
|
local suffix = is_active and highlight.get_mode_suffix() or '_inactive'
|
||||||
local section_redirects = {
|
local section_redirects = {
|
||||||
lualine_x = 'lualine_c',
|
lualine_x = 'lualine_c',
|
||||||
lualine_y = 'lualine_b',
|
lualine_y = 'lualine_b',
|
||||||
|
@ -49,8 +50,12 @@ end
|
||||||
|
|
||||||
function M:init(options)
|
function M:init(options)
|
||||||
M.super.init(self, options)
|
M.super.init(self, options)
|
||||||
|
-- if use_mode_colors is set, use a function so that the colors update
|
||||||
|
local default_active = options.use_mode_colors and
|
||||||
|
function() return get_hl('lualine_' .. options.self.section, true) end
|
||||||
|
or get_hl('lualine_' .. options.self.section, true)
|
||||||
default_options.buffers_color = {
|
default_options.buffers_color = {
|
||||||
active = get_hl('lualine_' .. options.self.section, true),
|
active = default_active,
|
||||||
inactive = get_hl('lualine_' .. options.self.section, false),
|
inactive = get_hl('lualine_' .. options.self.section, false),
|
||||||
}
|
}
|
||||||
self.options = vim.tbl_deep_extend('keep', self.options or {}, default_options)
|
self.options = vim.tbl_deep_extend('keep', self.options or {}, default_options)
|
||||||
|
|
|
@ -8,6 +8,7 @@ local highlight = require('lualine.highlight')
|
||||||
local default_options = {
|
local default_options = {
|
||||||
max_length = 0,
|
max_length = 0,
|
||||||
mode = 0,
|
mode = 0,
|
||||||
|
use_mode_colors = false,
|
||||||
tabs_color = {
|
tabs_color = {
|
||||||
active = nil,
|
active = nil,
|
||||||
inactive = nil,
|
inactive = nil,
|
||||||
|
@ -20,7 +21,7 @@ local default_options = {
|
||||||
---@param is_active boolean
|
---@param is_active boolean
|
||||||
---@return string hl name
|
---@return string hl name
|
||||||
local function get_hl(section, is_active)
|
local function get_hl(section, is_active)
|
||||||
local suffix = is_active and '_normal' or '_inactive'
|
local suffix = is_active and highlight.get_mode_suffix() or '_inactive'
|
||||||
local section_redirects = {
|
local section_redirects = {
|
||||||
lualine_x = 'lualine_c',
|
lualine_x = 'lualine_c',
|
||||||
lualine_y = 'lualine_b',
|
lualine_y = 'lualine_b',
|
||||||
|
@ -34,8 +35,12 @@ end
|
||||||
|
|
||||||
function M:init(options)
|
function M:init(options)
|
||||||
M.super.init(self, options)
|
M.super.init(self, options)
|
||||||
|
-- if use_mode_colors is set, use a function so that the colors update
|
||||||
|
local default_active = options.use_mode_colors and
|
||||||
|
function() return get_hl('lualine_' .. options.self.section, true) end
|
||||||
|
or get_hl('lualine_' .. options.self.section, true)
|
||||||
default_options.tabs_color = {
|
default_options.tabs_color = {
|
||||||
active = get_hl('lualine_' .. options.self.section, true),
|
active = default_active,
|
||||||
inactive = get_hl('lualine_' .. options.self.section, false),
|
inactive = get_hl('lualine_' .. options.self.section, false),
|
||||||
}
|
}
|
||||||
self.options = vim.tbl_deep_extend('keep', self.options or {}, default_options)
|
self.options = vim.tbl_deep_extend('keep', self.options or {}, default_options)
|
||||||
|
|
|
@ -34,6 +34,13 @@ local mode_to_highlight = {
|
||||||
['TERMINAL'] = '_terminal',
|
['TERMINAL'] = '_terminal',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
--- Get highlight suffix for current mode, or inactive if not focused
|
||||||
|
---@return string mode_suffix
|
||||||
|
function M.get_mode_suffix()
|
||||||
|
local mode = require('lualine.utils.mode').get_mode()
|
||||||
|
return mode_to_highlight[mode] or '_normal'
|
||||||
|
end
|
||||||
|
|
||||||
--- determine if an highlight exist and isn't cleared
|
--- determine if an highlight exist and isn't cleared
|
||||||
---@param highlight_name string
|
---@param highlight_name string
|
||||||
---@return boolean whether hl_group was defined with highlight_name
|
---@return boolean whether hl_group was defined with highlight_name
|
||||||
|
@ -222,8 +229,7 @@ local function append_mode(highlight_group, is_focused)
|
||||||
if is_focused == false then
|
if is_focused == false then
|
||||||
return highlight_group .. '_inactive'
|
return highlight_group .. '_inactive'
|
||||||
end
|
end
|
||||||
local mode = require('lualine.utils.mode').get_mode()
|
return highlight_group .. M.get_mode_suffix()
|
||||||
return highlight_group .. (mode_to_highlight[mode] or '_normal')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Helper function for create component highlight
|
-- Helper function for create component highlight
|
||||||
|
@ -392,13 +398,13 @@ function M.component_format_highlight(highlight, is_focused)
|
||||||
local color = highlight.fn { section = highlight.section } or {}
|
local color = highlight.fn { section = highlight.section } or {}
|
||||||
local hl_name = highlight.name
|
local hl_name = highlight.name
|
||||||
if type(color) == 'string' then
|
if type(color) == 'string' then
|
||||||
M.highlight(hl_name, nil, nil, nil, color)
|
M.highlight(hl_name .. M.get_mode_suffix(), nil, nil, nil, color)
|
||||||
return '%#' .. hl_name .. '#'
|
return '%#' .. hl_name .. M.get_mode_suffix() .. '#'
|
||||||
elseif type(color) == 'table' then
|
elseif type(color) == 'table' then
|
||||||
if not highlight.no_default and not (color.fg and color.bg) then
|
if not highlight.no_default and not (color.fg and color.bg) then
|
||||||
hl_name = append_mode(highlight.name, is_focused)
|
hl_name = append_mode(highlight.name, is_focused)
|
||||||
color =
|
color =
|
||||||
get_default_component_color(hl_name, append_mode(''):sub(2), highlight.section, color, highlight.options)
|
get_default_component_color(hl_name, M.get_mode_suffix():sub(2), highlight.section, color, highlight.options)
|
||||||
end
|
end
|
||||||
M.highlight(hl_name, color.fg, color.bg, color.gui, color.link)
|
M.highlight(hl_name, color.fg, color.bg, color.gui, color.link)
|
||||||
return '%#' .. hl_name .. '#', color
|
return '%#' .. hl_name .. '#', color
|
||||||
|
|
Loading…
Reference in New Issue