]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.1199 v7.3.1199
authorBram Moolenaar <Bram@vim.org>
Sat, 15 Jun 2013 15:06:36 +0000 (17:06 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 15 Jun 2013 15:06:36 +0000 (17:06 +0200)
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)

src/fold.c
src/version.c

index 97e4ebc3d4b178c848773876b5b7791d62a95e25..a1671fe667b5a8bf2ae3cab6318ac9251d137263 100644 (file)
@@ -1930,8 +1930,22 @@ get_foldtext(wp, lnum, lnume, foldinfo, buf)
     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;
+
+    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, buf)
        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;
 
-       ++emsg_off;
-       text = eval_to_string_safe(wp->w_p_fdt, NULL,
+       /* 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_off;
+           --emsg_silent;
+
+           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
index 8f4ddcf2abc3693c26909c08c06b3582f9bea405..9e98379f9e35c98d0036d6c408ff5b3598fa6173 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1199,
 /**/
     1198,
 /**/