diff options
| author | Jaehwang Jung <tomtomjhj@gmail.com> | 2025-12-21 14:47:46 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-12-21 00:47:46 -0500 |
| commit | 756e1eb017aa5fe7fae409ede3d50ecebe785e7f (patch) | |
| tree | 31be28c2cd6ab03e1ea176c6f561cddcc0c7af69 /runtime/lua/vim/treesitter/_fold.lua | |
| parent | 0d206da461f9345eeeba54bdea6afcfed52da6e7 (diff) | |
| download | rneovim-756e1eb017aa5fe7fae409ede3d50ecebe785e7f.tar.gz rneovim-756e1eb017aa5fe7fae409ede3d50ecebe785e7f.tar.bz2 rneovim-756e1eb017aa5fe7fae409ede3d50ecebe785e7f.zip | |
fix(treesitter.foldexpr): duplicate callbacks #37048
Problem:
VimEnter clears foldinfo, so register_cbs is called again after
VimEnter. The duplicate parser callbacks break incremental fold
computation.
Solution:
Check if the callbacks are already registered.
Diffstat (limited to 'runtime/lua/vim/treesitter/_fold.lua')
| -rw-r--r-- | runtime/lua/vim/treesitter/_fold.lua | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/runtime/lua/vim/treesitter/_fold.lua b/runtime/lua/vim/treesitter/_fold.lua index 8997341233..22031b735c 100644 --- a/runtime/lua/vim/treesitter/_fold.lua +++ b/runtime/lua/vim/treesitter/_fold.lua @@ -381,6 +381,8 @@ local function on_bytes(bufnr, start_row, start_col, old_row, old_col, new_row, end end +local registered_cbs = {} ---@type table<integer, boolean> + ---@param lnum integer|nil ---@return string function M.foldexpr(lnum) @@ -404,19 +406,36 @@ function M.foldexpr(lnum) compute_folds_levels(bufnr, foldinfos[bufnr]) - parser:register_cbs({ - on_changedtree = function(tree_changes) - on_changedtree(bufnr, tree_changes) - end, - - on_bytes = function(_, _, start_row, start_col, _, old_row, old_col, _, new_row, new_col, _) - on_bytes(bufnr, start_row, start_col, old_row, old_col, new_row, new_col) - end, - - on_detach = function() - foldinfos[bufnr] = nil - end, - }) + if not registered_cbs[bufnr] then + parser:register_cbs({ + on_changedtree = function(tree_changes) + on_changedtree(bufnr, tree_changes) + end, + + on_bytes = function( + _, + _, + start_row, + start_col, + _, + old_row, + old_col, + _, + new_row, + new_col, + _ + ) + on_bytes(bufnr, start_row, start_col, old_row, old_col, new_row, new_col) + end, + + on_detach = function() + foldinfos[bufnr] = nil + registered_cbs[bufnr] = nil + end, + }) + + registered_cbs[bufnr] = true + end end return foldinfos[bufnr].levels[lnum] or '0' |