Patch 8.0.0408
Problem:    Updating folds does not work properly when inserting a file and a
            few other situations.
Solution:   Adjust the way folds are updated. (Matthew Malcomson)
Files:      src/fold.c, src/testdir/test_fold.vim


*** ../vim-8.0.0407/src/fold.c  2017-02-28 21:53:51.275626386 +0100
--- src/fold.c  2017-03-04 18:29:45.985625604 +0100
***************
*** 2505,2511 ****
                         * before where we started looking, extend it.  If it
                         * starts at another line, update nested folds to keep
                         * their position, compensating for the new fd_top. */
!                       if (fp->fd_top >= startlnum && fp->fd_top != firstlnum)
                        {
                            if (fp->fd_top > firstlnum)
                                /* like lines are inserted */
--- 2505,2515 ----
                         * before where we started looking, extend it.  If it
                         * starts at another line, update nested folds to keep
                         * their position, compensating for the new fd_top. */
!                       if (fp->fd_top == firstlnum)
!                       {
!                           /* have found a fold beginning where we want */
!                       }
!                       else if (fp->fd_top >= startlnum)
                        {
                            if (fp->fd_top > firstlnum)
                                /* like lines are inserted */
***************
*** 2523,2540 ****
                            fp->fd_top = firstlnum;
                            fold_changed = TRUE;
                        }
!                       else if (flp->start != 0 && lvl == level
!                                                  && fp->fd_top != firstlnum)
                        {
!                           /* Existing fold that includes startlnum must stop
!                            * if we find the start of a new fold at the same
!                            * level.  Split it.  Delete contained folds at
!                            * this point to split them too. */
!                           foldRemove(&fp->fd_nested, flp->lnum - fp->fd_top,
!                                                     flp->lnum - fp->fd_top);
                            i = (int)(fp - (fold_T *)gap->ga_data);
!                           foldSplit(gap, i, flp->lnum, flp->lnum - 1);
                            fp = (fold_T *)gap->ga_data + i + 1;
                            /* If using the "marker" or "syntax" method, we
                             * need to continue until the end of the fold is
                             * found. */
--- 2527,2570 ----
                            fp->fd_top = firstlnum;
                            fold_changed = TRUE;
                        }
!                       else if ((flp->start != 0 && lvl == level)
!                                                    || firstlnum != startlnum)
                        {
!                           linenr_T breakstart;
!                           linenr_T breakend;
! 
!                           /*
!                            * Before there was a fold spanning from above
!                            * startlnum to below firstlnum. This fold is valid
!                            * above startlnum (because we are not updating
!                            * that range), but there should now be a break in
!                            * it.
!                            * If the break is because we are now forced to
!                            * start a new fold at the level "level" at line
!                            * fline->lnum, then we need to split the fold at
!                            * fline->lnum.
!                            * If the break is because the range
!                            * [startlnum, firstlnum) is now at a lower indent
!                            * than "level", we need to split the fold in this
!                            * range.
!                            * Any splits have to be done recursively.
!                            */
!                           if (firstlnum != startlnum)
!                           {
!                               breakstart = startlnum;
!                               breakend = firstlnum;
!                           }
!                           else
!                           {
!                               breakstart = flp->lnum;
!                               breakend = flp->lnum;
!                           }
!                           foldRemove(&fp->fd_nested, breakstart - fp->fd_top,
!                                                     breakend - fp->fd_top);
                            i = (int)(fp - (fold_T *)gap->ga_data);
!                           foldSplit(gap, i, breakstart, breakend - 1);
                            fp = (fold_T *)gap->ga_data + i + 1;
+ 
                            /* If using the "marker" or "syntax" method, we
                             * need to continue until the end of the fold is
                             * found. */
***************
*** 2543,2548 ****
--- 2573,2592 ----
                                    || getlevel == foldlevelSyntax)
                                finish = TRUE;
                        }
