@@ -17,11 +17,13 @@ local timers = {
1717 stl_timer = vim .loop .new_timer (),
1818 tal_timer = vim .loop .new_timer (),
1919 wb_timer = vim .loop .new_timer (),
20+ refresh_check_timer = vim .loop .new_timer (),
2021 halt_stl_refresh = false , -- mutex ?
2122 halt_tal_refresh = false ,
2223 halt_wb_refresh = false ,
2324}
2425
26+
2527local last_focus = {}
2628local refresh_real_curwin
2729
@@ -333,6 +335,13 @@ local function should_ignore_focus(user_config, win)
333335 end
334336end
335337
338+ local refresh_event_queue = {
339+ has_events = false ,
340+ statusline = {},
341+ tabline = {},
342+ winbar = {},
343+ }
344+
336345--- @alias LualineRefreshOptsKind
337346--- | ' all'
338347--- | ' tabpage'
344353--- @class LualineRefreshOpts
345354--- @field scope LualineRefreshOptsKind
346355--- @field place LualineRefreshOptsPlace[]
347- --- @field trigger ' timer' | ' init' | ' unknown'
356+ --- @field trigger ' timer' | ' init' | ' autocmd' | ' unknown'
357+ --- @field queued boolean
348358--- Refresh contents of lualine
349359--- @param opts LualineRefreshOpts
350360local function refresh (opts )
@@ -357,6 +367,15 @@ local function refresh(opts)
357367 trigger = ' unknown' ,
358368 })
359369
370+
371+ if not opts .queued then
372+ for _ , place in ipairs (opts .place ) do
373+ refresh_event_queue [' has_events' ] = true
374+ refresh_event_queue [place ] = vim .tbl_extend (' force' , opts , {place = {place }, queued = true })
375+ end
376+ return
377+ end
378+
360379 local wins = {}
361380 local old_actual_curwin = vim .g .actual_curwin
362381
449468local function set_tabline (hide )
450469 vim .loop .timer_stop (timers .tal_timer )
451470 timers .halt_tal_refresh = true
471+ vim .cmd ([[ augroup lualine_tal_refresh | exe "autocmd!" | augroup END]] )
452472 if not hide and next (config .tabline ) ~= nil then
453473 vim .loop .timer_start (
454474 timers .tal_timer ,
@@ -458,6 +478,13 @@ local function set_tabline(hide)
458478 refresh { scope = ' tabpage' , place = { ' tabline' }, trigger = ' timer' }
459479 end , 3 , ' lualine: Failed to refresh tabline' )
460480 )
481+ modules .utils .define_autocmd (
482+ table.concat (config .options .refresh .events , ' ,' ),
483+ ' *' ,
484+ " call v:lua.require'lualine'.refresh({'kind': 'tabpage', 'place': ['tabline'], 'trigger': 'autocmd'})" ,
485+ ' lualine_tal_refresh'
486+ )
487+
461488 modules .nvim_opts .set (' showtabline' , config .options .always_show_tabline and 2 or 1 , { global = true })
462489 timers .halt_tal_refresh = false
463490 vim .schedule (function ()
@@ -471,12 +498,37 @@ local function set_tabline(hide)
471498 end
472499end
473500
501+
502+ local function check_refresh ()
503+ if not refresh_event_queue .has_events then return end
504+ refresh_event_queue .has_events = nil
505+
506+ for place , refresh_cmd in pairs (refresh_event_queue ) do
507+ if type (refresh_cmd ) == " table" and refresh_cmd .queued == true then
508+ refresh (refresh_cmd )
509+ refresh_event_queue [place ] = {}
510+ end
511+ end
512+ end
513+
514+ local function set_refresh_checker ()
515+ vim .loop .timer_stop (timers .refresh_check_timer )
516+ vim .loop .timer_start (
517+ timers .refresh_check_timer ,
518+ 0 ,
519+ config .options .refresh .check ,
520+ modules .utils .timer_call (timers .refresh_check_timer , ' lualine_refresh_check' , check_refresh ,
521+ 3 , ' lualine: Failed to refresh statusline' )
522+ )
523+ end
524+
474525--- Sets &statusline option to lualine
475526--- adds auto command to redraw lualine on VimResized event
476527--- @param hide boolean | nil if should hide statusline
477528local function set_statusline (hide )
478529 vim .loop .timer_stop (timers .stl_timer )
479530 timers .halt_stl_refresh = true
531+ vim .cmd ([[ augroup lualine_stl_refresh | exe "autocmd!" | augroup END]] )
480532 if not hide and (next (config .sections ) ~= nil or next (config .inactive_sections ) ~= nil ) then
481533 modules .nvim_opts .set (' statusline' , ' %#lualine_transparent#' , { global = true })
482534 if config .options .globalstatus then
@@ -489,6 +541,12 @@ local function set_statusline(hide)
489541 refresh { scope = ' window' , place = { ' statusline' }, trigger = ' timer' }
490542 end , 3 , ' lualine: Failed to refresh statusline' )
491543 )
544+ modules .utils .define_autocmd (
545+ table.concat (config .options .refresh .events , ' ,' ),
546+ ' *' ,
547+ " call v:lua.require'lualine'.refresh({'kind': 'window', 'place': ['statusline'], 'trigger': 'autocmd'})" ,
548+ ' lualine_stl_refresh'
549+ )
492550 else
493551 modules .nvim_opts .set (' laststatus' , 2 , { global = true })
494552 vim .loop .timer_start (
@@ -499,6 +557,13 @@ local function set_statusline(hide)
499557 refresh { scope = ' tabpage' , place = { ' statusline' }, trigger = ' timer' }
500558 end , 3 , ' lualine: Failed to refresh statusline' )
501559 )
560+
561+ modules .utils .define_autocmd (
562+ table.concat (config .options .refresh .events , ' ,' ),
563+ ' *' ,
564+ " call v:lua.require'lualine'.refresh({'kind': 'tabpage', 'place': ['statusline'], 'trigger': 'autocmd'})" ,
565+ ' lualine_stl_refresh'
566+ )
502567 end
503568 timers .halt_stl_refresh = false
504569 vim .schedule (function ()
524589local function set_winbar (hide )
525590 vim .loop .timer_stop (timers .wb_timer )
526591 timers .halt_wb_refresh = true
592+ vim .cmd ([[ augroup lualine_wb_refresh | exe "autocmd!" | augroup END]] )
527593 if not hide and (next (config .winbar ) ~= nil or next (config .inactive_winbar ) ~= nil ) then
528594 vim .loop .timer_start (
529595 timers .wb_timer ,
@@ -533,6 +599,13 @@ local function set_winbar(hide)
533599 refresh { scope = ' tabpage' , place = { ' winbar' }, trigger = ' timer' }
534600 end , 3 , ' lualine: Failed to refresh winbar' )
535601 )
602+ modules .utils .define_autocmd (
603+ table.concat (config .options .refresh .events , ' ,' ),
604+ ' *' ,
605+ " call v:lua.require'lualine'.refresh({'kind': 'tabpage', 'place': ['winbar'], 'trigger': 'autocmd'})" ,
606+ ' lualine_wb_refresh'
607+ )
608+
536609 timers .halt_wb_refresh = false
537610 vim .schedule (function ()
538611 -- imediately refresh upon load.
@@ -590,6 +663,7 @@ can use older compatible versions of lualine using compat tags like
590663 return false
591664end
592665
666+
593667-- lualine.setup function
594668--- sets new user config
595669--- This function doesn't load components/theme etc... They are done before
@@ -613,6 +687,7 @@ local function setup(user_config)
613687 set_statusline ()
614688 set_tabline ()
615689 set_winbar ()
690+ set_refresh_checker ()
616691 end
617692 if package.loaded [' lualine.utils.notices' ] then
618693 modules .utils_notices .notice_message_startup ()
0 commit comments