changeset 1977:f018c759e4ed v7.2.274

updated for version 7.2-274
author vimboss
date Tue, 03 Nov 2009 13:46:54 +0000
parents 27060fe297d0
children 7e0c8a18c915
files src/fold.c src/testdir/test45.in src/testdir/test45.ok src/version.c
diffstat 4 files changed, 44 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/fold.c
+++ b/src/fold.c
@@ -2256,6 +2256,40 @@ foldUpdateIEMS(wp, top, bot)
 	}
     }
 
+    /*
+     * If folding is defined by the syntax, it is possible that a change in
+     * one line will cause all sub-folds of the current fold to change (e.g.,
+     * closing a C-style comment can cause folds in the subsequent lines to
+     * appear). To take that into account we should adjust the value of "bot"
+     * to point to the end of the current fold:
+     */
+    if (foldlevelSyntax == getlevel)
+    {
+	garray_T *gap = &wp->w_folds;
+	fold_T	 *fp = NULL;
+	int	  current_fdl = 0;
+	linenr_T  fold_start_lnum = 0;
+	linenr_T  lnum_rel = fline.lnum;
+
+	while (current_fdl < fline.lvl)
+	{
+	    if (!foldFind(gap, lnum_rel, &fp))
+		break;
+	    ++current_fdl;
+
+	    fold_start_lnum += fp->fd_top;
+	    gap = &fp->fd_nested;
+	    lnum_rel -= fp->fd_top;
+	}
+	if (fp != NULL && current_fdl == fline.lvl)
+	{
+	    linenr_T fold_end_lnum = fold_start_lnum + fp->fd_len;
+
+	    if (fold_end_lnum > bot)
+		bot = fold_end_lnum;
+	}
+    }
+
     start = fline.lnum;
     end = bot;
     /* Do at least one line. */
--- a/src/testdir/test45.in
+++ b/src/testdir/test45.in
@@ -28,9 +28,14 @@ i  jI    :call append("$", "indent " .
 k:call append("$", foldlevel("."))
 :" test syntax folding
 :set fdm=syntax fdl=0
-:syn region Hup start="dd" end="hh" fold
+:syn region Hup start="dd" end="ii" fold contains=Fd1,Fd2,Fd3
+:syn region Fd1 start="ee" end="ff" fold contained
+:syn region Fd2 start="gg" end="hh" fold contained
+:syn region Fd3 start="commentstart" end="commentend" fold contained
 Gzk:call append("$", "folding " . getline("."))
 k:call append("$", getline("."))
+jAcommentstart  Acommentend:set fdl=1
+3j:call append("$", getline("."))
 :" test expression folding
 :fun Flvl()
   let l = getline(v:lnum)
--- a/src/testdir/test45.ok
+++ b/src/testdir/test45.ok
@@ -8,8 +8,9 @@ 1
 0
 indent 2
 1
-folding 8 hh
+folding 9 ii
     3 cc
+7 gg
 expr 2
 1
 2
--- a/src/version.c
+++ b/src/version.c
@@ -677,6 +677,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    274,
+/**/
     273,
 /**/
     272,