# HG changeset patch # User Bram Moolenaar # Date 1642859102 -3600 # Node ID ebe56a24acb6e9b04c74bd390f7e5ba305a7d713 # Parent 160b87e56c45f25e4c28246e9d70b689669160e9 patch 8.2.4179: 'foldtext' is evaluated in the current script context Commit: https://github.com/vim/vim/commit/9530b580a7b71960dbbdb2b12a3aafeb540bd135 Author: Bram Moolenaar Date: Sat Jan 22 13:39:08 2022 +0000 patch 8.2.4179: 'foldtext' is evaluated in the current script context Problem: 'foldtext' is evaluated in the current script context. Solution: Use the script context where the option was set. diff --git a/src/buffer.c b/src/buffer.c --- a/src/buffer.c +++ b/src/buffer.c @@ -4162,7 +4162,7 @@ build_stl_str_hl( tv.vval.v_number = wp->w_id; set_var((char_u *)"g:statusline_winid", &tv, FALSE); - usefmt = eval_to_string_safe(fmt + 2, use_sandbox); + usefmt = eval_to_string_safe(fmt + 2, use_sandbox, FALSE); if (usefmt == NULL) usefmt = fmt; @@ -4546,7 +4546,7 @@ build_stl_str_hl( if (curwin != save_curwin) VIsual_active = FALSE; - str = eval_to_string_safe(p, use_sandbox); + str = eval_to_string_safe(p, use_sandbox, FALSE); curwin = save_curwin; curbuf = save_curbuf; diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -555,14 +555,16 @@ eval_to_string( char_u * eval_to_string_safe( char_u *arg, - int use_sandbox) + int use_sandbox, + int keep_script_version) { char_u *retval; funccal_entry_T funccal_entry; int save_sc_version = current_sctx.sc_version; int save_garbage = may_garbage_collect; - current_sctx.sc_version = 1; + if (!keep_script_version) + current_sctx.sc_version = 1; save_funccal(&funccal_entry); if (use_sandbox) ++sandbox; diff --git a/src/findfile.c b/src/findfile.c --- a/src/findfile.c +++ b/src/findfile.c @@ -2097,7 +2097,7 @@ eval_includeexpr(char_u *ptr, int len) set_vim_var_string(VV_FNAME, ptr, len); res = eval_to_string_safe(curbuf->b_p_inex, - was_set_insecurely((char_u *)"includeexpr", OPT_LOCAL)); + was_set_insecurely((char_u *)"includeexpr", OPT_LOCAL), FALSE); set_vim_var_string(VV_FNAME, NULL, 0); return res; } diff --git a/src/fold.c b/src/fold.c --- a/src/fold.c +++ b/src/fold.c @@ -1923,7 +1923,6 @@ get_foldtext( if (*wp->w_p_fdt != NUL) { char_u dashes[MAX_LEVEL + 2]; - win_T *save_curwin; int level; char_u *p; @@ -1941,23 +1940,27 @@ get_foldtext( set_vim_var_string(VV_FOLDDASHES, dashes, -1); set_vim_var_nr(VV_FOLDLEVEL, (long)level); - // skip evaluating foldtext on errors + // skip evaluating 'foldtext' on errors if (!got_fdt_error) { - save_curwin = curwin; + win_T *save_curwin = curwin; + sctx_T saved_sctx = current_sctx; + curwin = wp; curbuf = wp->w_buffer; - - ++emsg_silent; // handle exceptions, but don't display errors + current_sctx = wp->w_p_script_ctx[WV_FDT]; + + ++emsg_off; // handle exceptions, but don't display errors text = eval_to_string_safe(wp->w_p_fdt, - was_set_insecurely((char_u *)"foldtext", OPT_LOCAL)); - --emsg_silent; + was_set_insecurely((char_u *)"foldtext", OPT_LOCAL), TRUE); + --emsg_off; if (text == NULL || did_emsg) got_fdt_error = TRUE; curwin = save_curwin; curbuf = curwin->w_buffer; + current_sctx = saved_sctx; } last_lnum = lnum; last_wp = wp; diff --git a/src/proto/eval.pro b/src/proto/eval.pro --- a/src/proto/eval.pro +++ b/src/proto/eval.pro @@ -14,7 +14,7 @@ int skip_expr_concatenate(char_u **arg, char_u *typval2string(typval_T *tv, int convert); char_u *eval_to_string_eap(char_u *arg, int convert, exarg_T *eap); char_u *eval_to_string(char_u *arg, int convert); -char_u *eval_to_string_safe(char_u *arg, int use_sandbox); +char_u *eval_to_string_safe(char_u *arg, int use_sandbox, int keep_script_version); varnumber_T eval_to_number(char_u *expr); typval_T *eval_expr(char_u *arg, exarg_T *eap); int call_vim_function(char_u *func, int argc, typval_T *argv, typval_T *rettv); diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim --- a/src/testdir/test_vim9_import.vim +++ b/src/testdir/test_vim9_import.vim @@ -683,6 +683,9 @@ def Test_use_autoload_import_in_fold_exp export def Expr(): string return getline(v:lnum) =~ '^#' ? '>1' : '1' enddef + export def Text(): string + return 'fold text' + enddef g:fold_loaded = 'yes' END writefile(lines, 'Xdir/autoload/fold.vim') @@ -691,6 +694,7 @@ def Test_use_autoload_import_in_fold_exp vim9script import autoload 'fold.vim' &foldexpr = 'fold.Expr()' + &foldtext = 'fold.Text()' &foldmethod = 'expr' &debug = 'throw' END @@ -706,7 +710,7 @@ def Test_use_autoload_import_in_fold_exp edit! otherfile redraw - set foldexpr= foldmethod& debug= + set foldexpr= foldtext& foldmethod& debug= bwipe! delete('Xdir', 'rf') &rtp = save_rtp diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4179, +/**/ 4178, /**/ 4177,