diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-12-01 09:27:20 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-12-01 09:27:20 +0000 |
commit | 3d2e031d4f0e1559e4a4f99de5eb2330f38f8eb5 (patch) | |
tree | 281d80ef4a30e818d196cd870b7a3e05aaa49e5f | |
parent | fad2742d538123abb9b384a053fd581f2acf6bb0 (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.txt | 14 | ||||
-rw-r--r-- | src/testdir/test_vim9_cmd.vim | 15 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 13 |
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) |