1
0
forked from aniani/vim

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:
Bram Moolenaar
2020-10-28 13:53:50 +01:00
parent 70cf45810c
commit b4bcea474d
8 changed files with 46 additions and 11 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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,
/**/ /**/