1
0
forked from aniani/vim

patch 8.2.3710: Vim9: backtick expression expanded for :global

Problem:    Vim9: backtick expression expanded for :global.
Solution:   Check the following command.
This commit is contained in:
Bram Moolenaar
2021-12-01 09:27:20 +00:00
parent fad2742d53
commit 3d2e031d4f
4 changed files with 24 additions and 20 deletions

View File

@@ -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: >

View File

@@ -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

View File

@@ -753,6 +753,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
3710,
/**/
3709,
/**/

View File

@@ -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)