diff src/fold.c @ 1977:f018c759e4ed v7.2.274

updated for version 7.2-274
author vimboss
date Tue, 03 Nov 2009 13:46:54 +0000
parents 7d2641e6af75
children 31df87b80e56
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. */