diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-06-15 17:06:36 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-06-15 17:06:36 +0200 |
commit | dab38d516effcab23c8381545d4b1e6be38bce5b (patch) | |
tree | a5dcea80003f272c301409ddf4abb74ea08cc884 /src/fold.c | |
parent | 9be6e21575e52f5d22839f660f8ca1032097b2f5 (diff) | |
download | vim-git-dab38d516effcab23c8381545d4b1e6be38bce5b.tar.gz |
updated for version 7.3.1199v7.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)
Diffstat (limited to 'src/fold.c')
-rw-r--r-- | src/fold.c | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/src/fold.c b/src/fold.c index 97e4ebc3d..a1671fe66 100644 --- a/src/fold.c +++ b/src/fold.c @@ -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 |