summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-12-01 09:27:20 +0000
committerBram Moolenaar <Bram@vim.org>2021-12-01 09:27:20 +0000
commit3d2e031d4f0e1559e4a4f99de5eb2330f38f8eb5 (patch)
tree281d80ef4a30e818d196cd870b7a3e05aaa49e5f
parentfad2742d538123abb9b384a053fd581f2acf6bb0 (diff)
patch 8.2.3710: Vim9: backtick expression expanded for :globalv8.2.3710
Problem: Vim9: backtick expression expanded for :global. Solution: Check the following command.
-rw-r--r--runtime/doc/vim9.txt14
-rw-r--r--src/testdir/test_vim9_cmd.vim15
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c13
4 files changed, 24 insertions, 20 deletions
diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt
index dc39559c07..9329aa9c7c 100644
--- 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: >
diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim
index 2fbccf4a71..ece3f734f0 100644
--- 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
diff --git a/src/version.c b/src/version.c
index be24950927..37d383247b 100644
--- 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,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 40dd00f7c1..3f72c7f39a 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -9070,6 +9070,7 @@ compile_exec(char_u *line_arg, exarg_T *eap, cctx_T *cctx)
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 *eap, cctx_T *cctx)
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)