4646--- @class ChunkMod : BaseMod
4747--- @field conf ChunkConf
4848--- @field meta ChunkMetaInfo
49- --- @field render fun ( self : ChunkMod , range : Scope , opts ?: { error : boolean })
49+ --- @field render fun ( self : ChunkMod , range : Scope , opts ?: { error : boolean , lazy : boolean })
5050--- @overload fun ( conf ?: UserChunkConf , meta ?: MetaInfo ): ChunkMod
5151local ChunkMod = class (BaseMod , constructor )
5252
@@ -120,7 +120,7 @@ function ChunkMod:get_chunk_data(range, virt_text_list, row_list, virt_text_win_
120120end
121121
122122function ChunkMod :render (range , opts )
123- opts = opts or { error = false }
123+ opts = opts or { error = false , lazy = false }
124124 if not self :shouldRender (range .bufnr ) then
125125 return
126126 end
@@ -131,7 +131,8 @@ function ChunkMod:render(range, opts)
131131 self :get_chunk_data (range , virt_text_list , row_list , virt_text_win_col_list )
132132
133133 if
134- shallowCmp (virt_text_list , self .meta .pre_virt_text_list )
134+ opts .lazy
135+ and shallowCmp (virt_text_list , self .meta .pre_virt_text_list )
135136 and shallowCmp (row_list , self .meta .pre_row_list )
136137 and shallowCmp (virt_text_win_col_list , self .meta .pre_virt_text_win_col_list )
137138 and self .meta .pre_is_error == opts .error
@@ -149,7 +150,7 @@ function ChunkMod:render(range, opts)
149150 priority = 100 ,
150151 }
151152 local text_hl = opts .error and " HLChunk2" or " HLChunk1"
152- if self .conf .delay == 0 then
153+ if self .conf .delay == 0 or opts . lazy == false then
153154 for i , vt in ipairs (virt_text_list ) do
154155 row_opts .virt_text = { { vt , text_hl } }
155156 row_opts .virt_text_win_col = virt_text_win_col_list [i ]
169170
170171function ChunkMod :createAutocmd ()
171172 BaseMod .createAutocmd (self )
172- local render_cb = function (event )
173+ local render_cb = function (event , opts )
173174 local bufnr = event .buf
174175 local winid = api .nvim_get_current_win ()
175176 local pos = api .nvim_win_get_cursor (winid )
@@ -183,31 +184,36 @@ function ChunkMod:createAutocmd()
183184 self .meta .leftcol = fn .winsaveview ().leftcol
184185 end )
185186 if ret_code == CHUNK_RANGE_RET .OK then
186- self :render (range , { error = false })
187+ self :render (range , { error = false , lazy = opts . lazy })
187188 elseif ret_code == CHUNK_RANGE_RET .NO_CHUNK then
188189 self :clear (Scope (bufnr , 0 , api .nvim_buf_line_count (bufnr )))
189190 self :updatePreState ({}, {}, {}, false )
190191 elseif ret_code == CHUNK_RANGE_RET .CHUNK_ERR then
191- self :render (range , { error = self .conf .error_sign })
192+ self :render (range , { error = self .conf .error_sign , lazy = opts . lazy })
192193 elseif ret_code == CHUNK_RANGE_RET .NO_TS then
193194 self :notify (" [hlchunk.chunk]: no parser for " .. vim .bo [bufnr ].ft , nil , { once = true })
194195 end
195196 end
196197 local debounce_render_cb = debounce (render_cb , self .conf .delay )
197- local debounce_render_cb_with_pre_hook = function (event )
198+ local debounce_render_cb_with_pre_hook = function (event , opts )
199+ opts = opts or { lazy = false }
198200 local bufnr = event .buf
199201 if not (api .nvim_buf_is_valid (bufnr ) and self :shouldRender (bufnr )) then
200202 return
201203 end
202- debounce_render_cb (event )
204+ debounce_render_cb (event , opts )
203205 end
204206 api .nvim_create_autocmd ({ " CursorMovedI" , " CursorMoved" }, {
205207 group = self .meta .augroup_name ,
206- callback = debounce_render_cb_with_pre_hook ,
208+ callback = function (e )
209+ debounce_render_cb_with_pre_hook (e , { lazy = true })
210+ end ,
207211 })
208212 api .nvim_create_autocmd ({ " TextChangedI" , " TextChanged" }, {
209213 group = self .meta .augroup_name ,
210- callback = debounce_render_cb_with_pre_hook ,
214+ callback = function (e )
215+ debounce_render_cb_with_pre_hook (e , { lazy = false })
216+ end ,
211217 })
212218 api .nvim_create_autocmd ({ " UIEnter" , " BufWinEnter" }, {
213219 group = self .meta .augroup_name ,
0 commit comments