]> granicus.if.org Git - vim/commitdiff
patch 8.0.0581: moving folded text is sometimes not correct v8.0.0581
authorBram Moolenaar <Bram@vim.org>
Sat, 22 Apr 2017 20:40:11 +0000 (22:40 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 22 Apr 2017 20:40:11 +0000 (22:40 +0200)
Problem:    Moving folded text is sometimes not correct.
Solution:   Bail out when "move_end" is zero. (Matthew Malcomson)

src/fold.c
src/testdir/test_fold.vim
src/version.c

index 8c66b78cd04ea3c916378b551bcdbec27e182cbd..8f068dccf117c1bc25d409efec19f338931083aa 100644 (file)
@@ -3133,10 +3133,14 @@ foldMoveRange(garray_T *gap, linenr_T line1, linenr_T line2, linenr_T dest)
     dest_index = fold_index(fp, gap);
 
     /*
-     * All folds are now correct, but they are not necessarily in the correct
-     * order. We have to swap folds in the range [move_end, dest_index) with
-     * those in the range [move_start, move_end).
+     * All folds are now correct, but not necessarily in the correct order.  We
+     * must swap folds in the range [move_end, dest_index) with those in the
+     * range [move_start, move_end).
      */
+    if (move_end == 0)
+       /* There are no folds after those moved, hence no folds have been moved
+        * out of order. */
+       return;
     foldReverseOrder(gap, (linenr_T)move_start, (linenr_T)dest_index - 1);
     foldReverseOrder(gap, (linenr_T)move_start,
                           (linenr_T)(move_start + dest_index - move_end - 1));
index a5b47d899b51fe05b8659fe988671269820a66c1..213c0fa4583c97de5dcf613a1f5caed80f570533 100644 (file)
@@ -1,10 +1,10 @@
 " Test for folding
 
-func! PrepIndent(arg)
+func PrepIndent(arg)
   return [a:arg] + repeat(["\t".a:arg], 5)
 endfu
 
-func! Test_address_fold()
+func Test_address_fold()
   new
   call setline(1, ['int FuncName() {/*{{{*/', 1, 2, 3, 4, 5, '}/*}}}*/',
              \ 'after fold 1', 'after fold 2', 'after fold 3'])
@@ -68,17 +68,7 @@ func! Test_address_fold()
   quit!
 endfunc
 
-func! Test_indent_fold()
-    new
-    call setline(1, ['', 'a', '    b', '    c'])
-    setl fen fdm=indent
-    2
-    norm! >>
-    let a=map(range(1,4), 'foldclosed(v:val)')
-    call assert_equal([-1,-1,-1,-1], a)
-endfunc
-
-func! Test_indent_fold()
+func Test_indent_fold()
     new
     call setline(1, ['', 'a', '    b', '    c'])
     setl fen fdm=indent
@@ -89,7 +79,7 @@ func! Test_indent_fold()
     bw!
 endfunc
 
-func! Test_indent_fold2()
+func Test_indent_fold2()
     new
     call setline(1, ['', '{{{', '}}}', '{{{', '}}}'])
     setl fen fdm=marker
@@ -122,7 +112,7 @@ func Test_manual_fold_with_filter()
   endfor
 endfunc
 
-func! Test_indent_fold_with_read()
+func Test_indent_fold_with_read()
   new
   set foldmethod=indent
   call setline(1, repeat(["\<Tab>a"], 4))
@@ -224,7 +214,11 @@ func Test_update_folds_expr_read()
   set foldmethod& foldexpr&
 endfunc
 
-func! Test_move_folds_around_manual()
+func Check_foldlevels(expected)
+  call assert_equal(a:expected, map(range(1, line('$')), 'foldlevel(v:val)'))
+endfunc
+
+func Test_move_folds_around_manual()
   new
   let input = PrepIndent("a") + PrepIndent("b") + PrepIndent("c")
   call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
@@ -293,11 +287,50 @@ func! Test_move_folds_around_manual()
   6m$
   " The first fold has been truncated to the 5'th line.
   " Second fold has been moved up because the moved line is now below it.
-  call assert_equal([0, 1, 1, 1, 1, 0, 0, 0, 1, 0], map(range(1, line('$')), 'foldlevel(v:val)'))
+  call Check_foldlevels([0, 1, 1, 1, 1, 0, 0, 0, 1, 0])
+
+  %delete
+  set fdm=indent foldlevel=0
+  call setline(1, [
+       \ "a",
+       \ "\ta",
+       \ "\t\ta",
+       \ "\t\ta",
+       \ "\t\ta",
+       \ "a",
+       \ "a"])
+  set fdm=manual
+  %foldopen!
+  4,5m6
+  call Check_foldlevels([0, 1, 2, 0, 0, 0, 0])
+
+  %delete
+  set fdm=indent
+  call setline(1, [
+       \ "\ta",
+       \ "\t\ta",
+       \ "\t\ta",
+       \ "\t\ta",
+       \ "\ta",
+       \ "\t\ta",
+       \ "\t\ta",
+       \ "\t\ta",
+       \ "\ta",
+       \ "\t\ta",
+       \ "\t\ta",
+       \ "\t\ta",
+       \ "\t\ta",
+       \ "\ta",
+       \ "a"])
+  set fdm=manual
+  %foldopen!
+  13m7
+  call Check_foldlevels([1, 2, 2, 2, 1, 2, 2, 1, 1, 1, 2, 2, 2, 1, 0])
+  
   bw!
 endfunc
 
-func! Test_move_folds_around_indent()
+func Test_move_folds_around_indent()
   new
   let input = PrepIndent("a") + PrepIndent("b") + PrepIndent("c")
   call setline(1, PrepIndent("a") + PrepIndent("b") + PrepIndent("c"))
@@ -357,7 +390,7 @@ func! Test_move_folds_around_indent()
   6m$
   " The first fold has been truncated to the 5'th line.
   " Second fold has been moved up because the moved line is now below it.
-  call assert_equal([0, 1, 1, 1, 1, 0, 0, 0, 1, 1], map(range(1, line('$')), 'foldlevel(v:val)'))
+  call Check_foldlevels([0, 1, 1, 1, 1, 0, 0, 0, 1, 1])
   bw!
 endfunc
 
index c41cc5abba6f2980a4adf94991927fa71133690b..3f74d6e396de2fbaa20edfcf95445a5659797d9b 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    581,
 /**/
     580,
 /**/