Mercurial > vim
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