changeset 4907:be2973afe770 v7.3.1199

updated for version 7.3.1199 Problem: When evaluating 'foldexpr' causes an error this is silently ignored and evaluation is retried every time. Solution: Set emsg_silent instead of emsg_off. Stop evaluating 'foldexpr' is it is causing errors. (Christian Brabandt)
author Bram Moolenaar <bram@vim.org>
date Sat, 15 Jun 2013 17:06:36 +0200
parents c8f3c963f8fc
children e362e9e2ae39
files src/fold.c src/version.c
diffstat 2 files changed, 39 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/fold.c
+++ b/src/fold.c
@@ -1930,8 +1930,22 @@ get_foldtext(wp, lnum, lnume, foldinfo, 
     char_u	*buf;
 {
     char_u	*text = NULL;
+#ifdef FEAT_EVAL
+     /* an error occurred when evaluating 'fdt' setting */
+    static int	    got_fdt_error = FALSE;
+    int		    save_did_emsg = did_emsg;
+    static win_T    *last_wp = NULL;
+    static linenr_T last_lnum = 0;
 
-#ifdef FEAT_EVAL
+    if (last_wp != wp || last_wp == NULL
+					|| last_lnum > lnum || last_lnum == 0)
+	/* window changed, try evaluating foldtext setting once again */
+	got_fdt_error = FALSE;
+
+    if (!got_fdt_error)
+	/* a previous error should not abort evaluating 'foldexpr' */
+	did_emsg = FALSE;
+
     if (*wp->w_p_fdt != NUL)
     {
 	char_u	dashes[MAX_LEVEL + 2];
@@ -1952,19 +1966,32 @@ get_foldtext(wp, lnum, lnume, foldinfo, 
 	dashes[level] = NUL;
 	set_vim_var_string(VV_FOLDDASHES, dashes, -1);
 	set_vim_var_nr(VV_FOLDLEVEL, (long)level);
-	save_curwin = curwin;
-	curwin = wp;
-	curbuf = wp->w_buffer;
+
+	/* skip evaluating foldtext on errors */
+	if (!got_fdt_error)
+	{
+	    save_curwin = curwin;
+	    curwin = wp;
+	    curbuf = wp->w_buffer;
+
+	    ++emsg_silent; /* handle exceptions, but don't display errors */
+	    text = eval_to_string_safe(wp->w_p_fdt, NULL,
+			 was_set_insecurely((char_u *)"foldtext", OPT_LOCAL));
+	    --emsg_silent;
 
-	++emsg_off;
-	text = eval_to_string_safe(wp->w_p_fdt, NULL,
-			 was_set_insecurely((char_u *)"foldtext", OPT_LOCAL));
-	--emsg_off;
+	    if (text == NULL || did_emsg)
+		got_fdt_error = TRUE;
 
-	curwin = save_curwin;
-	curbuf = curwin->w_buffer;
+	    curwin = save_curwin;
+	    curbuf = curwin->w_buffer;
+	}
+	last_lnum = lnum;
+	last_wp   = wp;
 	set_vim_var_string(VV_FOLDDASHES, NULL, -1);
 
+	if (!did_emsg && save_did_emsg)
+	    did_emsg = save_did_emsg;
+
 	if (text != NULL)
 	{
 	    /* Replace unprintable characters, if there are any.  But
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1199,
+/**/
     1198,
 /**/
     1197,