feat(compiler): debounce compilation in toggle mode (#8)
Problem: in toggle mode, each BufWritePost immediately spawned a new compilation, killing any in-flight process. Rapid saves wasted cycles on compilers like latexmk. Solution: add a 500ms debounce timer per buffer. The BufWritePost callback starts/restarts the timer instead of compiling immediately. Timers are cleaned up on unwatch and BufWipeout.
This commit is contained in:
parent
bf2f4a78e2
commit
b00b169bf5
1 changed files with 23 additions and 2 deletions
|
|
@ -15,6 +15,10 @@ local opened = {}
|
||||||
---@type table<integer, string>
|
---@type table<integer, string>
|
||||||
local last_output = {}
|
local last_output = {}
|
||||||
|
|
||||||
|
local debounce_timers = {}
|
||||||
|
|
||||||
|
local DEBOUNCE_MS = 500
|
||||||
|
|
||||||
---@param val string[]|fun(ctx: preview.Context): string[]
|
---@param val string[]|fun(ctx: preview.Context): string[]
|
||||||
---@param ctx preview.Context
|
---@param ctx preview.Context
|
||||||
---@return string[]
|
---@return string[]
|
||||||
|
|
@ -179,8 +183,19 @@ function M.toggle(bufnr, name, provider, ctx_builder)
|
||||||
local au_id = vim.api.nvim_create_autocmd('BufWritePost', {
|
local au_id = vim.api.nvim_create_autocmd('BufWritePost', {
|
||||||
buffer = bufnr,
|
buffer = bufnr,
|
||||||
callback = function()
|
callback = function()
|
||||||
local ctx = ctx_builder(bufnr)
|
if debounce_timers[bufnr] then
|
||||||
M.compile(bufnr, name, provider, ctx)
|
debounce_timers[bufnr]:stop()
|
||||||
|
else
|
||||||
|
debounce_timers[bufnr] = vim.uv.new_timer()
|
||||||
|
end
|
||||||
|
debounce_timers[bufnr]:start(
|
||||||
|
DEBOUNCE_MS,
|
||||||
|
0,
|
||||||
|
vim.schedule_wrap(function()
|
||||||
|
local ctx = ctx_builder(bufnr)
|
||||||
|
M.compile(bufnr, name, provider, ctx)
|
||||||
|
end)
|
||||||
|
)
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -206,6 +221,11 @@ function M.unwatch(bufnr)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
vim.api.nvim_del_autocmd(au_id)
|
vim.api.nvim_del_autocmd(au_id)
|
||||||
|
if debounce_timers[bufnr] then
|
||||||
|
debounce_timers[bufnr]:stop()
|
||||||
|
debounce_timers[bufnr]:close()
|
||||||
|
debounce_timers[bufnr] = nil
|
||||||
|
end
|
||||||
watching[bufnr] = nil
|
watching[bufnr] = nil
|
||||||
log.dbg('unwatched buffer %d', bufnr)
|
log.dbg('unwatched buffer %d', bufnr)
|
||||||
end
|
end
|
||||||
|
|
@ -275,6 +295,7 @@ M._test = {
|
||||||
watching = watching,
|
watching = watching,
|
||||||
opened = opened,
|
opened = opened,
|
||||||
last_output = last_output,
|
last_output = last_output,
|
||||||
|
debounce_timers = debounce_timers,
|
||||||
}
|
}
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue