commit d73cfefed5e45fec91a422cd87054611ff711b30
parent 12b6f65283ce8beeaed9c97dad53a7db362cdbff
Author: tao <2471314@gmail.com>
Date: Fri, 22 Aug 2025 10:55:45 +0800
fix(folds): error when deleting lines at end of buffer #35396
Problem:
with `foldmethod=expr foldexpr=v:lua.vim.treesitter.foldexpr()
foldminlines=0`, deleting lines at the end of the buffer always
reports an invalid top error, because the top value (i.e. the
start line number of the deletion) is always 1 greater than
the total line number of the modified buffer.
Solution:
remove the ml_line_count validation
Diffstat:
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/src/nvim/lua/stdlib.c b/src/nvim/lua/stdlib.c
@@ -563,7 +563,7 @@ static int nlua_foldupdate(lua_State *lstate)
}
// input is zero-based end-exclusive range
linenr_T top = (linenr_T)luaL_checkinteger(lstate, 2) + 1;
- if (top < 1 || top > win->w_buffer->b_ml.ml_line_count) {
+ if (top < 1) {
return luaL_error(lstate, "invalid top");
}
linenr_T bot = (linenr_T)luaL_checkinteger(lstate, 3);
diff --git a/test/functional/treesitter/fold_spec.lua b/test/functional/treesitter/fold_spec.lua
@@ -832,4 +832,16 @@ t2]])
command('set ft=c')
eq(foldlevels, get_fold_levels())
end)
+
+ it('no error when deleting lines at end of buffer with fml=0', function()
+ local screen = Screen.new(40, 2)
+ insert('hello')
+ parse('markdown')
+ command('set foldmethod=expr foldexpr=v:lua.vim.treesitter.foldexpr() foldminlines=0')
+ feed('o<Esc>dd')
+ screen:expect([[
+ ^hello |
+ |
+ ]])
+ end)
end)