# HG changeset patch # User Bram Moolenaar # Date 1638351006 -3600 # Node ID 80b555c4aed05abc0de464fcfea02d2289e2fcc9 # Parent 058ce5b5b367831ee8199e55d6703ba89902604c patch 8.2.3710: Vim9: backtick expression expanded for :global Commit: https://github.com/vim/vim/commit/3d2e031d4f0e1559e4a4f99de5eb2330f38f8eb5 Author: Bram Moolenaar 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. diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt --- 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 --- 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 --- 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 --- 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)