@@ -17,11 +17,13 @@ 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 ,
23
24
}
24
25
26
+
25
27
local last_focus = {}
26
28
local refresh_real_curwin
27
29
@@ -333,6 +335,13 @@ local function should_ignore_focus(user_config, win)
333
335
end
334
336
end
335
337
338
+ local refresh_event_queue = {
339
+ has_events = false ,
340
+ statusline = {},
341
+ tabline = {},
342
+ winbar = {},
343
+ }
344
+
336
345
--- @alias LualineRefreshOptsKind
337
346
--- | ' all'
338
347
--- | ' tabpage'
344
353
--- @class LualineRefreshOpts
345
354
--- @field scope LualineRefreshOptsKind
346
355
--- @field place LualineRefreshOptsPlace[]
347
- --- @field trigger ' timer' | ' init' | ' unknown'
356
+ --- @field trigger ' timer' | ' init' | ' autocmd' | ' unknown'
357
+ --- @field queued boolean
348
358
--- Refresh contents of lualine
349
359
--- @param opts LualineRefreshOpts
350
360
local function refresh (opts )
@@ -357,6 +367,15 @@ local function refresh(opts)
357
367
trigger = ' unknown' ,
358
368
})
359
369
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
+
360
379
local wins = {}
361
380
local old_actual_curwin = vim .g .actual_curwin
362
381
449
468
local function set_tabline (hide )
450
469
vim .loop .timer_stop (timers .tal_timer )
451
470
timers .halt_tal_refresh = true
471
+ vim .cmd ([[ augroup lualine_tal_refresh | exe "autocmd!" | augroup END]] )
452
472
if not hide and next (config .tabline ) ~= nil then
453
473
vim .loop .timer_start (
454
474
timers .tal_timer ,
@@ -458,6 +478,13 @@ local function set_tabline(hide)
458
478
refresh { scope = ' tabpage' , place = { ' tabline' }, trigger = ' timer' }
459
479
end , 3 , ' lualine: Failed to refresh tabline' )
460
480
)
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
+
461
488
modules .nvim_opts .set (' showtabline' , config .options .always_show_tabline and 2 or 1 , { global = true })
462
489
timers .halt_tal_refresh = false
463
490
vim .schedule (function ()
@@ -471,12 +498,37 @@ local function set_tabline(hide)
471
498
end
472
499
end
473
500
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
+
474
525
--- Sets &statusline option to lualine
475
526
--- adds auto command to redraw lualine on VimResized event
476
527
--- @param hide boolean | nil if should hide statusline
477
528
local function set_statusline (hide )
478
529
vim .loop .timer_stop (timers .stl_timer )
479
530
timers .halt_stl_refresh = true
531
+ vim .cmd ([[ augroup lualine_stl_refresh | exe "autocmd!" | augroup END]] )
480
532
if not hide and (next (config .sections ) ~= nil or next (config .inactive_sections ) ~= nil ) then
481
533
modules .nvim_opts .set (' statusline' , ' %#lualine_transparent#' , { global = true })
482
534
if config .options .globalstatus then
@@ -489,6 +541,12 @@ local function set_statusline(hide)
489
541
refresh { scope = ' window' , place = { ' statusline' }, trigger = ' timer' }
490
542
end , 3 , ' lualine: Failed to refresh statusline' )
491
543
)
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
+ )
492
550
else
493
551
modules .nvim_opts .set (' laststatus' , 2 , { global = true })
494
552
vim .loop .timer_start (
@@ -499,6 +557,13 @@ local function set_statusline(hide)
499
557
refresh { scope = ' tabpage' , place = { ' statusline' }, trigger = ' timer' }
500
558
end , 3 , ' lualine: Failed to refresh statusline' )
501
559
)
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
+ )
502
567
end
503
568
timers .halt_stl_refresh = false
504
569
vim .schedule (function ()
524
589
local function set_winbar (hide )
525
590
vim .loop .timer_stop (timers .wb_timer )
526
591
timers .halt_wb_refresh = true
592
+ vim .cmd ([[ augroup lualine_wb_refresh | exe "autocmd!" | augroup END]] )
527
593
if not hide and (next (config .winbar ) ~= nil or next (config .inactive_winbar ) ~= nil ) then
528
594
vim .loop .timer_start (
529
595
timers .wb_timer ,
@@ -533,6 +599,13 @@ local function set_winbar(hide)
533
599
refresh { scope = ' tabpage' , place = { ' winbar' }, trigger = ' timer' }
534
600
end , 3 , ' lualine: Failed to refresh winbar' )
535
601
)
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
+
536
609
timers .halt_wb_refresh = false
537
610
vim .schedule (function ()
538
611
-- imediately refresh upon load.
@@ -590,6 +663,7 @@ can use older compatible versions of lualine using compat tags like
590
663
return false
591
664
end
592
665
666
+
593
667
-- lualine.setup function
594
668
--- sets new user config
595
669
--- This function doesn't load components/theme etc... They are done before
@@ -613,6 +687,7 @@ local function setup(user_config)
613
687
set_statusline ()
614
688
set_tabline ()
615
689
set_winbar ()
690
+ set_refresh_checker ()
616
691
end
617
692
if package.loaded [' lualine.utils.notices' ] then
618
693
modules .utils_notices .notice_message_startup ()
0 commit comments