changeset 26358:80b555c4aed0 v8.2.3710

patch 8.2.3710: Vim9: backtick expression expanded for :global Commit: https://github.com/vim/vim/commit/3d2e031d4f0e1559e4a4f99de5eb2330f38f8eb5 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Dec 1 09:27:20 2021 +0000 patch 8.2.3710: Vim9: backtick expression expanded for :global Problem: Vim9: backtick expression expanded for :global. Solution: Check the following command.
author Bram Moolenaar <Bram@vim.org>
date Wed, 01 Dec 2021 10:30:06 +0100
parents 058ce5b5b367
children 93ab37175d0c
files runtime/doc/vim9.txt src/testdir/test_vim9_cmd.vim src/version.c src/vim9compile.c
diffstat 4 files changed, 24 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/vim9.txt
+++ b/runtime/doc/vim9.txt
@@ -1124,17 +1124,11 @@ function scope.  Instead, use a lambda: 
 	  return range(1, 2)->map((_, v) => list[v])
 	enddef
 
-The same is true for commands that are not compiled, such as `:global`.
-For these the backtick expansion can be used.  Example: >
+For commands that are not compiled, such as `:edit`, backtick expansion can be
+used and it can use the local scope.  Example: >
 	def Replace()
-	  var newText = 'blah'
-	  g/pattern/s/^/`=newText`/
-	enddef
-
-Or a script variable can be used: >
-	var newText = 'blah'
-	def Replace()
-	  g/pattern/s/^/\=newText/
+	  var fname = 'blah.txt'
+	  edit `=fname`
 	enddef
 
 Closures defined in a loop will share the same context.  For example: >
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -183,11 +183,18 @@ def Test_expand_alternate_file()
 enddef
 
 def Test_global_backtick_expansion()
+  var name = 'xxx'
   new
-  setline(1, 'xx')
-  var name = 'foobar'
-  g/^xx/s/.*/`=name`
-  assert_equal('foobar', getline(1))
+  setline(1, ['one', 'two', 'three'])
+  set nomod
+  g/two/edit `=name`
+  assert_equal('xxx', bufname())
+  bwipe!
+
+  new
+  setline(1, ['one', 'two', 'three'])
+  g/two/s/^/`=name`/
+  assert_equal('`=name`two', getline(2))
   bwipe!
 enddef
 
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3710,
+/**/
     3709,
 /**/
     3708,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -9070,6 +9070,7 @@ compile_exec(char_u *line_arg, exarg_T *
     int		has_expr = FALSE;
     char_u	*nextcmd = (char_u *)"";
     char_u	*tofree = NULL;
+    char_u	*cmd_arg = NULL;
 
     if (cctx->ctx_skip == SKIP_YES)
 	goto theend;
@@ -9172,20 +9173,20 @@ compile_exec(char_u *line_arg, exarg_T *
 
 	p = skip_regexp_ex(eap->arg + 1, delim, TRUE, NULL, NULL, NULL);
 	if (*p == delim)
-	{
-	    eap->arg = p + 1;
-	    has_expr = TRUE;
-	}
+	    cmd_arg = p + 1;
     }
 
     if (eap->cmdidx == CMD_folddoopen || eap->cmdidx == CMD_folddoclosed)
+	cmd_arg = eap->arg;
+
+    if (cmd_arg != NULL)
     {
 	exarg_T nea;
 
 	CLEAR_FIELD(nea);
-	nea.cmd = eap->arg;
+	nea.cmd = cmd_arg;
 	p = find_ex_command(&nea, NULL, lookup_scriptitem, NULL);
-	if (nea.cmdidx <= CMD_SIZE)
+	if (nea.cmdidx < CMD_SIZE)
 	{
 	    has_expr = excmd_get_argt(nea.cmdidx) & (EX_XFILE | EX_EXPAND);
 	    if (has_expr)