changeset 28929:2ac9beab876c v8.2.4987

patch 8.2.4987: after deletion a small fold may be closable Commit: https://github.com/vim/vim/commit/3fcccf94e8bc142d2c79c3b62087145896df6b36 Author: Brandon Simmons <simmsbra@gmail.com> Date: Fri May 20 18:25:21 2022 +0100 patch 8.2.4987: after deletion a small fold may be closable Problem: After deletion a small fold may be closable. Solution: Check for a reverse range. (Brandon Simmons, closes https://github.com/vim/vim/issues/10457)
author Bram Moolenaar <Bram@vim.org>
date Fri, 20 May 2022 19:30:06 +0200
parents 2a1a2ef75494
children 6e65441d09a5
files src/fold.c src/testdir/test_fold.vim src/version.c
diffstat 3 files changed, 43 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/fold.c
+++ b/src/fold.c
@@ -829,10 +829,18 @@ foldUpdate(win_T *wp, linenr_T top, line
 
     if (wp->w_folds.ga_len > 0)
     {
-	// Mark all folds from top to bot as maybe-small.
-	(void)foldFind(&wp->w_folds, top, &fp);
+	linenr_T	maybe_small_start = top;
+	linenr_T	maybe_small_end = bot;
+
+	// Mark all folds from top to bot (or bot to top) as maybe-small.
+	if (top > bot)
+	{
+	    maybe_small_start = bot;
+	    maybe_small_end = top;
+	}
+	(void)foldFind(&wp->w_folds, maybe_small_start, &fp);
 	while (fp < (fold_T *)wp->w_folds.ga_data + wp->w_folds.ga_len
-		&& fp->fd_top < bot)
+		&& fp->fd_top <= maybe_small_end)
 	{
 	    fp->fd_small = MAYBE;
 	    ++fp;
@@ -2165,7 +2173,7 @@ foldUpdateIEMS(win_T *wp, linenr_T top, 
 	bot = wp->w_buffer->b_ml.ml_line_count;
 	wp->w_foldinvalid = FALSE;
 
-	// Mark all folds a maybe-small.
+	// Mark all folds as maybe-small.
 	setSmallMaybe(&wp->w_folds);
     }
 
--- a/src/testdir/test_fold.vim
+++ b/src/testdir/test_fold.vim
@@ -1479,4 +1479,33 @@ func Test_indent_append_under_blank_line
   bw!
 endfunc
 
+" Make sure that when you delete 1 line of a fold whose length is 2 lines, the
+" fold can't be closed since its length (1) is now less than foldminlines.
+func Test_indent_one_line_fold_close()
+  let lines =<< trim END
+    line 1
+      line 2
+      line 3
+  END
+
+  new
+  setlocal sw=2 foldmethod=indent
+  call setline(1, lines)
+  " open all folds, delete line, then close all folds
+  normal zR
+  3delete
+  normal zM
+  call assert_equal(-1, foldclosed(2)) " the fold should not be closed
+
+  " Now do the same, but delete line 2 this time; this covers different code.
+  " (Combining this code with the above code doesn't expose both bugs.)
+  1,$delete
+  call setline(1, lines)
+  normal zR
+  2delete
+  normal zM
+  call assert_equal(-1, foldclosed(2))
+  bw!
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4987,
+/**/
     4986,
 /**/
     4985,