@@ -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>
2324local 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
8284function 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 })
124137end
@@ -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 )
601615function 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 ]
605619end
606620
607621function View :prevent_buffer_override ()
0 commit comments