summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-02-11 20:33:48 +0000
committerBram Moolenaar <Bram@vim.org>2022-02-11 20:33:48 +0000
commit5b1d6e98c6610553fe3946086cdba77718bd69d5 (patch)
treeeaf6cc403e6f80de9a36b892c260c967d26e419b
parentbd89d4406327d3a30517443a4a518f49ebc99368 (diff)
downloadvim-git-5b1d6e98c6610553fe3946086cdba77718bd69d5.tar.gz
patch 8.2.4348: "legacy exe cmd" does not do what one would expectv8.2.4348
Problem: "legacy exe cmd" does not do what one would expect. Solution: Apply the "legacy" and "vim9script" command modifiers to the argument of ":execute".
-rw-r--r--runtime/doc/vim9.txt10
-rw-r--r--src/eval.c8
-rw-r--r--src/ex_docmd.c1
-rw-r--r--src/globals.h1
-rw-r--r--src/testdir/test_vim9_cmd.vim25
-rw-r--r--src/version.c2
6 files changed, 42 insertions, 5 deletions
diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt
index 5824ecb28..edd61d968 100644
--- a/runtime/doc/vim9.txt
+++ b/runtime/doc/vim9.txt
@@ -57,13 +57,13 @@ rewrite old scripts, they keep working as before. You may want to use a few
`:def` functions for code that needs to be fast.
:vim9[cmd] {cmd} *:vim9* *:vim9cmd* *E1164*
- Execute {cmd} using Vim9 script syntax and semantics.
- Useful when typing a command and in a legacy script or
- function.
+ Evaluate and execute {cmd} using Vim9 script syntax and
+ semantics. Useful when typing a command and in a legacy
+ script or function.
:leg[acy] {cmd} *:leg* *:legacy* *E1189* *E1234*
- Execute {cmd} using legacy script syntax and semantics. Only
- useful in a Vim9 script or a :def function.
+ Evaluate and execute {cmd} using legacy script syntax and
+ semantics. Only useful in a Vim9 script or a :def function.
Note that {cmd} cannot use local variables, since it is parsed
with legacy expression syntax.
diff --git a/src/eval.c b/src/eval.c
index d775ee3f2..81a1dd0a9 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -6491,8 +6491,16 @@ ex_execute(exarg_T *eap)
did_emsg = save_did_emsg;
}
else if (eap->cmdidx == CMD_execute)
+ {
+ int save_sticky_cmdmod_flags = sticky_cmdmod_flags;
+
+ // "legacy exe cmd" and "vim9cmd exe cmd" applies to "cmd".
+ sticky_cmdmod_flags = cmdmod.cmod_flags
+ & (CMOD_LEGACY | CMOD_VIM9CMD);
do_cmdline((char_u *)ga.ga_data,
eap->getline, eap->cookie, DOCMD_NOWAIT|DOCMD_VERBOSE);
+ sticky_cmdmod_flags = save_sticky_cmdmod_flags;
+ }
}
ga_clear(&ga);
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 400360553..864f3d845 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -2786,6 +2786,7 @@ parse_command_modifiers(
int starts_with_colon = FALSE;
CLEAR_POINTER(cmod);
+ cmod->cmod_flags = sticky_cmdmod_flags;
// Repeat until no more command modifiers are found.
for (;;)
diff --git a/src/globals.h b/src/globals.h
index 2f6a4b41a..8bc537ed7 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -1156,6 +1156,7 @@ EXTERN int mapped_ctrl_c INIT(= FALSE); // modes where CTRL-C is mapped
EXTERN int ctrl_c_interrupts INIT(= TRUE); // CTRL-C sets got_int
EXTERN cmdmod_T cmdmod; // Ex command modifiers
+EXTERN int sticky_cmdmod_flags INIT(= 0); // used by :execute
#ifdef FEAT_EVAL
EXTERN int is_export INIT(= FALSE); // :export {cmd}
diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim
index 0ac69e84f..4398cbf4f 100644
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -83,6 +83,31 @@ def Test_vim9cmd()
v9.CheckScriptSuccess(lines)
enddef
+def Test_cmdmod_execute()
+ # "legacy" applies not only to the "exe" argument but also to the commands
+ var lines =<< trim END
+ vim9script
+
+ b:undo = 'let g:undone = 1 | let g:undtwo = 2'
+ legacy exe b:undo
+ assert_equal(1, g:undone)
+ assert_equal(2, g:undtwo)
+ END
+ v9.CheckScriptSuccess(lines)
+
+ # same for "vim9cmd" modifier
+ lines =<< trim END
+ let b:undo = 'g:undone = 11 | g:undtwo = 22'
+ vim9cmd exe b:undo
+ call assert_equal(11, g:undone)
+ call assert_equal(22, g:undtwo)
+ END
+ v9.CheckScriptSuccess(lines)
+ unlet b:undo
+ unlet g:undone
+ unlet g:undtwo
+enddef
+
def Test_edit_wildcards()
var filename = 'Xtest'
edit `=filename`
diff --git a/src/version.c b/src/version.c
index f7599c0d0..dfcec9171 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4348,
+/**/
4347,
/**/
4346,