🪴 a tiny, customizable statusline for neovim
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

refactor: merge winbar and statusline

robin de07fac6 df9af247

+49 -151
-6
lua/lylla/init.lua
··· 39 39 callback = function() 40 40 local win = vim.api.nvim_get_current_win() 41 41 require("lylla.statusline"):new(win):init() 42 - require("lylla.winbar"):new(win):init() 43 42 end, 44 43 }) 45 44 local win = vim.api.nvim_get_current_win() 46 45 require("lylla.statusline"):new(win):init() 47 - require("lylla.winbar"):new(win):init() 48 46 49 47 vim.api.nvim_create_autocmd("WinClosed", { 50 48 group = vim.api.nvim_create_augroup("lylla:close", { clear = true }), ··· 52 50 local stl = require("lylla.statusline").wins[ev.match] 53 51 if stl then 54 52 stl:close() 55 - end 56 - local wbar = require("lylla.winbar").wins[ev.match] 57 - if wbar then 58 - wbar:close() 59 53 end 60 54 end, 61 55 })
+49 -20
lua/lylla/statusline.lua
··· 4 4 ---@field wins table<integer, table> 5 5 ---@field win integer 6 6 ---@field modules any[] 7 + ---@field winbar any[] 7 8 ---@field timer uv.uv_timer_t 8 9 ---@field refreshau integer 9 10 local statusline = {} ··· 19 20 local stl = setmetatable({ 20 21 win = win, 21 22 modules = vim.deepcopy(require("lylla.config").get().modules, true), 23 + winbar = vim.deepcopy(require("lylla.config").get().winbar, true), 22 24 }, { __index = statusline }) 23 25 statusline.wins[win] = stl 24 26 return stl ··· 61 63 ---@field refresh fun(self, ev?: vim.api.keyset.create_autocmd.callback_args) 62 64 function statusline:refresh(ev) 63 65 vim.schedule(function() 64 - if vim.o.cmdheight == 0 and vim.api.nvim_get_mode().mode == "c" then 65 - return 66 - end 67 - 68 66 if not vim.api.nvim_win_is_valid(self.win) then 69 67 return 70 68 end 71 69 72 - local ok, result = pcall(vim.api.nvim_win_call, self.win, function() 73 - return self:get(ev) 74 - end) 75 - if not ok then 76 - return 77 - end 78 - 79 - vim.wo[self.win].statusline = result 70 + self:set(ev) 71 + self:setwinbar(ev) 80 72 end) 81 73 end 82 74 83 75 ---@class lylla.proto 84 - ---@field fold fun(self, ev?: vim.api.keyset.create_autocmd.callback_args): string 85 - function statusline:fold(ev) 86 - local modules = vim 87 - .iter(ipairs(self.modules)) 88 - :map(function(i, module) 76 + ---@field fold fun(self, ev?: vim.api.keyset.create_autocmd.callback_args, modules: any[]): string 77 + function statusline:fold(ev, modules) 78 + local lst = vim 79 + .iter(ipairs(modules)) 80 + :map(function(_, module) 89 81 if type(module) == "table" and module._type == "component" then 90 82 if module.opts and module.opts.events then 91 83 -- refresh from timer ··· 106 98 return module 107 99 end) 108 100 :totable() 109 - modules = utils.flatten(modules, 1) 110 - return vim.iter(modules):fold("", function(str, module) 101 + lst = utils.flatten(lst, 1) 102 + return vim.iter(lst):fold("", function(str, module) 111 103 if type(module) ~= "table" or #module == 0 then 112 104 return str 113 105 end ··· 122 114 ---@class lylla.proto 123 115 ---@field get fun(self, ev?: vim.api.keyset.create_autocmd.callback_args) 124 116 function statusline:get(ev) 125 - return self:fold(ev) 117 + return self:fold(ev, self.modules) 118 + end 119 + 120 + ---@class lylla.proto 121 + ---@field getwinbar fun(self, ev?: vim.api.keyset.create_autocmd.callback_args) 122 + function statusline:getwinbar(ev) 123 + return self:fold(ev, self.winbar) 124 + end 125 + 126 + ---@class lylla.proto 127 + ---@field setwinbar fun(self, ev?: vim.api.keyset.create_autocmd.callback_args) 128 + function statusline:setwinbar(ev) 129 + local buf = vim.api.nvim_win_get_buf(self.win) 130 + if vim.bo[buf].buftype ~= "" then 131 + return 132 + end 133 + 134 + local ok, result = pcall(vim.api.nvim_win_call, self.win, function() 135 + return self:getwinbar(ev) 136 + end) 137 + if not ok then 138 + return 139 + end 140 + 141 + vim.wo[self.win].winbar = result 142 + end 143 + 144 + ---@class lylla.proto 145 + ---@field set fun(self, ev?: vim.api.keyset.create_autocmd.callback_args) 146 + function statusline:set(ev) 147 + local ok, result = pcall(vim.api.nvim_win_call, self.win, function() 148 + return self:get(ev) 149 + end) 150 + if not ok then 151 + return 152 + end 153 + 154 + vim.wo[self.win].statusline = result 126 155 end 127 156 128 157 return statusline
-125
lua/lylla/winbar.lua
··· 1 - local utils = require("lylla.utils") 2 - 3 - ---@type lylla.proto 4 - ---@diagnostic disable-next-line: missing-fields 5 - local winbar = {} 6 - 7 - winbar.wins = {} 8 - 9 - ---@class lylla.proto 10 - ---@field new fun(self, win): lylla.proto 11 - function winbar:new(win) 12 - if winbar.wins[win] then 13 - winbar.wins[win]:close() 14 - end 15 - local stl = setmetatable({ 16 - win = win, 17 - modules = vim.deepcopy(require("lylla.config").get().winbar, true), 18 - }, { __index = winbar }) 19 - winbar.wins[win] = stl 20 - return stl 21 - end 22 - 23 - ---@class lylla.proto 24 - ---@field init fun(self) 25 - function winbar:init() 26 - local err, err_kind 27 - ---@diagnostic disable-next-line: assign-type-mismatch 28 - self.timer, err, err_kind = vim.uv.new_timer() 29 - if not self.timer or err then 30 - vim.api.nvim_echo({ { err_kind }, { "\n\t" }, { err } }, true, { err = true }) 31 - return 32 - end 33 - 34 - local refresh = require("lylla.config").get().refresh_rate 35 - self.timer:start(0, refresh, function() 36 - self:refresh() 37 - end) 38 - 39 - self.refreshau = vim.api.nvim_create_autocmd(require("lylla.config").get().events, { 40 - group = vim.api.nvim_create_augroup("lylla:refresh", { clear = false }), 41 - callback = function(ev) 42 - self:refresh(ev) 43 - end, 44 - }) 45 - end 46 - 47 - ---@class lylla.proto 48 - ---@field close fun(self) 49 - function winbar:close() 50 - self.timer:stop() 51 - self.timer:close() 52 - vim.api.nvim_del_autocmd(self.refreshau) 53 - winbar.wins[self.win] = nil 54 - end 55 - 56 - ---@class lylla.proto 57 - ---@field refresh fun(self, ev?: vim.api.keyset.create_autocmd.callback_args) 58 - function winbar:refresh(ev) 59 - vim.schedule(function() 60 - if not vim.api.nvim_win_is_valid(self.win) then 61 - return 62 - end 63 - 64 - local buf = vim.api.nvim_win_get_buf(self.win) 65 - if vim.bo[buf].buftype ~= "" then 66 - return 67 - end 68 - 69 - local ok, result = pcall(vim.api.nvim_win_call, self.win, function() 70 - return self:get(ev) 71 - end) 72 - if not ok then 73 - return 74 - end 75 - 76 - vim.wo[self.win].winbar = result 77 - end) 78 - end 79 - 80 - ---@class lylla.proto 81 - ---@field fold fun(self, ev?: vim.api.keyset.create_autocmd.callback_args): string 82 - function winbar:fold(ev) 83 - local modules = vim 84 - .iter(ipairs(self.modules)) 85 - :map(function(i, module) 86 - if type(module) == "table" and module._type == "component" then 87 - if module.opts and module.opts.events then 88 - -- refresh from timer 89 - if not ev and module.prev then 90 - return module.prev 91 - end 92 - -- refresh from non-match event 93 - if ev and not vim.tbl_contains(module.opts.events, ev.event) and module.prev then 94 - return module.prev 95 - end 96 - end 97 - module.prev = module.fn() 98 - return module.prev 99 - end 100 - if type(module) == "function" then 101 - module = module() 102 - end 103 - return module 104 - end) 105 - :totable() 106 - modules = utils.flatten(modules, 1) 107 - return vim.iter(modules):fold("", function(str, module) 108 - if type(module) ~= "table" or #module == 0 then 109 - return str 110 - end 111 - local text = module[1] 112 - if #module > 1 then 113 - return str .. "%#" .. module[2] .. "#" .. text .. "%*" 114 - end 115 - return str .. "%*" .. text 116 - end) 117 - end 118 - 119 - ---@class lylla.proto 120 - ---@field get fun(self, ev?: vim.api.keyset.create_autocmd.callback_args) 121 - function winbar:get(ev) 122 - return self:fold(ev) 123 - end 124 - 125 - return winbar