diff --git a/src/nvim/fold.c b/src/nvim/fold.c index 13329040e1..bdf2e26ac6 100644 --- a/src/nvim/fold.c +++ b/src/nvim/fold.c @@ -771,7 +771,7 @@ void clearFolding(win_T *win) /// The changes in lines from top to bot (inclusive). void foldUpdate(win_T *wp, linenr_T top, linenr_T bot) { - if (disable_fold_update || State & MODE_INSERT) { + if (disable_fold_update || (State & MODE_INSERT && !foldmethodIsIndent(wp))) { return; } diff --git a/test/functional/editor/fold_spec.lua b/test/functional/editor/fold_spec.lua index 0ed9d1ba80..424ce839a2 100644 --- a/test/functional/editor/fold_spec.lua +++ b/test/functional/editor/fold_spec.lua @@ -7,6 +7,7 @@ local expect = helpers.expect local command = helpers.command local funcs = helpers.funcs local eq = helpers.eq +local neq = helpers.neq describe('Folds', function() local tempfname = 'Xtest-fold.txt' @@ -417,4 +418,31 @@ a]], '13m7') eq(1, funcs.foldlevel(1)) eq(1, funcs.foldlevel(2)) end) + + it("doesn't open folds with indent method when inserting lower foldlevel line", function() + insert([[ + insert an unindented line under this line + keep the lines under this line folded + keep this line folded 1 + keep this line folded 2 + ]]) + command('set foldmethod=indent shiftwidth=2 noautoindent') + eq(1, funcs.foldlevel(1)) + eq(1, funcs.foldlevel(2)) + eq(2, funcs.foldlevel(3)) + eq(2, funcs.foldlevel(4)) + + feed('zo') -- open the outer fold + neq(-1, funcs.foldclosed(3)) -- make sure the inner fold is not open + + feed('gg0oa') -- insert unindented line + + eq(1, funcs.foldlevel(1)) --| insert an unindented line under this line + eq(0, funcs.foldlevel(2)) --|a + eq(1, funcs.foldlevel(3)) --| keep the lines under this line folded + eq(2, funcs.foldlevel(4)) --| keep this line folded 1 + eq(2, funcs.foldlevel(5)) --| keep this line folded 2 + + neq(-1, funcs.foldclosed(4)) -- make sure the inner fold is still not open + end) end)