]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.0002: a closing fold expr, may start a new fold v9.1.0002
authorShota Nozaki <emonkak@gmail.com>
Wed, 3 Jan 2024 18:18:43 +0000 (19:18 +0100)
committerChristian Brabandt <cb@256bit.org>
Wed, 3 Jan 2024 18:18:43 +0000 (19:18 +0100)
Problem:  a closing fold expression may unexpectedly start a new fold
          when it should end a fold
          (reported by Shota Nozaki)
Solution: if a fold hasn't started yet, do not immediately
          start a new fold with level 1
          (Shota Nozaki)

fixes: #12768
closes: #13748

Signed-off-by: Shota Nozaki <emonkak@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/fold.c
src/testdir/test_fold.vim
src/version.c

index be20991c7aacfb54adfd88233ec06d76bf336b94..5c41ed1b0552cdb976f198123c04d661e8fc7f31 100644 (file)
@@ -3362,7 +3362,9 @@ foldlevelExpr(fline_T *flp)
                  break;
 
        // "<1", "<2", .. : end a fold with a certain level
-       case '<': flp->lvl_next = n - 1;
+       case '<': // To prevent an unexpected start of a new fold, the next
+                 // level must not exceed the level of the current fold.
+                 flp->lvl_next = MIN(flp->lvl, n - 1);
                  flp->end = n;
                  break;
 
index cb29d43d54ed861882296f194bb01efc899733d3..3c78e62c3e795a307c00eedfef4f2621b6fd0020 100644 (file)
@@ -1778,4 +1778,17 @@ func Test_foldexpr_return_empty_string()
   bwipe!
 endfunc
 
+" Make sure that when ending a fold that hasn't been started, it does not
+" start a new fold.
+func Test_foldexpr_end_fold()
+  new
+  setlocal foldmethod=expr
+  let &l:foldexpr = 'v:lnum == 2 ? "<2" : "="'
+  call setline(1, range(1, 3))
+  redraw
+  call assert_equal([0, 0, 0], range(1, 3)->map('foldlevel(v:val)'))
+
+  bwipe!
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index c4e7fa3db7d1bae9438762687bdf77204270756d..8c71b6864f07f4f8fbc68af594f1c7b7edf6cda1 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2,
 /**/
     1,
 /**/