11local statuscolumn = {};
2+ local utils = require (" bars.utils" );
23local components = require (" bars.components.statuscolumn" );
34
45--- @type statuscolumn.config
56statuscolumn .config = {
6- ignore_filetypes = {},
7+ ignore_filetypes = { " query " },
78 ignore_buftypes = { " nofile" , " help" },
89
910 default = {
@@ -115,6 +116,19 @@ statuscolumn.config = {
115116 end
116117 },
117118 }
119+ },
120+
121+ query = {
122+ condition = function (buffer )
123+ return vim .bo [buffer ].ft == " query" ;
124+ end ,
125+ parts = {
126+ {
127+ kind = " empty" ,
128+ len = 1 ,
129+ hl = " Normal"
130+ },
131+ }
118132 }
119133};
120134
@@ -174,7 +188,7 @@ statuscolumn.render = function (buffer, window)
174188
175189 if window ~= vim .g .statusline_winid then
176190 return " " ;
177- elseif vim . list_contains ( statuscolumn .state .attached_windows , window ) == false then
191+ elseif statuscolumn .state .attached_windows [ window ] ~= true then
178192 return " " ;
179193 end
180194
@@ -214,16 +228,21 @@ statuscolumn.detach = function (buffer)
214228 return ;
215229 end
216230
217- for w , win in ipairs (statuscolumn .state .attached_windows ) do
218- if vim .api .nvim_win_get_buf (win ) ~= buffer then
219- goto continue ;
220- end
221-
222- vim .w [win ].__scID = nil ;
223- vim .wo [win ].statuscolumn = " " ;
224- table.remove (statuscolumn .state .attached_windows , w );
231+ local windows = vim .fn .win_findbuf (buffer )
225232
226- :: continue::
233+ for _ , win in ipairs (windows ) do
234+ statuscolumn .state .attached_windows [win ] = false ;
235+
236+ vim .defer_fn (function ()
237+ if vim .w [win ].__statuscolumn then
238+ vim .wo [win ].statuscolumn = vim .w [win ].__statuscolumn [1 ];
239+ vim .w [win ].__statuscolumn = nil ;
240+ else
241+ vim .wo [win ].statuscolumn = " " ;
242+ end
243+
244+ vim .w [win ].__scID = nil ;
245+ end , 1 )
227246 end
228247
229248 --- | fE
@@ -252,20 +271,33 @@ statuscolumn.attach = function (buffer)
252271 elseif vim .list_contains (statuscolumn .config .ignore_buftypes , bt ) then
253272 statuscolumn .detach (buffer );
254273 return ;
274+ elseif statuscolumn .config .condition then
275+ local checked_condition , result = pcall (statuscolumn .config .condition , buffer );
276+
277+ if checked_condition == false then
278+ statuscolumn .detach (buffer );
279+ return ;
280+ elseif result == false then
281+ statuscolumn .detach (buffer );
282+ return ;
283+ end
255284 end
256285
257286 local windows = vim .fn .win_findbuf (buffer );
258287
259288 for _ , win in ipairs (windows ) do
260- if vim . list_contains ( statuscolumn .state .attached_windows ) == true then
289+ if statuscolumn .state .attached_windows [ win ] == true then
261290 goto continue ;
262291 end
263292
264293 local scID = statuscolumn .update_id (win );
265- table.insert ( statuscolumn .state .attached_windows , win ) ;
294+ statuscolumn .state .attached_windows [ win ] = true ;
266295
267296 vim .w [win ].__scID = scID ;
268297
298+ vim .w [win ].__numberwidth = utils .to_constant (vim .wo [win ].numberwidth );
299+ vim .w [win ].__statuscolumn = utils .to_constant (vim .wo [win ].statuscolumn );
300+
269301 vim .wo [win ].numberwidth = 1 ;
270302 vim .wo [win ].statuscolumn = " %!v:lua.require('bars.statuscolumn').render(" .. buffer .. " ," .. win .. " )" ;
271303
@@ -275,6 +307,50 @@ statuscolumn.attach = function (buffer)
275307 --- | fE
276308end
277309
310+ --- Cleans up invalid buffers and recalculates
311+ --- valid buffers config ID.
312+ statuscolumn .clean = function ()
313+ for window , _ in pairs (statuscolumn .state .attached_windows ) do
314+ if vim .api .nvim_win_is_valid (window ) == false then
315+ statuscolumn .state .attached_windows [window ] = false ;
316+ goto continue ;
317+ end
318+
319+ local buffer = vim .api .nvim_win_get_buf (window );
320+
321+ local ft , bt = vim .bo [buffer ].ft , vim .bo [buffer ].bt ;
322+
323+ if type (buffer ) ~= " number" then
324+ statuscolumn .detach (buffer );
325+ return ;
326+ elseif vim .api .nvim_buf_is_loaded (buffer ) == false then
327+ statuscolumn .detach (buffer );
328+ return ;
329+ elseif vim .api .nvim_buf_is_valid (buffer ) == false then
330+ statuscolumn .detach (buffer );
331+ return ;
332+ elseif vim .list_contains (statuscolumn .config .ignore_filetypes , ft ) then
333+ statuscolumn .detach (buffer );
334+ return ;
335+ elseif vim .list_contains (statuscolumn .config .ignore_buftypes , bt ) then
336+ statuscolumn .detach (buffer );
337+ return ;
338+ elseif statuscolumn .config .condition then
339+ local checked_condition , result = pcall (statuscolumn .config .condition , buffer );
340+
341+ if checked_condition == false then
342+ statuscolumn .detach (buffer );
343+ return ;
344+ elseif result == false then
345+ statuscolumn .detach (buffer );
346+ return ;
347+ end
348+ end
349+
350+ :: continue::
351+ end
352+ end
353+
278354--- Sets up the statuscolumn module.
279355--- @param config statuscolumn.config | nil
280356statuscolumn .setup = function (config )
0 commit comments