nvim: refactor creation of custom indicators for lualine

This commit is contained in:
Fernando Schauenburg 2025-03-25 21:45:24 +01:00
parent f55e1b6951
commit a8c1fa25b7
6 changed files with 87 additions and 53 deletions

View file

@ -4,7 +4,9 @@ return {
dependencies = "nvim-tree/nvim-web-devicons", dependencies = "nvim-tree/nvim-web-devicons",
opts = function() opts = function()
local icons = require("fschauen.util.icons")
local dynamic_color = require("fschauen.util.lualine").dynamic_color local dynamic_color = require("fschauen.util.lualine").dynamic_color
local indicator = require("fschauen.util.lualine").indicator
local window = require("fschauen.util.window") local window = require("fschauen.util.window")
local orange = "#d65d0e" local orange = "#d65d0e"
@ -12,24 +14,59 @@ return {
return vim.diagnostic.is_enabled { bufnr = bufnr or 0 } return vim.diagnostic.is_enabled { bufnr = bufnr or 0 }
end end
local autoformat = require("fschauen.util.autoformat").lualine() --
-- Components
--
local autoformat = indicator {
icon = icons.ui.Format,
cond = require("fschauen.util.autoformat").is_enabled,
}
local branch = { local branch = {
"branch", "branch",
icon = require("fschauen.util.icons").git.Branch, icon = icons.git.Branch,
cond = window.is_medium,
}
local diagnostics = {
dynamic_color("diagnostics"),
cond = is_diagnostics_enabled,
}
local diag_status = indicator {
icon = icons.ui.Diagnostic,
cond = is_diagnostics_enabled,
}
local fileformat = {
"fileformat",
cond = window.is_medium, cond = window.is_medium,
} }
local diagnostics = { dynamic_color("diagnostics"), cond = is_diagnostics_enabled }
local diag_status = { function() return "" end, cond = is_diagnostics_enabled }
local fileformat = { "fileformat", cond = window.is_medium }
local filename = "fschauen.filename" local filename = "fschauen.filename"
local filetype = { dynamic_color("filetype"), cond = window.is_medium } local filetype = {
dynamic_color("filetype"),
cond = window.is_medium,
}
local mode = "fschauen.mode" local mode = "fschauen.mode"
local searchcount = "fschauen.searchcount" local searchcount = "fschauen.searchcount"
local spell = "fschauen.spell" local spell = indicator {
local status = icon = icons.ui.SpellCheck,
{ dynamic_color("fschauen.status"), color = { fg = orange }, padding = 0 } cond = function() return vim.o.spell end,
local whitespace = { dynamic_color("fschauen.whitespace"), cond = window.is_wide } }
local wrap = "fschauen.wrap" local status = {
dynamic_color("fschauen.status"),
color = { fg = orange },
padding = 0,
}
local whitespace = {
dynamic_color("fschauen.whitespace"),
cond = window.is_wide,
}
local wrap = indicator {
icon = icons.ui.TextWrap,
cond = function() return vim.o.wrap end,
}
--
-- Sections
--
local sections = { local sections = {
lualine_a = { mode }, lualine_a = { mode },

View file

@ -4,18 +4,18 @@ M._augroup = nil
---Whether autoformatting is enabled. ---Whether autoformatting is enabled.
---@return boolean ---@return boolean
local is_enabled = function() return M._augroup ~= nil end M.is_enabled = function() return M._augroup ~= nil end
---Disable autoformatting. ---Disable autoformatting.
M.disable = function() M.disable = function()
if not is_enabled() then return end if not M.is_enabled() then return end
vim.api.nvim_del_augroup_by_id(M._augroup) vim.api.nvim_del_augroup_by_id(M._augroup)
M._augroup = nil M._augroup = nil
end end
---Enable autoformatting. ---Enable autoformatting.
M.enable = function() M.enable = function()
if is_enabled() then return end if M.is_enabled() then return end
local ok, formatter = pcall(require, "formatter.format") local ok, formatter = pcall(require, "formatter.format")
if not ok then if not ok then
@ -34,21 +34,11 @@ end
---Toggle autoformatting. ---Toggle autoformatting.
M.toggle = function() M.toggle = function()
if is_enabled() then if M.is_enabled() then
M.disable() M.disable()
else else
M.enable() M.enable()
end end
end end
---Create a lualine component that shows an icon when autoformatting is enabled.
---@return table component
M.lualine = function()
local icon = require("fschauen.util.icons").ui.Format
return {
function() return icon end,
cond = is_enabled,
}
end
return M return M

View file

@ -119,9 +119,11 @@ M.ui = {
ReadOnly = "", -- "RO", ReadOnly = "", -- "RO",
Search = "", --  Search = "", -- 
Sleep = "󰒲", Sleep = "󰒲",
SpellCheck = "󰓆",
Telescope = "", Telescope = "",
TestTube = "󰙨", -- 󰤑 TestTube = "󰙨", -- 󰤑
Text = "󰬴", Text = "󰬴",
TextWrap = "󰖶",
Toggle = "󰨚", Toggle = "󰨚",
TrafficLight = "󱠪", TrafficLight = "󱠪",
Tree = "", Tree = "",

View file

@ -38,4 +38,37 @@ M.dynamic_color = function(base)
return component return component
end end
---@class LualineIndicatorSpec
---@field icon string The icon to show when the indicator is active.
---@field cond function A function that returns true when the indicator should
--- be visible, false otherwise.
---Make a lualine indicator that shows an icon when a condition is true.
---@param spec LualineIndicatorSpec
---@return table component
M.indicator = function(spec)
vim.validate {
spec = { spec, "table" },
icon = { spec.icon, "string" },
cond = { spec.cond, "function" },
}
local component = require("lualine.component"):extend()
function component:init(options)
component.super.init(
self,
vim.tbl_deep_extend(
"keep",
options or {},
{ cond = spec.cond or function() return false end }
)
)
end
function component:update_status(--[[is_focused]]_) return spec.icon or "?" end
return component
end
return M return M

View file

@ -1,14 +0,0 @@
local M = require("lualine.component"):extend()
function M:init(options)
M.super.init(
self,
vim.tbl_deep_extend("keep", options or {}, {
cond = function() return vim.o.spell end,
})
)
end
function M:update_status(--[[is_focused]]_) return "󰓆" end
return M

View file

@ -1,14 +0,0 @@
local M = require("lualine.component"):extend()
function M:init(options)
M.super.init(
self,
vim.tbl_deep_extend("keep", options or {}, {
cond = function() return vim.o.wrap end,
})
)
end
function M:update_status(--[[is_focused]]_) return "󰖶" end
return M