From 5db04afa0a7474a31d4de45d36f310c531dece20 Mon Sep 17 00:00:00 2001 From: Alexander Courtis Date: Wed, 18 Jun 2025 13:50:44 +1000 Subject: [PATCH] refactor(#2826): add View.tab_line for debugging --- lua/nvim-tree/explorer/view.lua | 99 +++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/lua/nvim-tree/explorer/view.lua b/lua/nvim-tree/explorer/view.lua index 12406726..b98bce8a 100644 --- a/lua/nvim-tree/explorer/view.lua +++ b/lua/nvim-tree/explorer/view.lua @@ -39,6 +39,7 @@ M.View = { ---@field private width (fun():integer)|integer|string ---@field private max_width integer ---@field private padding integer +---@field tab_line fun():string local View = Class:extend() ---@class View @@ -664,4 +665,102 @@ function View:configure_width(width) end end +--- Debugging only. +--- Tabs show TABPAGES winnr and BUFNR_PER_TAB bufnr for the tab. +--- Orphans for inexistent tab_ids are shown at the right. +--- lib.target_winid is always shown at the right next to a close button. +--- Enable with: +--- vim.opt.tabline = "%!v:lua.require('nvim-tree.explorer.view').tab_line()" +--- vim.opt.showtabline = 2 +---@return string +function View.tab_line() + local tab_ids = vim.api.nvim_list_tabpages() + local cur_tab_id = vim.api.nvim_get_current_tabpage() + + local bufnr_per_tab = vim.deepcopy(BUFNR_PER_TAB) + local tabpages = vim.deepcopy(M.View.tabpages) + + local tl = "%#TabLine#" + + for i, tab_id in ipairs(tab_ids) do + -- click to select + tl = tl .. "%" .. i .. "T" + + -- style + if tab_id == cur_tab_id then + tl = tl .. "%#StatusLine#|" + else + tl = tl .. "|%#TabLine#" + end + + -- tab_id itself + tl = tl .. " t" .. tab_id + + -- winnr, if present + local tp = M.View.tabpages[tab_id] + if tp then + tl = tl .. " w" .. tp.winnr + else + tl = tl .. " " + end + + -- bufnr, if present + local bpt = BUFNR_PER_TAB[tab_id] + if bpt then + tl = tl .. " b" .. bpt + else + tl = tl .. " " + end + + tl = tl .. " " + + -- remove actively mapped + bufnr_per_tab[tab_id] = nil + tabpages[tab_id] = nil + end + + -- close last and reset + tl = tl .. "|%#CursorLine#%T" + + -- collect orphans + local orphans = {} + for tab_id, bufnr in pairs(bufnr_per_tab) do + orphans[tab_id] = orphans[tab_id] or {} + orphans[tab_id].bufnr = bufnr + end + for tab_id, tp in pairs(tabpages) do + orphans[tab_id] = orphans[tab_id] or {} + orphans[tab_id].winnr = tp.winnr + end + + -- right-align + tl = tl .. "%=%#TabLine#" + + -- print orphans + for tab_id, orphan in pairs(orphans) do + -- inexistent tab + tl = tl .. "%#error#| t" .. tab_id + + -- maybe winnr + if orphan.winnr then + tl = tl .. " w" .. orphan.winnr + else + tl = tl .. " " + end + + -- maybe bufnr + if orphan.bufnr then + tl = tl .. " b" .. orphan.bufnr + else + tl = tl .. " " + end + tl = tl .. " " + end + + -- target win id and close button + tl = tl .. "|%#TabLine# twi" .. (require("nvim-tree.lib").target_winid or "?") .. " %999X| X |" + + return tl +end + return View