diff options
-rw-r--r-- | src/nvim/fold.c | 6 | ||||
-rw-r--r-- | test/old/testdir/test_fold.vim | 21 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/nvim/fold.c b/src/nvim/fold.c index c8e6a25dbc..e7231c31ab 100644 --- a/src/nvim/fold.c +++ b/src/nvim/fold.c @@ -1336,6 +1336,9 @@ void deleteFoldRecurse(buf_T *bp, garray_T *gap) // foldMarkAdjust() {{{2 /// Update line numbers of folds for inserted/deleted lines. +/// +/// We are adjusting the folds in the range from line1 til line2, +/// make sure that line2 does not get smaller than line1 void foldMarkAdjust(win_T *wp, linenr_T line1, linenr_T line2, linenr_T amount, linenr_T amount_after) { @@ -1344,6 +1347,9 @@ void foldMarkAdjust(win_T *wp, linenr_T line1, linenr_T line2, linenr_T amount, if (amount == MAXLNUM && line2 >= line1 && line2 - line1 >= -amount_after) { line2 = line1 - amount_after - 1; } + if (line2 < line1) { + line2 = line1; + } // If appending a line in Insert mode, it should be included in the fold // just above the line. if ((State & MODE_INSERT) && amount == 1 && line2 == MAXLNUM) { diff --git a/test/old/testdir/test_fold.vim b/test/old/testdir/test_fold.vim index a0eb3afdbb..6569e032f6 100644 --- a/test/old/testdir/test_fold.vim +++ b/test/old/testdir/test_fold.vim @@ -1756,4 +1756,25 @@ func Test_cursor_down_fold_eob() bwipe! endfunc +" issue: #15455 +func Test_cursor_fold_marker_undo() + new + call setline(1, ['{{{', '', 'This is a Line', '', 'This is a Line', '', '}}}']) + let &ul=&ul + setl foldmethod=marker + call cursor(2, 1) + norm! zo1vjdu + call assert_equal(1, foldlevel('.')) + bwipe! + new + call setline(1, ['', '{{{', '', 'This is a Line', '', 'This is a Line', '', '}}}']) + let &ul=&ul + setl foldmethod=marker + call cursor(3, 1) + norm! zo + norm! vjdu + call assert_equal(1, foldlevel('.')) + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab |