summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Brabandt <cb@256bit.org>2024-08-11 20:12:41 +0200
committerChristian Brabandt <cb@256bit.org>2024-08-11 20:12:41 +0200
commit8d02e5cf961b06da5bc490ac5972bcbc252c4793 (patch)
tree64bd0e437d2b8b5aa73d8e41ed65249cbc057896
parentfb3f9699362f8d51c3b48fcaea1eb2ed16c81454 (diff)
patch 9.1.0672: marker folds may get corrupted on undov9.1.0672
Problem: marker folds may get corrupted on undo (Yousef Mohammed) Solution: when adjusting folds, make sure that line1 is the lower limit and line2 is the upper line limit. In particular, line2 should not be able to get smaller than line1. fixes: #15455 closes: #15466 Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r--src/fold.c5
-rw-r--r--src/testdir/test_fold.vim21
-rw-r--r--src/version.c2
3 files changed, 28 insertions, 0 deletions
diff --git a/src/fold.c b/src/fold.c
index 2cd4dcd580..3353cc55fe 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 7fb0043311..17487a561e 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 ef1ffb0aeb..159357e21b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 672,
+/**/
671,
/**/
670,