changeset 35945:082327519af9 v9.1.0672

patch 9.1.0672: marker folds may get corrupted on undo Commit: https://github.com/vim/vim/commit/8d02e5cf961b06da5bc490ac5972bcbc252c4793 Author: Christian Brabandt <cb@256bit.org> Date: Sun Aug 11 20:12:41 2024 +0200 patch 9.1.0672: marker folds may get corrupted on undo 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>
author Christian Brabandt <cb@256bit.org>
date Sun, 11 Aug 2024 20:15:06 +0200
parents e0e4d42f19ad
children ffdfc68e4e63
files src/fold.c src/testdir/test_fold.vim src/version.c
diffstat 3 files changed, 28 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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)
--- 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
--- 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,