From 2161ad13a069ae01748af394684ec4b2e04d0da3 Mon Sep 17 00:00:00 2001 From: robin Date: Sat, 7 Feb 2026 15:38:42 +0100 Subject: [PATCH] feat: add tabline support --- lua/lylla/config.lua | 79 ++++++++++++++++++++++++++++--------------- lua/lylla/init.lua | 4 +++ lua/lylla/tabline.lua | 65 +++++++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 27 deletions(-) create mode 100644 lua/lylla/tabline.lua diff --git a/lua/lylla/config.lua b/lua/lylla/config.lua index b59b566..a36ac1c 100644 --- a/lua/lylla/config.lua +++ b/lua/lylla/config.lua @@ -11,8 +11,9 @@ ---@field hls table<'normal'|'visual'|'command'|'insert', vim.api.keyset.highlight> ---@field modules (lylla.item|lylla.item.tuple|string)[] ---@field winbar any[] +---@field tabline (fun(): (lylla.item|lylla.item.tuple|string)[])|vim.NIL -local M = {} +local M, H = {}, {} ---@type lylla.config ---@eval return MiniDoc.afterlines_to_code(MiniDoc.current.eval_section) @@ -75,23 +76,50 @@ M.default = { }, }, winbar = {}, + tabline = vim.NIL, } ---@type lylla.config ---@diagnostic disable-next-line: missing-fields M.config = {} +---@return lylla.config +function M.get() + return H.merge(M.default, M.config) +end + +---@param cfg lylla.config +---@return lylla.config +function M.override(cfg) + return H.merge(M.default, cfg) +end + +---@param cfg lylla.config +function M.set(cfg) + M.config = cfg +end + +-- helpers ==================================================================== + +---@param tdefault lylla.config +---@param toverride lylla.config +---@return lylla.config +function H.merge(tdefault, toverride) + return H.tmerge(tdefault, toverride) +end + ---@private ---@generic T: table|any[] ---@param tdefault T ---@param toverride T ---@return T -local function tmerge(tdefault, toverride) +H.tmerge = function(tdefault, toverride) if toverride == nil then return tdefault end - if vim.islist(tdefault) then + -- do not merge lists + if H.islist(tdefault) then return toverride end if vim.tbl_isempty(tdefault) then @@ -99,12 +127,16 @@ local function tmerge(tdefault, toverride) end return vim.iter(pairs(tdefault)):fold({}, function(tnew, k, v) - if toverride[k] == nil or type(v) ~= type(toverride[k]) then + if toverride[k] == nil then tnew[k] = v return tnew end + if type(v) ~= type(toverride[k]) then + tnew[k] = toverride[k] + return tnew + end if type(v) == "table" then - tnew[k] = tmerge(v, toverride[k]) + tnew[k] = H.tmerge(v, toverride[k]) return tnew end @@ -113,31 +145,24 @@ local function tmerge(tdefault, toverride) end) end ----@param tdefault lylla.config ----@param toverride lylla.config ----@return lylla.config -function M.merge(tdefault, toverride) - if vim.fn.has("nvim-0.11.0") == 1 then - toverride = - vim.tbl_deep_extend("keep", toverride, { editor = { float = { solid_border = vim.o.winborder == "solid" } } }) +---@param t table +---@return boolean +H.islist = function(t) + if type(t) ~= "table" then + return false end - return tmerge(tdefault, toverride) -end ----@return lylla.config -function M.get() - return M.merge(M.default, M.config) -end + for k, _ in ipairs(t) do + return type(k) == "number" + end ----@param cfg lylla.config ----@return lylla.config -function M.override(cfg) - return M.merge(M.default, cfg) -end + -- non-numeric keys + for _, _ in pairs(t) do + return false + end ----@param cfg lylla.config -function M.set(cfg) - M.config = cfg + -- empty table + return true end -return M +return M, H diff --git a/lua/lylla/init.lua b/lua/lylla/init.lua index 9601fca..ed910c0 100644 --- a/lua/lylla/init.lua +++ b/lua/lylla/init.lua @@ -80,6 +80,10 @@ function M.init() end, }) + if config.get().tabline ~= vim.NIL then + require("lylla.tabline").setup() + end + vim.api.nvim_create_autocmd("ColorSchemePre", { group = vim.api.nvim_create_augroup("lylla:resethl", { clear = true }), callback = function() diff --git a/lua/lylla/tabline.lua b/lua/lylla/tabline.lua new file mode 100644 index 0000000..9f28804 --- /dev/null +++ b/lua/lylla/tabline.lua @@ -0,0 +1,65 @@ +vim.g.tablinefn = function() + local tabfn = require("lylla.config").get().tabline + if tabfn == vim.NIL or type(tabfn) ~= "function" then + return + end + + local utils = require("lylla.utils") + + return utils.fold(tabfn()) +end + +local M, H = {}, {} + +M.setup = function() + vim.o.tabline = "%!v:lua.vim.g.tablinefn()" +end + +-- helpers ==================================================================== + +function H.fortabwins(tabn, f) + local buflist = vim.fn.tabpagebuflist(tabn) + + return vim + .iter(setmetatable({ + idx = 0, + }, { + __call = function(t) + local i = t.idx + 1 + if i > vim.fn.tabpagewinnr(tabn, "$") then + return + end + t.idx = i + return t.idx + end, + })) + :fold({}, function(t, i) + local buf = buflist[i] + table.insert(t, { f(i, i == vim.fn.tabpagewinnr(tabn), buf) }) + return t + end) +end + +function H.fortabs(f) + return vim + .iter(setmetatable({ + idx = 0, + }, { + __call = function(t) + local i = t.idx + 1 + if i > vim.fn.tabpagenr("$") then + return + end + t.idx = i + return t.idx + end, + })) + :fold({}, function(t, i) + table.insert(t, { f(i, i == vim.fn.tabpagenr()) }) + return t + end) +end + +return vim.defaulttable(function(k) + return M[k] or H[k] +end) -- 2.51.2