+ 
+                       if (fp->fd_top == startlnum && concat)
+                       {
+                           i = (int)(fp - (fold_T *)gap->ga_data);
+                           if (i != 0)
+                           {
+                               fp2 = fp - 1;
+                               if (fp2->fd_top + fp2->fd_len == fp->fd_top)
+                               {
+                                   foldMerge(fp2, gap, fp);
+                                   fp = fp2;
+                               }
+                           }
+                       }
                        break;
                    }
                    if (fp->fd_top >= startlnum)
*** ../vim-8.0.0407/src/testdir/test_fold.vim   2017-03-04 15:28:49.422383686 
+0100
--- src/testdir/test_fold.vim   2017-03-04 18:39:30.289078439 +0100
***************
*** 117,119 ****
--- 117,205 ----
      set foldmethod&
    endfor
  endfunc
+ 
+ func! Test_indent_fold_with_read()
+   new
+   set foldmethod=indent
+   call setline(1, repeat(["\<Tab>a"], 4))
+   for n in range(1, 4)
+     call assert_equal(1, foldlevel(n))
+   endfor
+ 
+   call writefile(["a", "", "\<Tab>a"], 'Xfile')
+   foldopen
+   2read Xfile
+   %foldclose
+   call assert_equal(1, foldlevel(1))
+   call assert_equal(2, foldclosedend(1))
+   call assert_equal(0, foldlevel(3))
+   call assert_equal(0, foldlevel(4))
+   call assert_equal(1, foldlevel(5))
+   call assert_equal(7, foldclosedend(5))
+ 
+   bwipe!
+   set foldmethod&
+   call delete('Xfile')
+ endfunc
+ 
+ func Test_combining_folds_indent()
+   new
+   let one = "\<Tab>a"
+   let zero = 'a'
+   call setline(1, [one, one, zero, zero, zero, one, one, one])
+   set foldmethod=indent
+   3,5d
+   %foldclose
+   call assert_equal(5, foldclosedend(1))
+ 
+   set foldmethod&
+   bwipe!
+ endfunc
+ 
+ func Test_combining_folds_marker()
+   new
+   call setline(1, ['{{{', '}}}', '', '', '', '{{{', '', '}}}'])
+   set foldmethod=marker
+   3,5d
+   %foldclose
+   call assert_equal(2, foldclosedend(1))
+ 
+   set foldmethod&
+   bwipe!
+ endfunc
+ 
+ func s:TestFoldExpr(lnum)
+   let thisline = getline(a:lnum)
+   if thisline == 'a'
+     return 1
+   elseif thisline == 'b'
+     return 0
+   elseif thisline == 'c'
+     return '<1'
+   elseif thisline == 'd'
+     return '>1'
+   endif
+   return 0
+ endfunction
+ 
+ func Test_update_folds_expr_read()
+   new
+   call setline(1, ['a', 'a', 'a', 'a', 'a', 'a'])
+   set foldmethod=expr
+   set foldexpr=s:TestFoldExpr(v:lnum)
+   2
+   foldopen
+   call writefile(['b', 'b', 'a', 'a', 'd', 'a', 'a', 'c'], 'Xfile')
+   read Xfile
+   %foldclose
+   call assert_equal(2, foldclosedend(1))
+   call assert_equal(0, foldlevel(3))
+   call assert_equal(0, foldlevel(4))
+   call assert_equal(6, foldclosedend(5))
+   call assert_equal(10, foldclosedend(7))
+   call assert_equal(14, foldclosedend(11))
+ 
+   call delete('Xfile')
+   bwipe!
+   set foldmethod& foldexpr&
+ endfunc
*** ../vim-8.0.0407/src/version.c       2017-03-04 15:28:49.422383686 +0100
--- src/version.c       2017-03-04 18:39:29.289085913 +0100
***************
*** 766,767 ****
--- 766,769 ----
  {   /* Add new patch number below this line */
+ /**/
+     408,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
46. Your wife makes a new rule: "The computer cannot come to bed."

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui