# HG changeset patch # User Bram Moolenaar # Date 1659636008 -7200 # Node ID 691c8adef6f3d7800e92fa0fb4aca6e95994f0b0 # Parent b838b8a9b726dc98462e7e0db1a17127e16894bb patch 9.0.0140: execute() does not use the "legacy" command modifier Commit: https://github.com/vim/vim/commit/3d3f6ac09859905405f35f50b2b7c57ccf40fb47 Author: Kota Kato Date: Thu Aug 4 18:50:14 2022 +0100 patch 9.0.0140: execute() does not use the "legacy" command modifier Problem: execute() does not use the "legacy" command modifier. Solution: pass the command modifier in sticky_cmdmod_flags. (Kota Kato, closes #10845) diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -3929,6 +3929,7 @@ execute_common(typval_T *argvars, typval int save_redir_off = redir_off; garray_T save_ga; int save_msg_col = msg_col; + int save_sticky_cmdmod_flags = sticky_cmdmod_flags; int echo_output = FALSE; rettv->vval.v_string = NULL; @@ -3985,6 +3986,9 @@ execute_common(typval_T *argvars, typval if (!echo_output) msg_col = 0; // prevent leading spaces + // For "legacy call execute('cmd')" and "vim9cmd execute('cmd')" apply the + // command modifiers to "cmd". + sticky_cmdmod_flags = cmdmod.cmod_flags & (CMOD_LEGACY | CMOD_VIM9CMD); if (cmd != NULL) do_cmdline_cmd(cmd); else @@ -3997,6 +4001,7 @@ execute_common(typval_T *argvars, typval DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT|DOCMD_KEYTYPED); --list->lv_refcount; } + sticky_cmdmod_flags = save_sticky_cmdmod_flags; // Need to append a NUL to the result. if (ga_grow(&redir_execute_ga, 1) == OK) diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim --- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -142,6 +142,42 @@ def Test_cmdmod_execute() END v9.CheckScriptSuccess(lines) delfunc g:TheFunc + + # vim9cmd execute(cmd) executes code in vim9 script context + lines =<< trim END + vim9cmd execute("g:vim9executetest = 'bar'") + call assert_equal('bar', g:vim9executetest) + END + v9.CheckScriptSuccess(lines) + unlet g:vim9executetest + + lines =<< trim END + vim9cmd execute(["g:vim9executetest1 = 'baz'", "g:vim9executetest2 = 'foo'"]) + call assert_equal('baz', g:vim9executetest1) + call assert_equal('foo', g:vim9executetest2) + END + v9.CheckScriptSuccess(lines) + unlet g:vim9executetest1 + unlet g:vim9executetest2 + + # legacy call execute(cmd) executes code in vim script context + lines =<< trim END + vim9script + legacy call execute("let g:vim9executetest = 'bar'") + assert_equal('bar', g:vim9executetest) + END + v9.CheckScriptSuccess(lines) + unlet g:vim9executetest + + lines =<< trim END + vim9script + legacy call execute(["let g:vim9executetest1 = 'baz'", "let g:vim9executetest2 = 'foo'"]) + assert_equal('baz', g:vim9executetest1) + assert_equal('foo', g:vim9executetest2) + END + v9.CheckScriptSuccess(lines) + unlet g:vim9executetest1 + unlet g:vim9executetest2 enddef def Test_edit_wildcards() diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -736,6 +736,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 140, +/**/ 139, /**/ 138,