@@ -78,6 +78,33 @@ local BUFFER_OPTIONS = {
78
78
{ name = " swapfile" , value = false },
79
79
}
80
80
81
+ --- @private
82
+ --- @param data table
83
+ --- @param bufnr integer
84
+ function View :log_event (data , bufnr )
85
+ log .line (" dev" , " View %s\
86
+ bufnr = %s\
87
+ vim.api.nvim_get_current_tabpage() = %s\
88
+ vim.api.nvim_get_current_win() = %s\
89
+ self.bufnr_by_tabid = %s\
90
+ globals.BUFNR_BY_TABID = %s\
91
+ globals.WINID_BY_TABID = %s\
92
+ vim.fn.win_findbuf(bufnr) = %s\
93
+ data = %s\
94
+ vim.v.event = %s" ,
95
+ data .event ,
96
+ bufnr ,
97
+ vim .api .nvim_get_current_tabpage (),
98
+ vim .api .nvim_get_current_win (),
99
+ vim .inspect (self .bufnr_by_tabid , { newline = " " }),
100
+ vim .inspect (globals .BUFNR_BY_TABID , { newline = " " }),
101
+ vim .inspect (globals .WINID_BY_TABID , { newline = " " }),
102
+ vim .inspect (vim .fn .win_findbuf (bufnr ), { newline = " " }),
103
+ vim .inspect (data , { newline = " " }),
104
+ vim .inspect (vim .v .event , { newline = " " })
105
+ )
106
+ end
107
+
81
108
--- Buffer local autocommands to track state, deleted on buffer wipeout
82
109
--- @private
83
110
--- @param bufnr integer
@@ -88,26 +115,13 @@ function View:create_autocmds(bufnr)
88
115
group = self .explorer .augroup_id ,
89
116
buffer = bufnr ,
90
117
callback = function (data )
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 ,
95
- vim .inspect (self .bufnr_by_tabid , { newline = " " }),
96
- vim .inspect (self .winid_by_tabid , { newline = " " }),
97
- vim .inspect (data , { newline = " " })
98
- )
118
+ self :log_event (data , bufnr )
99
119
100
120
-- clear the tab's buffer
101
121
self .bufnr_by_tabid = vim .tbl_map (function (b )
102
122
return b ~= bufnr and b or nil
103
123
end , self .bufnr_by_tabid )
104
124
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
-
111
125
if self .explorer .opts .actions .open_file .eject then
112
126
self :prevent_buffer_override ()
113
127
else
@@ -116,22 +130,46 @@ function View:create_autocmds(bufnr)
116
130
end ,
117
131
})
118
132
119
- -- set winid
120
- vim .api .nvim_create_autocmd (" BufWinEnter" , {
133
+ -- close any other windows containing this buffer
134
+ -- not fired when entering the first window, only subsequent event such as following a split
135
+ -- does fire on :tabnew for _any_ buffer
136
+ vim .api .nvim_create_autocmd (" WinEnter" , {
121
137
group = self .explorer .augroup_id ,
122
138
buffer = bufnr ,
123
139
callback = function (data )
124
- local tabid = vim .api .nvim_get_current_tabpage ()
140
+ self :log_event (data , bufnr )
141
+
142
+ -- ignore other buffers
143
+ if data .buf ~= bufnr then
144
+ return
145
+ end
146
+
147
+ -- ignore other tabs
148
+ -- this event is fired on a a :tabnew window, even though the buffer isn't actually present
149
+ local tabid_cur = vim .api .nvim_get_current_tabpage ()
150
+ if self .bufnr_by_tabid [tabid_cur ] ~= bufnr then
151
+ return
152
+ end
153
+
154
+ -- are there any other windows containing bufnr?
155
+ local winids_buf = vim .fn .win_findbuf (bufnr )
156
+ if # winids_buf <= 1 then
157
+ return
158
+ end
159
+
160
+ -- close all other windows
161
+ local winid_cur = vim .api .nvim_get_current_win ()
162
+ for _ , winid in ipairs (winids_buf ) do
163
+ if winid ~= winid_cur then
164
+ pcall (vim .api .nvim_win_close , winid , false )
165
+ end
166
+ end
125
167
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 ,
130
- vim .inspect (self .bufnr_by_tabid , { newline = " " }),
131
- vim .inspect (self .winid_by_tabid , { newline = " " })
132
- )
168
+ globals .WINID_BY_TABID [tabid_cur ] = winid_cur
133
169
134
- self .winid_by_tabid [tabid ] = vim .fn .bufwinid (data .buf ) -- first on current tabpage
170
+ -- setup this window, it may be new e.g. split
171
+ self :set_window_options_and_buffer ()
172
+ self :resize ()
135
173
end ,
136
174
})
137
175
end
0 commit comments