@@ -16,27 +16,29 @@ function M.init(enable)
1616 highlight = ' ScrollViewTrail' ,
1717 priority = vim .g .scrollview_trail_priority ,
1818 symbol = vim .g .scrollview_trail_symbol ,
19- type = ' w' ,
2019 })
2120 local name = registration .name
2221 scrollview .set_sign_group_state (group , enable )
2322
2423 scrollview .set_sign_group_callback (group , function ()
24+ -- Track visited buffers, to prevent duplicate computation when multiple
25+ -- windows are showing the same buffer.
26+ local visited = {}
2527 for _ , winid in ipairs (scrollview .get_sign_eligible_windows ()) do
26- local winvars = vim . w [ winid ]
28+ local bufnr = api . nvim_win_get_buf ( winid )
2729 -- Don't update when in insert mode. This way, pressing 'o' to start a
2830 -- new line won't trigger a new sign when there is indentation.
2931 local mode = api .nvim_win_call (winid , fn .mode )
30- if mode ~= ' i' then
32+ if not visited [bufnr ] and mode ~= ' i' then
33+ local bufvars = vim .b [bufnr ]
3134 local lines = {}
32- local bufnr = api .nvim_win_get_buf (winid )
3335 local changedtick = vim .b [bufnr ].changedtick
34- local changedtick_cached = winvars .scrollview_trail_changedtick_cached
35- local bufnr_cached = winvars .scrollview_trail_bufnr_cached
36+ local changedtick_cached = bufvars .scrollview_trail_changedtick_cached
37+ local bufnr_cached = bufvars .scrollview_trail_bufnr_cached
3638 local cache_hit = changedtick_cached == changedtick
3739 and bufnr_cached == bufnr
3840 if cache_hit then
39- lines = winvars .scrollview_trail_cached
41+ lines = bufvars .scrollview_trail_cached
4042 else
4143 local line_count = api .nvim_buf_line_count (bufnr )
4244 for line = 1 , line_count do
@@ -46,14 +48,15 @@ function M.init(enable)
4648 end
4749 end
4850 -- luacheck: ignore 122 (setting read-only field w.?.? of global vim)
49- winvars .scrollview_trail_changedtick_cached = changedtick
51+ bufvars .scrollview_trail_changedtick_cached = changedtick
5052 -- luacheck: ignore 122 (setting read-only field w.?.? of global vim)
51- winvars .scrollview_trail_bufnr_cached = bufnr
53+ bufvars .scrollview_trail_bufnr_cached = bufnr
5254 -- luacheck: ignore 122 (setting read-only field w.?.? of global vim)
53- winvars .scrollview_trail_cached = lines
55+ bufvars .scrollview_trail_cached = lines
5456 end
5557 -- luacheck: ignore 122 (setting read-only field w.?.? of global vim)
56- winvars [name ] = lines
58+ bufvars [name ] = lines
59+ visited [bufnr ] = true
5760 end
5861 end
5962 end )
0 commit comments