1
1
local statuscolumn = {};
2
2
local components = require (" bars.components.statuscolumn" );
3
3
4
+ --- Custom statuscolumn.
5
+ --- @type string
6
+ local STC = " %!v:lua.require('bars.statuscolumn').render()" ;
7
+
4
8
--- @type statuscolumn.config
5
9
statuscolumn .config = {
6
10
ignore_filetypes = { " blink-cmp-menu" },
@@ -326,14 +330,26 @@ statuscolumn.detach = function (window)
326
330
win = window
327
331
}
328
332
);
329
- vim .api .nvim_set_option_value (
330
- " relativenumber" ,
331
- vim .w [window ].__relativenumber or vim .g .__relativenumber or false ,
332
- {
333
- scope = " local" ,
334
- win = window
335
- }
336
- );
333
+
334
+ --- Cached statuscolumn.
335
+ --- @type string | nil
336
+ local _st = vim .w [window ].__statuscolumn or vim .g .__statuscolumn or " " ;
337
+
338
+ if _st == " " or _st == nil then
339
+ --- Reset statuscolumn.
340
+ vim .api .nvim_win_call (window , function ()
341
+ vim .cmd (" set statuscolumn&" );
342
+ end );
343
+ else
344
+ vim .api .nvim_set_option_value (
345
+ " statuscolumn" ,
346
+ _st ,
347
+ {
348
+ scope = " local" ,
349
+ win = window
350
+ }
351
+ );
352
+ end
337
353
338
354
statuscolumn .state .attached_windows [window ] = false ;
339
355
end );
@@ -382,7 +398,7 @@ statuscolumn.attach = function (window)
382
398
elseif statuscolumn .can_attach (window ) == false then
383
399
return ;
384
400
elseif statuscolumn .state .attached_windows [window ] == true then
385
- if vim .wo [window ].statuscolumn == " %!v:lua.require('bars.statuscolumn').render() " then
401
+ if vim .wo [window ].statuscolumn == STC then
386
402
statuscolumn .update_id (window );
387
403
return ;
388
404
end
@@ -392,9 +408,15 @@ statuscolumn.attach = function (window)
392
408
393
409
vim .w [window ].__relativenumber = vim .wo [window ].relativenumber ;
394
410
vim .w [window ].__numberwidth = vim .wo [window ].numberwidth ;
395
- vim .w [window ].__statuscolumn = vim .wo [window ].statuscolumn ;
396
411
397
- vim .wo [window ].statuscolumn = " %!v:lua.require('bars.statuscolumn').render()" ;
412
+ --- If the statuscolumn matches the one we set then
413
+ --- this is most likely due to inheriting window properties.
414
+ ---
415
+ --- This window was most likely opened from another window
416
+ --- we had attached to before.
417
+ vim .w [window ].__statuscolumn = vim .wo [window ].statuscolumn == STC and " " or vim .wo [window ].statuscolumn ;
418
+
419
+ vim .wo [window ].statuscolumn = STC ;
398
420
399
421
--- | fE
400
422
end
@@ -405,7 +427,7 @@ statuscolumn.global_attach = function ()
405
427
statuscolumn .update_id (window );
406
428
end
407
429
408
- vim .o .statuscolumn = " %!v:lua.require('bars.statuscolumn').render() " ;
430
+ vim .o .statuscolumn = STC ;
409
431
end
410
432
411
433
--- Cleans up invalid buffers and recalculates
@@ -424,11 +446,38 @@ statuscolumn.clean = function ()
424
446
--- | fE
425
447
end
426
448
449
+ --- Toggles state of given window.
450
+ --- @param window integer
451
+ statuscolumn .toggle = function (window )
452
+ if type (window ) ~= " number" or statuscolumn .state .attached_windows [window ] == nil then
453
+ return ;
454
+ elseif statuscolumn .state .attached_windows [window ] == true then
455
+ statuscolumn .detach (window );
456
+ else
457
+ statuscolumn .attach (window );
458
+ end
459
+ end
460
+
461
+ --- Toggles statuscolumn **globally**.
462
+ statuscolumn .Toggle = function ()
463
+ for window , state in pairs (statuscolumn .state .attached_windows ) do
464
+ if state ~= nil then
465
+ statuscolumn .toggle (window );
466
+ end
467
+ end
468
+
469
+ --- true -> false,
470
+ --- false -> true
471
+ statuscolumn .state .enable = not statuscolumn .state .enable ;
472
+ end
473
+
427
474
--- Sets up the statuscolumn module.
428
475
--- @param config statuscolumn.config | nil
429
476
statuscolumn .setup = function (config )
430
477
if type (config ) == " table" then
431
478
statuscolumn .config = vim .tbl_extend (" force" , statuscolumn .config , config );
479
+ elseif type (config ) == " boolean" then
480
+ statuscolumn .state .enable = config ;
432
481
end
433
482
434
483
for window , _ in pairs (statuscolumn .state .attached_windows ) do
0 commit comments