]> granicus.if.org Git - vim/commitdiff
patch 8.2.4348: "legacy exe cmd" does not do what one would expect v8.2.4348
authorBram Moolenaar <Bram@vim.org>
Fri, 11 Feb 2022 20:33:48 +0000 (20:33 +0000)
committerBram Moolenaar <Bram@vim.org>
Fri, 11 Feb 2022 20:33:48 +0000 (20:33 +0000)
Problem:    "legacy exe cmd" does not do what one would expect.
Solution:   Apply the "legacy" and "vim9script" command modifiers to the
            argument of ":execute".

runtime/doc/vim9.txt
src/eval.c
src/ex_docmd.c
src/globals.h
src/testdir/test_vim9_cmd.vim
src/version.c

index 5824ecb2810ec24b2c9fcd602b78e24af39a7943..edd61d9689fa0d7352c0e2ea552671da6e912899 100644 (file)
@@ -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.
 
index d775ee3f260b82d8d2b60625d878d2ea0947c9be..81a1dd0a97b449758a3574ffecc35c1d84fde15f 100644 (file)
@@ -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);
index 4003605537d28c97e907aa192a59e79c1bdcdbbf..864f3d845d40d56afef77915bd3418aa1dea6bcb 100644 (file)
@@ -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 (;;)
index 2f6a4b41ab24ea15b4ab7606e505ec1e2a6d2d41..8bc537ed7ebe0d840784c442ecd1470ffae1e919 100644 (file)
@@ -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}
index 0ac69e84fe827594be1f43f0870adf43d7099b22..4398cbf4f64a1d21c0ecc4b3f70e997996394dc7 100644 (file)
@@ -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`
index f7599c0d082ddcfb2118fec1e445fed81784bcf9..dfcec91717b9dd59d0cdf371f2d2bd3a1dd2dd25 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4348,
 /**/
     4347,
 /**/