From d45e5e7b621e53282384799a7d8836346275593e Mon Sep 17 00:00:00 2001 From: Zacharias-Brohn Date: Tue, 16 Dec 2025 22:50:48 +0100 Subject: [PATCH] powerline for real --- lua/zterm-navigator/init.lua | 81 +++++++++++++----------------------- 1 file changed, 30 insertions(+), 51 deletions(-) diff --git a/lua/zterm-navigator/init.lua b/lua/zterm-navigator/init.lua index ef2a2f9..92e14d4 100644 --- a/lua/zterm-navigator/init.lua +++ b/lua/zterm-navigator/init.lua @@ -12,7 +12,6 @@ local M = {} -- Track if statusline integration is active M._statusline_enabled = false -M._statusline_augroup = nil -- Default configuration M.config = { @@ -266,36 +265,42 @@ local function get_rendered_statusline() return table.concat(output) end --- Update the ZTerm statusline -local function update_statusline() +-- Polling timer for statusline updates +local poll_timer = nil +local last_statusline = nil + +-- Check if statusline changed and send update if needed +local function poll_statusline() if not M._statusline_enabled then return end local content = get_rendered_statusline() - if content then + if content and content ~= last_statusline then + last_statusline = content send_statusline(content) end end --- Debounce timer for statusline updates -local update_timer = nil - --- Schedule a statusline update with debouncing -local function schedule_update() - -- Cancel any pending update - if update_timer then - update_timer:stop() - update_timer:close() - update_timer = nil +-- Start polling for statusline changes +local function start_polling() + if poll_timer then + return end - - -- Schedule a new update - update_timer = vim.loop.new_timer() - update_timer:start(5, 0, vim.schedule_wrap(function() - update_timer = nil - update_statusline() - end)) + + poll_timer = vim.loop.new_timer() + -- Poll every 25ms + poll_timer:start(0, 25, vim.schedule_wrap(poll_statusline)) +end + +-- Stop polling +local function stop_polling() + if poll_timer then + poll_timer:stop() + poll_timer:close() + poll_timer = nil + end + last_statusline = nil end -- Saved laststatus value to restore on disable @@ -315,31 +320,8 @@ function M.enable_statusline() vim.o.laststatus = 0 end - -- Create autocommands for statusline updates - M._statusline_augroup = vim.api.nvim_create_augroup("ZTermStatusline", { clear = true }) - - -- Events that should trigger a statusline update - local events = { - "ModeChanged", -- Mode changes (normal, insert, visual, etc.) - "BufEnter", -- Entering a buffer - "BufWritePost", -- After writing a file - "FileChangedShellPost", - "WinEnter", -- Entering a window - "CursorMoved", -- Cursor moved (for position info) - "CursorMovedI", -- Cursor moved in insert mode - "DiagnosticChanged", -- LSP diagnostics changed - } - - vim.api.nvim_create_autocmd(events, { - group = M._statusline_augroup, - callback = function() - -- Use vim.schedule to defer until after the event is fully processed - vim.schedule(update_statusline) - end, - }) - - -- Initial update - update_statusline() + -- Start polling for statusline changes + start_polling() end -- Disable statusline integration @@ -350,11 +332,8 @@ function M.disable_statusline() M._statusline_enabled = false - -- Remove autocommands - if M._statusline_augroup then - vim.api.nvim_del_augroup_by_id(M._statusline_augroup) - M._statusline_augroup = nil - end + -- Stop polling + stop_polling() -- Restore neovim's statusline if M._saved_laststatus then