View track winids and bufnrs via events

This commit is contained in:
Alexander Courtis 2025-07-29 14:16:36 +10:00
parent 0037e1b855
commit 333dea8945

View File

@ -18,8 +18,9 @@ local Class = require("nvim-tree.classic")
---@field private width (fun():integer)|integer|string ---@field private width (fun():integer)|integer|string
---@field private max_width integer ---@field private max_width integer
---@field private padding integer ---@field private padding integer
-- TODO multi-instance remove or replace with single member -- TODO multi-instance replace with single members
---@field private bufnr_by_tabid table<integer, integer> ---@field private bufnr_by_tabid table<integer, integer>
---@field private winid_by_tabid table<integer, integer>
local View = Class:extend() local View = Class:extend()
---@class View ---@class View
@ -38,6 +39,7 @@ function View:new(args)
self.side = (self.explorer.opts.view.side == "right") and "right" or "left" self.side = (self.explorer.opts.view.side == "right") and "right" or "left"
self.live_filter = { prev_focused_node = nil, } self.live_filter = { prev_focused_node = nil, }
self.bufnr_by_tabid = {} self.bufnr_by_tabid = {}
self.winid_by_tabid = {}
self.winopts = { self.winopts = {
relativenumber = self.explorer.opts.view.relativenumber, relativenumber = self.explorer.opts.view.relativenumber,
@ -80,16 +82,32 @@ local BUFFER_OPTIONS = {
---@private ---@private
---@param bufnr integer ---@param bufnr integer
function View:create_autocmds(bufnr) function View:create_autocmds(bufnr)
--clear bufnr, eject buffer opened in window -- clear bufnr and winid
-- eject buffer opened in the nvim-tree window and create a new buffer
vim.api.nvim_create_autocmd("BufWipeout", { vim.api.nvim_create_autocmd("BufWipeout", {
group = self.explorer.augroup_id, group = self.explorer.augroup_id,
buffer = bufnr, buffer = bufnr,
callback = function(data) callback = function(data)
log.line("dev", "View BufWipeout self.bufnr_by_tabid=%s data=%s", log.line("dev",
"View BufWipeout\n bufnr = %s\n data.buf = %s\n self.bufnr_by_tabid = %s\n self.winid_by_tabid = %s",
bufnr,
data.buf,
vim.inspect(self.bufnr_by_tabid, { newline = "" }), vim.inspect(self.bufnr_by_tabid, { newline = "" }),
vim.inspect(self.winid_by_tabid, { newline = "" }),
vim.inspect(data, { newline = "" }) vim.inspect(data, { newline = "" })
) )
-- clear the tab's buffer
self.bufnr_by_tabid = vim.tbl_map(function(b)
return b ~= bufnr and b or nil
end, self.bufnr_by_tabid)
-- clear the tab's window(s)
local winids = vim.fn.win_findbuf(bufnr)
self.winid_by_tabid = vim.tbl_map(function(winid)
return not vim.tbl_contains(winids, winid) and winid or nil
end, self.winid_by_tabid)
if self.explorer.opts.actions.open_file.eject then if self.explorer.opts.actions.open_file.eject then
self:prevent_buffer_override() self:prevent_buffer_override()
else else
@ -98,27 +116,22 @@ function View:create_autocmds(bufnr)
end, end,
}) })
--set winid -- set winid
vim.api.nvim_create_autocmd("BufWinEnter", { vim.api.nvim_create_autocmd("BufWinEnter", {
group = self.explorer.augroup_id, group = self.explorer.augroup_id,
buffer = bufnr, buffer = bufnr,
callback = function(data) callback = function(data)
log.line("dev", "View BufWinEnter self.bufnr_by_tabid=%s data=%s", local tabid = vim.api.nvim_get_current_tabpage()
vim.inspect(self.bufnr_by_tabid, { newline = "" }),
vim.inspect(data, { newline = "" })
)
end,
})
--clear winid log.line("dev",
vim.api.nvim_create_autocmd("BufWinLeave", { "View BufWinEnter\n bufnr = %s\n data.buf = %s\n self.bufnr_by_tabid = %s\n self.winid_by_tabid = %s",
group = self.explorer.augroup_id, bufnr,
buffer = bufnr, data.buf,
callback = function(data)
log.line("dev", "View BufWinEnter self.bufnr_by_tabid=%s data=%s",
vim.inspect(self.bufnr_by_tabid, { newline = "" }), vim.inspect(self.bufnr_by_tabid, { newline = "" }),
vim.inspect(data, { newline = "" }) vim.inspect(self.winid_by_tabid, { newline = "" })
) )
self.winid_by_tabid[tabid] = vim.fn.bufwinid(data.buf) -- first on current tabpage
end, end,
}) })
end end
@ -155,7 +168,8 @@ function View:create_buffer(bufnr)
bufnr = bufnr or vim.api.nvim_create_buf(false, false) bufnr = bufnr or vim.api.nvim_create_buf(false, false)
-- set both bufnr registries self.bufnr_by_tabid[tabid] = bufnr
globals.BUFNR_BY_TABID[tabid] = bufnr globals.BUFNR_BY_TABID[tabid] = bufnr
vim.api.nvim_buf_set_name(bufnr, "NvimTree_" .. tabid) vim.api.nvim_buf_set_name(bufnr, "NvimTree_" .. tabid)
@ -601,7 +615,7 @@ end
function View:get_bufnr() function View:get_bufnr()
local tab = vim.api.nvim_get_current_tabpage() local tab = vim.api.nvim_get_current_tabpage()
return globals.BUFNR_BY_TABID[tabd] return globals.BUFNR_BY_TABID[tab]
end end
function View:prevent_buffer_override() function View:prevent_buffer_override()