fix(autoread): handle autocmd errors

Problem:
Any random ftplugin or other autocmd, can throw an error when
`:checktime` reloads a buffer. This causes a trace which makes it look
like an issue with `autoread.lua`.

    vim.schedule callback: …/runtime/lua/nvim/autoread.lua:146:
    FileType Autocommands for "*"..function <SNR>1_LoadFTPlugin[20] ..script
    …/runtime/ftplugin/help.lua: Vim(runtime):E5113: Lua chunk:
    …/runtime/lua/vim/treesitter.lua:216: Index out of bounds
    stack traceback:
    [C]: in function 'nvim_buf_get_text'
    …/runtime/lua/vim/treesitter.lua:216: in function 'get_node_text'
    …/runtime/lua/vim/treesitter/query.lua:558: in function 'handler'
    …/runtime/lua/vim/treesitter/query.lua:843: in function '_match_predicates'
    …/runtime/lua/vim/treesitter/query.lua:1082: in function '(for generator)'
    …/runtime/ftplugin/help.lua:91: in function 'runnables'
    …/runtime/ftplugin/help.lua:124: in main chunk
    [C]: in function 'checktime'
    …/runtime/lua/nvim/autoread.lua:146: in function <…/runtime/lua/nvim/autoread.lua:138>

Solution:
Use pcall() and surface the error via nvim_echo.
This commit is contained in:
Justin M. Keyes
2026-06-14 20:20:45 +02:00
parent 2abb9785d3
commit d34cfe1cb8
2 changed files with 27 additions and 1 deletions

View File

@@ -140,13 +140,19 @@ local function ensure_watcher(bufnr)
set_pending(bufnr, false)
return
end
vim.cmd.checktime(bufnr)
-- Use pcall: autocmds (e.g. ftplugin) may throw during reload for any reason.
local ok, err = pcall(vim.cmd.checktime, bufnr) ---@type any, any
set_pending(bufnr, false)
-- On rename events (e.g. atomic save by another editor), the watcher
-- is now stale (watching the old inode). Re-establish it.
if change_type ~= watch.FileChangeType.Changed then
ensure_watcher(bufnr)
end
if not ok then
vim.api.nvim_echo({
{ ('autoread: :checktime failed for buffer %d: %s'):format(bufnr, err) },
}, true, { err = true })
end
end)
end)
end)