@@ -17,6 +17,7 @@ local timers = {
17
17
stl_timer = vim .loop .new_timer (),
18
18
tal_timer = vim .loop .new_timer (),
19
19
wb_timer = vim .loop .new_timer (),
20
+ refresh_check_timer = vim .loop .new_timer (),
20
21
halt_stl_refresh = false , -- mutex ?
21
22
halt_tal_refresh = false ,
22
23
halt_wb_refresh = false ,
@@ -333,6 +334,13 @@ local function should_ignore_focus(user_config, win)
333
334
end
334
335
end
335
336
337
+ local refresh_event_queue = {
338
+ has_events = false ,
339
+ statusline = {},
340
+ tabline = {},
341
+ winbar = {},
342
+ }
343
+
336
344
--- @alias LualineRefreshOptsKind
337
345
--- | ' all'
338
346
--- | ' tabpage'
344
352
--- @class LualineRefreshOpts
345
353
--- @field scope LualineRefreshOptsKind
346
354
--- @field place LualineRefreshOptsPlace[]
347
- --- @field trigger ' timer' | ' init' | ' unknown'
355
+ --- @field trigger ' timer' | ' init' | ' autocmd' | ' unknown'
356
+ --- @field queued boolean
348
357
--- Refresh contents of lualine
349
358
--- @param opts LualineRefreshOpts
350
359
local function refresh (opts )
@@ -357,6 +366,14 @@ local function refresh(opts)
357
366
trigger = ' unknown' ,
358
367
})
359
368
369
+ if not opts .queued then
370
+ for _ , place in ipairs (opts .place ) do
371
+ refresh_event_queue [' has_events' ] = true
372
+ refresh_event_queue [place ] = vim .tbl_extend (' force' , opts , { place = { place }, queued = true })
373
+ end
374
+ return
375
+ end
376
+
360
377
local wins = {}
361
378
local old_actual_curwin = vim .g .actual_curwin
362
379
449
466
local function set_tabline (hide )
450
467
vim .loop .timer_stop (timers .tal_timer )
451
468
timers .halt_tal_refresh = true
469
+ vim .cmd ([[ augroup lualine_tal_refresh | exe "autocmd!" | augroup END]] )
452
470
if not hide and next (config .tabline ) ~= nil then
453
471
vim .loop .timer_start (
454
472
timers .tal_timer ,
@@ -458,6 +476,13 @@ local function set_tabline(hide)
458
476
refresh { scope = ' tabpage' , place = { ' tabline' }, trigger = ' timer' }
459
477
end , 3 , ' lualine: Failed to refresh tabline' )
460
478
)
479
+ modules .utils .define_autocmd (
480
+ table.concat (config .options .refresh .events , ' ,' ),
481
+ ' *' ,
482
+ " call v:lua.require'lualine'.refresh({'kind': 'tabpage', 'place': ['tabline'], 'trigger': 'autocmd'})" ,
483
+ ' lualine_tal_refresh'
484
+ )
485
+
461
486
modules .nvim_opts .set (' showtabline' , config .options .always_show_tabline and 2 or 1 , { global = true })
462
487
timers .halt_tal_refresh = false
463
488
vim .schedule (function ()
@@ -471,12 +496,43 @@ local function set_tabline(hide)
471
496
end
472
497
end
473
498
499
+ local function check_refresh ()
500
+ if not refresh_event_queue .has_events then
501
+ return
502
+ end
503
+ refresh_event_queue .has_events = nil
504
+
505
+ for place , refresh_cmd in pairs (refresh_event_queue ) do
506
+ if type (refresh_cmd ) == ' table' and refresh_cmd .queued == true then
507
+ refresh (refresh_cmd )
508
+ refresh_event_queue [place ] = {}
509
+ end
510
+ end
511
+ end
512
+
513
+ local function set_refresh_checker ()
514
+ vim .loop .timer_stop (timers .refresh_check_timer )
515
+ vim .loop .timer_start (
516
+ timers .refresh_check_timer ,
517
+ 0 ,
518
+ config .options .refresh .check ,
519
+ modules .utils .timer_call (
520
+ timers .refresh_check_timer ,
521
+ ' lualine_refresh_check' ,
522
+ check_refresh ,
523
+ 3 ,
524
+ ' lualine: Failed to refresh statusline'
525
+ )
526
+ )
527
+ end
528
+
474
529
--- Sets &statusline option to lualine
475
530
--- adds auto command to redraw lualine on VimResized event
476
531
--- @param hide boolean | nil if should hide statusline
477
532
local function set_statusline (hide )
478
533
vim .loop .timer_stop (timers .stl_timer )
479
534
timers .halt_stl_refresh = true
535
+ vim .cmd ([[ augroup lualine_stl_refresh | exe "autocmd!" | augroup END]] )
480
536
if not hide and (next (config .sections ) ~= nil or next (config .inactive_sections ) ~= nil ) then
481
537
modules .nvim_opts .set (' statusline' , ' %#lualine_transparent#' , { global = true })
482
538
if config .options .globalstatus then
@@ -489,6 +545,12 @@ local function set_statusline(hide)
489
545
refresh { scope = ' window' , place = { ' statusline' }, trigger = ' timer' }
490
546
end , 3 , ' lualine: Failed to refresh statusline' )
491
547
)
548
+ modules .utils .define_autocmd (
549
+ table.concat (config .options .refresh .events , ' ,' ),
550
+ ' *' ,
551
+ " call v:lua.require'lualine'.refresh({'kind': 'window', 'place': ['statusline'], 'trigger': 'autocmd'})" ,
552
+ ' lualine_stl_refresh'
553
+ )
492
554
else
493
555
modules .nvim_opts .set (' laststatus' , 2 , { global = true })
494
556
vim .loop .timer_start (
@@ -499,6 +561,13 @@ local function set_statusline(hide)
499
561
refresh { scope = ' tabpage' , place = { ' statusline' }, trigger = ' timer' }
500
562
end , 3 , ' lualine: Failed to refresh statusline' )
501
563
)
564
+
565
+ modules .utils .define_autocmd (
566
+ table.concat (config .options .refresh .events , ' ,' ),
567
+ ' *' ,
568
+ " call v:lua.require'lualine'.refresh({'kind': 'tabpage', 'place': ['statusline'], 'trigger': 'autocmd'})" ,
569
+ ' lualine_stl_refresh'
570
+ )
502
571
end
503
572
timers .halt_stl_refresh = false
504
573
vim .schedule (function ()
524
593
local function set_winbar (hide )
525
594
vim .loop .timer_stop (timers .wb_timer )
526
595
timers .halt_wb_refresh = true
596
+ vim .cmd ([[ augroup lualine_wb_refresh | exe "autocmd!" | augroup END]] )
527
597
if not hide and (next (config .winbar ) ~= nil or next (config .inactive_winbar ) ~= nil ) then
528
598
vim .loop .timer_start (
529
599
timers .wb_timer ,
@@ -533,6 +603,13 @@ local function set_winbar(hide)
533
603
refresh { scope = ' tabpage' , place = { ' winbar' }, trigger = ' timer' }
534
604
end , 3 , ' lualine: Failed to refresh winbar' )
535
605
)
606
+ modules .utils .define_autocmd (
607
+ table.concat (config .options .refresh .events , ' ,' ),
608
+ ' *' ,
609
+ " call v:lua.require'lualine'.refresh({'kind': 'tabpage', 'place': ['winbar'], 'trigger': 'autocmd'})" ,
610
+ ' lualine_wb_refresh'
611
+ )
612
+
536
613
timers .halt_wb_refresh = false
537
614
vim .schedule (function ()
538
615
-- imediately refresh upon load.
@@ -613,6 +690,7 @@ local function setup(user_config)
613
690
set_statusline ()
614
691
set_tabline ()
615
692
set_winbar ()
693
+ set_refresh_checker ()
616
694
end
617
695
if package.loaded [' lualine.utils.notices' ] then
618
696
modules .utils_notices .notice_message_startup ()
0 commit comments