# HG changeset patch # User Bram Moolenaar # Date 1371308796 -7200 # Node ID be2973afe77045bd749c63c46ea02f61efa55862 # Parent c8f3c963f8fc68bfb89f9ada8f42b27c42b2c97f 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) diff --git a/src/fold.c b/src/fold.c --- 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 diff --git a/src/version.c b/src/version.c --- 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,