nvim: refactor creation of custom indicators for lualine
This commit is contained in:
parent
f55e1b6951
commit
a8c1fa25b7
6 changed files with 87 additions and 53 deletions
|
@ -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 },
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 = "",
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
|
@ -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
|
|
Loading…
Add table
Reference in a new issue