mirror of
https://github.com/vim/vim.git
synced 2025-10-03 05:14:07 -04:00
patch 8.2.4934: string interpolation fails when not evaluating
Problem: String interpolation fails when not evaluating. Solution: Skip the expression when not evaluating. (closes #10398)
This commit is contained in:
@@ -605,10 +605,11 @@ list_script_vars(int *first)
|
||||
/*
|
||||
* Evaluate one Vim expression {expr} in string "p" and append the
|
||||
* resulting string to "gap". "p" points to the opening "{".
|
||||
* When "evaluate" is FALSE only skip over the expression.
|
||||
* Return a pointer to the character after "}", NULL for an error.
|
||||
*/
|
||||
char_u *
|
||||
eval_one_expr_in_str(char_u *p, garray_T *gap)
|
||||
eval_one_expr_in_str(char_u *p, garray_T *gap, int evaluate)
|
||||
{
|
||||
char_u *block_start = skipwhite(p + 1); // skip the opening {
|
||||
char_u *block_end = block_start;
|
||||
@@ -627,6 +628,8 @@ eval_one_expr_in_str(char_u *p, garray_T *gap)
|
||||
semsg(_(e_missing_close_curly_str), p);
|
||||
return NULL;
|
||||
}
|
||||
if (evaluate)
|
||||
{
|
||||
*block_end = NUL;
|
||||
expr_val = eval_to_string(block_start, TRUE);
|
||||
*block_end = '}';
|
||||
@@ -634,6 +637,7 @@ eval_one_expr_in_str(char_u *p, garray_T *gap)
|
||||
return NULL;
|
||||
ga_concat(gap, expr_val);
|
||||
vim_free(expr_val);
|
||||
}
|
||||
|
||||
return block_end + 1;
|
||||
}
|
||||
@@ -691,7 +695,7 @@ eval_all_expr_in_str(char_u *str)
|
||||
}
|
||||
|
||||
// Evaluate the expression and append the result.
|
||||
p = eval_one_expr_in_str(p, &ga);
|
||||
p = eval_one_expr_in_str(p, &ga, TRUE);
|
||||
if (p == NULL)
|
||||
{
|
||||
ga_clear(&ga);
|
||||
|
@@ -13,7 +13,7 @@ list_T *eval_spell_expr(char_u *badword, char_u *expr);
|
||||
int get_spellword(list_T *list, char_u **pp);
|
||||
void prepare_vimvar(int idx, typval_T *save_tv);
|
||||
void restore_vimvar(int idx, typval_T *save_tv);
|
||||
char_u *eval_one_expr_in_str(char_u *p, garray_T *gap);
|
||||
char_u *eval_one_expr_in_str(char_u *p, garray_T *gap, int evaluate);
|
||||
char_u *eval_all_expr_in_str(char_u *str);
|
||||
list_T *heredoc_get(exarg_T *eap, char_u *cmd, int script_get, int vim9compile);
|
||||
void ex_var(exarg_T *eap);
|
||||
|
@@ -2156,6 +2156,13 @@ def Test_expr8_string()
|
||||
->split($'x{x}x')
|
||||
->map((_, v: string) => v =~ 'bar')
|
||||
assert_equal([false, true, false], vl)
|
||||
|
||||
# interpolated string in a lambda
|
||||
lines =<< trim END
|
||||
assert_equal(['gnome-256color', 'xterm-256color'], ['gnome', 'xterm']
|
||||
->map((_, term: string) => $'{term}-256color'))
|
||||
END
|
||||
v9.CheckDefAndScriptSuccess(lines)
|
||||
enddef
|
||||
|
||||
def Test_expr8_vimvar()
|
||||
|
@@ -2363,7 +2363,7 @@ eval_interp_string(char_u **arg, typval_T *rettv, int evaluate)
|
||||
++*arg;
|
||||
break;
|
||||
}
|
||||
p = eval_one_expr_in_str(*arg, &ga);
|
||||
p = eval_one_expr_in_str(*arg, &ga, evaluate);
|
||||
if (p == NULL)
|
||||
{
|
||||
ret = FAIL;
|
||||
|
@@ -746,6 +746,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
4934,
|
||||
/**/
|
||||
4933,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user