mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 8.2.1914: Vim9: cannot put line break in expression for '=' register
Problem: Vim9: cannot put line break in expression for '=' register. Solution: Pass fgetline to set_expr_line(). (closes #7209)
This commit is contained in:
19
src/eval.c
19
src/eval.c
@@ -474,9 +474,10 @@ skip_expr_concatenate(
|
|||||||
* Return pointer to allocated memory, or NULL for failure.
|
* Return pointer to allocated memory, or NULL for failure.
|
||||||
*/
|
*/
|
||||||
char_u *
|
char_u *
|
||||||
eval_to_string(
|
eval_to_string_eap(
|
||||||
char_u *arg,
|
char_u *arg,
|
||||||
int convert)
|
int convert,
|
||||||
|
exarg_T *eap)
|
||||||
{
|
{
|
||||||
typval_T tv;
|
typval_T tv;
|
||||||
char_u *retval;
|
char_u *retval;
|
||||||
@@ -484,8 +485,10 @@ eval_to_string(
|
|||||||
#ifdef FEAT_FLOAT
|
#ifdef FEAT_FLOAT
|
||||||
char_u numbuf[NUMBUFLEN];
|
char_u numbuf[NUMBUFLEN];
|
||||||
#endif
|
#endif
|
||||||
|
evalarg_T evalarg;
|
||||||
|
|
||||||
if (eval0(arg, &tv, NULL, &EVALARG_EVALUATE) == FAIL)
|
fill_evalarg_from_eap(&evalarg, eap, eap != NULL && eap->skip);
|
||||||
|
if (eval0(arg, &tv, NULL, &evalarg) == FAIL)
|
||||||
retval = NULL;
|
retval = NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -512,11 +515,19 @@ eval_to_string(
|
|||||||
retval = vim_strsave(tv_get_string(&tv));
|
retval = vim_strsave(tv_get_string(&tv));
|
||||||
clear_tv(&tv);
|
clear_tv(&tv);
|
||||||
}
|
}
|
||||||
clear_evalarg(&EVALARG_EVALUATE, NULL);
|
clear_evalarg(&evalarg, NULL);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char_u *
|
||||||
|
eval_to_string(
|
||||||
|
char_u *arg,
|
||||||
|
int convert)
|
||||||
|
{
|
||||||
|
return eval_to_string_eap(arg, convert, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call eval_to_string() without using current local variables and using
|
* Call eval_to_string() without using current local variables and using
|
||||||
* textwinlock. When "use_sandbox" is TRUE use the sandbox.
|
* textwinlock. When "use_sandbox" is TRUE use the sandbox.
|
||||||
|
@@ -1719,6 +1719,7 @@ do_one_cmd(
|
|||||||
#ifdef FEAT_EVAL
|
#ifdef FEAT_EVAL
|
||||||
int may_have_range;
|
int may_have_range;
|
||||||
int vim9script = in_vim9script();
|
int vim9script = in_vim9script();
|
||||||
|
int did_set_expr_line = FALSE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CLEAR_FIELD(ea);
|
CLEAR_FIELD(ea);
|
||||||
@@ -2315,8 +2316,9 @@ do_one_cmd(
|
|||||||
// for '=' register: accept the rest of the line as an expression
|
// for '=' register: accept the rest of the line as an expression
|
||||||
if (ea.arg[-1] == '=' && ea.arg[0] != NUL)
|
if (ea.arg[-1] == '=' && ea.arg[0] != NUL)
|
||||||
{
|
{
|
||||||
set_expr_line(vim_strsave(ea.arg));
|
set_expr_line(vim_strsave(ea.arg), &ea);
|
||||||
ea.arg += STRLEN(ea.arg);
|
ea.arg += STRLEN(ea.arg);
|
||||||
|
did_set_expr_line = TRUE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
ea.arg = skipwhite(ea.arg);
|
ea.arg = skipwhite(ea.arg);
|
||||||
@@ -2595,6 +2597,9 @@ doend:
|
|||||||
do_errthrow(cstack,
|
do_errthrow(cstack,
|
||||||
(ea.cmdidx != CMD_SIZE && !IS_USER_CMDIDX(ea.cmdidx))
|
(ea.cmdidx != CMD_SIZE && !IS_USER_CMDIDX(ea.cmdidx))
|
||||||
? cmdnames[(int)ea.cmdidx].cmd_name : (char_u *)NULL);
|
? cmdnames[(int)ea.cmdidx].cmd_name : (char_u *)NULL);
|
||||||
|
|
||||||
|
if (did_set_expr_line)
|
||||||
|
set_expr_line(NULL, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
undo_cmdmod(&cmdmod);
|
undo_cmdmod(&cmdmod);
|
||||||
|
@@ -1131,7 +1131,7 @@ free_all_mem(void)
|
|||||||
free_signs();
|
free_signs();
|
||||||
# endif
|
# endif
|
||||||
# ifdef FEAT_EVAL
|
# ifdef FEAT_EVAL
|
||||||
set_expr_line(NULL);
|
set_expr_line(NULL, NULL);
|
||||||
# endif
|
# endif
|
||||||
# ifdef FEAT_DIFF
|
# ifdef FEAT_DIFF
|
||||||
if (curtab != NULL)
|
if (curtab != NULL)
|
||||||
|
@@ -11,6 +11,7 @@ int eval_expr_to_bool(typval_T *expr, int *error);
|
|||||||
char_u *eval_to_string_skip(char_u *arg, exarg_T *eap, int skip);
|
char_u *eval_to_string_skip(char_u *arg, exarg_T *eap, int skip);
|
||||||
int skip_expr(char_u **pp, evalarg_T *evalarg);
|
int skip_expr(char_u **pp, evalarg_T *evalarg);
|
||||||
int skip_expr_concatenate(char_u **arg, char_u **start, char_u **end, evalarg_T *evalarg);
|
int skip_expr_concatenate(char_u **arg, char_u **start, char_u **end, evalarg_T *evalarg);
|
||||||
|
char_u *eval_to_string_eap(char_u *arg, int convert, exarg_T *eap);
|
||||||
char_u *eval_to_string(char_u *arg, int convert);
|
char_u *eval_to_string(char_u *arg, int convert);
|
||||||
char_u *eval_to_string_safe(char_u *arg, int use_sandbox);
|
char_u *eval_to_string_safe(char_u *arg, int use_sandbox);
|
||||||
varnumber_T eval_to_number(char_u *expr);
|
varnumber_T eval_to_number(char_u *expr);
|
||||||
|
@@ -6,7 +6,7 @@ yankreg_T *get_y_previous(void);
|
|||||||
void set_y_current(yankreg_T *yreg);
|
void set_y_current(yankreg_T *yreg);
|
||||||
void set_y_previous(yankreg_T *yreg);
|
void set_y_previous(yankreg_T *yreg);
|
||||||
int get_expr_register(void);
|
int get_expr_register(void);
|
||||||
void set_expr_line(char_u *new_line);
|
void set_expr_line(char_u *new_line, exarg_T *eap);
|
||||||
char_u *get_expr_line(void);
|
char_u *get_expr_line(void);
|
||||||
int valid_yank_reg(int regname, int writing);
|
int valid_yank_reg(int regname, int writing);
|
||||||
int get_yank_register(int regname, int writing);
|
int get_yank_register(int regname, int writing);
|
||||||
|
@@ -79,6 +79,7 @@ set_y_previous(yankreg_T *yreg)
|
|||||||
* Keep the last expression line here, for repeating.
|
* Keep the last expression line here, for repeating.
|
||||||
*/
|
*/
|
||||||
static char_u *expr_line = NULL;
|
static char_u *expr_line = NULL;
|
||||||
|
static exarg_T *expr_eap = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get an expression for the "\"=expr1" or "CTRL-R =expr1"
|
* Get an expression for the "\"=expr1" or "CTRL-R =expr1"
|
||||||
@@ -95,19 +96,22 @@ get_expr_register(void)
|
|||||||
if (*new_line == NUL) // use previous line
|
if (*new_line == NUL) // use previous line
|
||||||
vim_free(new_line);
|
vim_free(new_line);
|
||||||
else
|
else
|
||||||
set_expr_line(new_line);
|
set_expr_line(new_line, NULL);
|
||||||
return '=';
|
return '=';
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the expression for the '=' register.
|
* Set the expression for the '=' register.
|
||||||
* Argument must be an allocated string.
|
* Argument must be an allocated string.
|
||||||
|
* "eap" may be used if the next line needs to be checked when evaluating the
|
||||||
|
* expression.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
set_expr_line(char_u *new_line)
|
set_expr_line(char_u *new_line, exarg_T *eap)
|
||||||
{
|
{
|
||||||
vim_free(expr_line);
|
vim_free(expr_line);
|
||||||
expr_line = new_line;
|
expr_line = new_line;
|
||||||
|
expr_eap = eap;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -136,7 +140,7 @@ get_expr_line(void)
|
|||||||
return expr_copy;
|
return expr_copy;
|
||||||
|
|
||||||
++nested;
|
++nested;
|
||||||
rv = eval_to_string(expr_copy, TRUE);
|
rv = eval_to_string_eap(expr_copy, TRUE, expr_eap);
|
||||||
--nested;
|
--nested;
|
||||||
vim_free(expr_copy);
|
vim_free(expr_copy);
|
||||||
return rv;
|
return rv;
|
||||||
@@ -2774,7 +2778,7 @@ write_reg_contents_ex(
|
|||||||
vim_free(p);
|
vim_free(p);
|
||||||
p = s;
|
p = s;
|
||||||
}
|
}
|
||||||
set_expr_line(p);
|
set_expr_line(p, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2859,6 +2859,18 @@ def Test_catch_exception_in_callback()
|
|||||||
unlet g:caught
|
unlet g:caught
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
def Test_put_with_linebreak()
|
||||||
|
new
|
||||||
|
var lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
pu=split('abc', '\zs')
|
||||||
|
->join()
|
||||||
|
END
|
||||||
|
CheckScriptSuccess(lines)
|
||||||
|
getline(2)->assert_equal('a b c')
|
||||||
|
bwipe!
|
||||||
|
enddef
|
||||||
|
|
||||||
" Keep this last, it messes up highlighting.
|
" Keep this last, it messes up highlighting.
|
||||||
def Test_substitute_cmd()
|
def Test_substitute_cmd()
|
||||||
new
|
new
|
||||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1914,
|
||||||
/**/
|
/**/
|
||||||
1913,
|
1913,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user