fix(compiler): use BufDelete instead of BufUnload for cleanup
Problem: `:e` (edit/reload) fires `BufUnload`, which tears down the entire preview — process, watchers, and viewer — even though the user is just reloading the current buffer. Solution: Switch the cleanup autocmd from `BufUnload` to `BufDelete`, which only fires on `:bdelete` and `:bwipeout`. Guard `nvim_del_autocmd` calls with `pcall` in cleanup paths since buffer-local autocmds may already be gone when the buffer is wiped before `stop_watching` runs. Closes #57
This commit is contained in:
parent
535d4cfd5e
commit
a2edb9a499
1 changed files with 7 additions and 7 deletions
|
|
@ -16,7 +16,7 @@ local log = require('preview.log')
|
||||||
---@field has_errors? boolean
|
---@field has_errors? boolean
|
||||||
---@field debounce? uv.uv_timer_t
|
---@field debounce? uv.uv_timer_t
|
||||||
---@field bwp_autocmd? integer
|
---@field bwp_autocmd? integer
|
||||||
---@field unload_autocmd? integer
|
---@field cleanup_autocmd? integer
|
||||||
|
|
||||||
---@type table<integer, preview.BufState>
|
---@type table<integer, preview.BufState>
|
||||||
local state = {}
|
local state = {}
|
||||||
|
|
@ -189,7 +189,7 @@ local function stop_watching(bufnr, s)
|
||||||
close_viewer(bufnr)
|
close_viewer(bufnr)
|
||||||
s.viewer_open = nil
|
s.viewer_open = nil
|
||||||
if s.bwp_autocmd then
|
if s.bwp_autocmd then
|
||||||
vim.api.nvim_del_autocmd(s.bwp_autocmd)
|
pcall(vim.api.nvim_del_autocmd, s.bwp_autocmd)
|
||||||
s.bwp_autocmd = nil
|
s.bwp_autocmd = nil
|
||||||
end
|
end
|
||||||
if s.debounce then
|
if s.debounce then
|
||||||
|
|
@ -508,8 +508,8 @@ end
|
||||||
function M.stop_all()
|
function M.stop_all()
|
||||||
for bufnr, s in pairs(state) do
|
for bufnr, s in pairs(state) do
|
||||||
stop_watching(bufnr, s)
|
stop_watching(bufnr, s)
|
||||||
if s.unload_autocmd then
|
if s.cleanup_autocmd then
|
||||||
vim.api.nvim_del_autocmd(s.unload_autocmd)
|
pcall(vim.api.nvim_del_autocmd, s.cleanup_autocmd)
|
||||||
end
|
end
|
||||||
state[bufnr] = nil
|
state[bufnr] = nil
|
||||||
end
|
end
|
||||||
|
|
@ -541,10 +541,10 @@ function M.toggle(bufnr, name, provider, ctx_builder)
|
||||||
log.dbg('toggle on for buffer %d', bufnr)
|
log.dbg('toggle on for buffer %d', bufnr)
|
||||||
s.watching = true
|
s.watching = true
|
||||||
|
|
||||||
if s.unload_autocmd then
|
if s.cleanup_autocmd then
|
||||||
vim.api.nvim_del_autocmd(s.unload_autocmd)
|
vim.api.nvim_del_autocmd(s.cleanup_autocmd)
|
||||||
end
|
end
|
||||||
s.unload_autocmd = vim.api.nvim_create_autocmd('BufUnload', {
|
s.cleanup_autocmd = vim.api.nvim_create_autocmd('BufDelete', {
|
||||||
buffer = bufnr,
|
buffer = bufnr,
|
||||||
once = true,
|
once = true,
|
||||||
callback = function()
|
callback = function()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue