Skip to content

Commit 6133947

Browse files
committed
refactor(statuscolumn): Added ability to reset statuscolumn
If the cached value of the statuscolumn is "" or `nil` then it is reset. feat(statuscolumn): Added ability to Toggle statuscolumn Use `statuscolumn.toggle(winnr)` for specific window and `statuscolumn.Toggle()` for globally.
1 parent 110b552 commit 6133947

File tree

1 file changed

+61
-12
lines changed

1 file changed

+61
-12
lines changed

lua/bars/statuscolumn.lua

Lines changed: 61 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
local statuscolumn = {};
22
local components = require("bars.components.statuscolumn");
33

4+
--- Custom statuscolumn.
5+
---@type string
6+
local STC = "%!v:lua.require('bars.statuscolumn').render()";
7+
48
---@type statuscolumn.config
59
statuscolumn.config = {
610
ignore_filetypes = { "blink-cmp-menu" },
@@ -326,14 +330,26 @@ statuscolumn.detach = function (window)
326330
win = window
327331
}
328332
);
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
337353

338354
statuscolumn.state.attached_windows[window] = false;
339355
end);
@@ -382,7 +398,7 @@ statuscolumn.attach = function (window)
382398
elseif statuscolumn.can_attach(window) == false then
383399
return;
384400
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
386402
statuscolumn.update_id(window);
387403
return;
388404
end
@@ -392,9 +408,15 @@ statuscolumn.attach = function (window)
392408

393409
vim.w[window].__relativenumber = vim.wo[window].relativenumber;
394410
vim.w[window].__numberwidth = vim.wo[window].numberwidth;
395-
vim.w[window].__statuscolumn = vim.wo[window].statuscolumn;
396411

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;
398420

399421
---|fE
400422
end
@@ -405,7 +427,7 @@ statuscolumn.global_attach = function ()
405427
statuscolumn.update_id(window);
406428
end
407429

408-
vim.o.statuscolumn = "%!v:lua.require('bars.statuscolumn').render()";
430+
vim.o.statuscolumn = STC;
409431
end
410432

411433
--- Cleans up invalid buffers and recalculates
@@ -424,11 +446,38 @@ statuscolumn.clean = function ()
424446
---|fE
425447
end
426448

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+
427474
--- Sets up the statuscolumn module.
428475
---@param config statuscolumn.config | nil
429476
statuscolumn.setup = function (config)
430477
if type(config) == "table" then
431478
statuscolumn.config = vim.tbl_extend("force", statuscolumn.config, config);
479+
elseif type(config) == "boolean" then
480+
statuscolumn.state.enable = config;
432481
end
433482

434483
for window, _ in pairs(statuscolumn.state.attached_windows) do

0 commit comments

Comments
 (0)