diff --git a/src/fold.c b/src/fold.c index 2cd4dcd58..3353cc55f 100644 --- a/src/fold.c +++ b/src/fold.c @@ -1492,6 +1492,9 @@ deleteFoldRecurse(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( @@ -1505,6 +1508,8 @@ foldMarkAdjust( // lines, set line2 so that only deleted lines have their folds removed. 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 == (linenr_T)1 && line2 == MAXLNUM) diff --git a/src/testdir/test_fold.vim b/src/testdir/test_fold.vim index 7fb004331..17487a561 100644 --- a/src/testdir/test_fold.vim +++ b/src/testdir/test_fold.vim @@ -1928,4 +1928,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 diff --git a/src/version.c b/src/version.c index ef1ffb0ae..159357e21 100644 --- a/src/version.c +++ b/src/version.c @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 672, /**/ 671, /**/