Skip to content

Commit 333dea8

Browse files
committed
View track winids and bufnrs via events
1 parent 0037e1b commit 333dea8

File tree

1 file changed

+33
-19
lines changed

1 file changed

+33
-19
lines changed

lua/nvim-tree/explorer/view.lua

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ local Class = require("nvim-tree.classic")
1818
---@field private width (fun():integer)|integer|string
1919
---@field private max_width integer
2020
---@field private padding integer
21-
-- TODO multi-instance remove or replace with single member
21+
-- TODO multi-instance replace with single members
2222
---@field private bufnr_by_tabid table<integer, integer>
23+
---@field private winid_by_tabid table<integer, integer>
2324
local View = Class:extend()
2425

2526
---@class View
@@ -38,6 +39,7 @@ function View:new(args)
3839
self.side = (self.explorer.opts.view.side == "right") and "right" or "left"
3940
self.live_filter = { prev_focused_node = nil, }
4041
self.bufnr_by_tabid = {}
42+
self.winid_by_tabid = {}
4143

4244
self.winopts = {
4345
relativenumber = self.explorer.opts.view.relativenumber,
@@ -80,16 +82,32 @@ local BUFFER_OPTIONS = {
8082
---@private
8183
---@param bufnr integer
8284
function View:create_autocmds(bufnr)
83-
--clear bufnr, eject buffer opened in window
85+
-- clear bufnr and winid
86+
-- eject buffer opened in the nvim-tree window and create a new buffer
8487
vim.api.nvim_create_autocmd("BufWipeout", {
8588
group = self.explorer.augroup_id,
8689
buffer = bufnr,
8790
callback = function(data)
88-
log.line("dev", "View BufWipeout self.bufnr_by_tabid=%s data=%s",
91+
log.line("dev",
92+
"View BufWipeout\n bufnr = %s\n data.buf = %s\n self.bufnr_by_tabid = %s\n self.winid_by_tabid = %s",
93+
bufnr,
94+
data.buf,
8995
vim.inspect(self.bufnr_by_tabid, { newline = "" }),
96+
vim.inspect(self.winid_by_tabid, { newline = "" }),
9097
vim.inspect(data, { newline = "" })
9198
)
9299

100+
-- clear the tab's buffer
101+
self.bufnr_by_tabid = vim.tbl_map(function(b)
102+
return b ~= bufnr and b or nil
103+
end, self.bufnr_by_tabid)
104+
105+
-- clear the tab's window(s)
106+
local winids = vim.fn.win_findbuf(bufnr)
107+
self.winid_by_tabid = vim.tbl_map(function(winid)
108+
return not vim.tbl_contains(winids, winid) and winid or nil
109+
end, self.winid_by_tabid)
110+
93111
if self.explorer.opts.actions.open_file.eject then
94112
self:prevent_buffer_override()
95113
else
@@ -98,27 +116,22 @@ function View:create_autocmds(bufnr)
98116
end,
99117
})
100118

101-
--set winid
119+
-- set winid
102120
vim.api.nvim_create_autocmd("BufWinEnter", {
103121
group = self.explorer.augroup_id,
104122
buffer = bufnr,
105123
callback = function(data)
106-
log.line("dev", "View BufWinEnter self.bufnr_by_tabid=%s data=%s",
107-
vim.inspect(self.bufnr_by_tabid, { newline = "" }),
108-
vim.inspect(data, { newline = "" })
109-
)
110-
end,
111-
})
124+
local tabid = vim.api.nvim_get_current_tabpage()
112125

113-
--clear winid
114-
vim.api.nvim_create_autocmd("BufWinLeave", {
115-
group = self.explorer.augroup_id,
116-
buffer = bufnr,
117-
callback = function(data)
118-
log.line("dev", "View BufWinEnter self.bufnr_by_tabid=%s data=%s",
126+
log.line("dev",
127+
"View BufWinEnter\n bufnr = %s\n data.buf = %s\n self.bufnr_by_tabid = %s\n self.winid_by_tabid = %s",
128+
bufnr,
129+
data.buf,
119130
vim.inspect(self.bufnr_by_tabid, { newline = "" }),
120-
vim.inspect(data, { newline = "" })
131+
vim.inspect(self.winid_by_tabid, { newline = "" })
121132
)
133+
134+
self.winid_by_tabid[tabid] = vim.fn.bufwinid(data.buf) -- first on current tabpage
122135
end,
123136
})
124137
end
@@ -155,7 +168,8 @@ function View:create_buffer(bufnr)
155168

156169
bufnr = bufnr or vim.api.nvim_create_buf(false, false)
157170

158-
-- set both bufnr registries
171+
self.bufnr_by_tabid[tabid] = bufnr
172+
159173
globals.BUFNR_BY_TABID[tabid] = bufnr
160174

161175
vim.api.nvim_buf_set_name(bufnr, "NvimTree_" .. tabid)
@@ -601,7 +615,7 @@ end
601615
function View:get_bufnr()
602616
local tab = vim.api.nvim_get_current_tabpage()
603617

604-
return globals.BUFNR_BY_TABID[tabd]
618+
return globals.BUFNR_BY_TABID[tab]
605619
end
606620

607621
function View:prevent_buffer_override()

0 commit comments

Comments
 (0)