Problem: In :let-heredoc line continuation is recognized.
Solution: Do not consume line continuation. (Ozaki Kiichi, closes #4580)
* Returns allocated string, or NULL for end of autocommands.
*/
char_u *
-getnextac(int c UNUSED, void *cookie, int indent UNUSED)
+getnextac(int c UNUSED, void *cookie, int indent UNUSED, int do_concat UNUSED)
{
AutoPatCmd *acp = (AutoPatCmd *)cookie;
char_u *retval;
*/
for (;;)
{
- line = eap->getline(0, eap->cookie, 0);
+ line = eap->getline(0, eap->cookie, 0, TRUE);
if (line == NULL)
break;
int mi = 0;
int ti = 0;
- theline = eap->getline(NUL, eap->cookie, 0);
+ theline = eap->getline(NUL, eap->cookie, 0, FALSE);
if (theline == NULL)
{
semsg(_("E990: Missing end marker '%s'"), marker);
get_list_line(
int c UNUSED,
void *cookie,
- int indent UNUSED)
+ int indent UNUSED,
+ int do_concat UNUSED)
{
listitem_T **p = (listitem_T **)cookie;
listitem_T *item = *p;
#ifdef FEAT_EVAL
eap->cstack->cs_looplevel > 0 ? -1 :
#endif
- NUL, eap->cookie, indent);
+ NUL, eap->cookie, indent, TRUE);
State = save_State;
}
lines_left = Rows - 1;
for ( ; i <= (long)ec; ++i)
msg_putchar('^');
- resp = getexmodeline('?', NULL, 0);
+ resp = getexmodeline('?', NULL, 0, TRUE);
if (resp != NULL)
{
typed = *resp;
int bad_char; /* BAD_KEEP, BAD_DROP or replacement byte */
int useridx; /* user command index */
char *errmsg; /* returned error message */
- char_u *(*getline)(int, void *, int);
+ char_u *(*getline)(int, void *, int, int);
void *cookie; /* argument for getline() */
#ifdef FEAT_EVAL
struct condstack *cstack; /* condition stack for ":if" etc. */
int save_trylevel = trylevel;
int save_did_throw = did_throw;
int save_ex_pressedreturn = get_pressedreturn();
+ int save_may_garbage_collect = may_garbage_collect;
except_T *save_current_exception = current_exception;
vimvars_save_T vvsave;
trylevel = 0;
did_throw = FALSE;
current_exception = NULL;
+ may_garbage_collect = FALSE;
save_vimvars(&vvsave);
+
timer->tr_firing = TRUE;
timer_callback(timer);
timer->tr_firing = FALSE;
must_redraw = must_redraw > save_must_redraw
? must_redraw : save_must_redraw;
set_pressedreturn(save_ex_pressedreturn);
+ may_garbage_collect = save_may_garbage_collect;
/* Only fire the timer again if it repeats and stop_timer() wasn't
* called while inside the callback (tr_id == -1). */
cookie.conv.vc_type = CONV_NONE; /* no conversion */
/* Read the first line so we can check for a UTF-8 BOM. */
- firstline = getsourceline(0, (void *)&cookie, 0);
+ firstline = getsourceline(0, (void *)&cookie, 0, TRUE);
if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef
&& firstline[1] == 0xbb && firstline[2] == 0xbf)
{
* Return NULL for end-of-file or some error.
*/
char_u *
-getsourceline(int c UNUSED, void *cookie, int indent UNUSED)
+getsourceline(int c UNUSED, void *cookie, int indent UNUSED, int do_concat)
{
struct source_cookie *sp = (struct source_cookie *)cookie;
char_u *line;
/* Only concatenate lines starting with a \ when 'cpoptions' doesn't
* contain the 'C' flag. */
- if (line != NULL && (vim_strchr(p_cpo, CPO_CONCAT) == NULL))
+ if (line != NULL && do_concat && vim_strchr(p_cpo, CPO_CONCAT) == NULL)
{
/* compensate for the one line read-ahead */
--sourcing_lnum;
*/
int
source_finished(
- char_u *(*fgetline)(int, void *, int),
+ char_u *(*fgetline)(int, void *, int, int),
void *cookie)
{
return (getline_equal(fgetline, cookie, getsourceline)
#endif
#ifdef FEAT_EVAL
-static char_u *do_one_cmd(char_u **, int, struct condstack *, char_u *(*fgetline)(int, void *, int), void *cookie);
+static char_u *do_one_cmd(char_u **, int, struct condstack *, char_u *(*fgetline)(int, void *, int, int), void *cookie);
#else
-static char_u *do_one_cmd(char_u **, int, char_u *(*fgetline)(int, void *, int), void *cookie);
+static char_u *do_one_cmd(char_u **, int, char_u *(*fgetline)(int, void *, int, int), void *cookie);
static int if_level = 0; /* depth in :if */
#endif
static void free_cmdmod(void);
int current_line; /* last read line from growarray */
int repeating; /* TRUE when looping a second time */
/* When "repeating" is FALSE use "getline" and "cookie" to get lines */
- char_u *(*getline)(int, void *, int);
+ char_u *(*getline)(int, void *, int, int);
void *cookie;
};
-static char_u *get_loop_line(int c, void *cookie, int indent);
+static char_u *get_loop_line(int c, void *cookie, int indent, int do_concat);
static int store_loop_line(garray_T *gap, char_u *line);
static void free_cmdlines(garray_T *gap);
int
do_cmdline(
char_u *cmdline,
- char_u *(*fgetline)(int, void *, int),
+ char_u *(*fgetline)(int, void *, int, int),
void *cookie, /* argument for fgetline() */
int flags)
{
struct msglist *private_msg_list;
/* "fgetline" and "cookie" passed to do_one_cmd() */
- char_u *(*cmd_getline)(int, void *, int);
+ char_u *(*cmd_getline)(int, void *, int, int);
void *cmd_cookie;
struct loop_cookie cmd_loop_cookie;
void *real_cookie;
#else
0
#endif
- )) == NULL)
+ , TRUE)) == NULL)
{
/* Don't call wait_return for aborted command line. The NULL
* returned for the end of a sourced file or executed function
* Obtain a line when inside a ":while" or ":for" loop.
*/
static char_u *
-get_loop_line(int c, void *cookie, int indent)
+get_loop_line(int c, void *cookie, int indent, int do_concat)
{
struct loop_cookie *cp = (struct loop_cookie *)cookie;
wcmd_T *wp;
/* First time inside the ":while"/":for": get line normally. */
if (cp->getline == NULL)
- line = getcmdline(c, 0L, indent);
+ line = getcmdline(c, 0L, indent, do_concat);
else
- line = cp->getline(c, cp->cookie, indent);
+ line = cp->getline(c, cp->cookie, indent, do_concat);
if (line != NULL && store_loop_line(cp->lines_gap, line) == OK)
++cp->current_line;
*/
int
getline_equal(
- char_u *(*fgetline)(int, void *, int),
+ char_u *(*fgetline)(int, void *, int, int),
void *cookie UNUSED, /* argument for fgetline() */
- char_u *(*func)(int, void *, int))
+ char_u *(*func)(int, void *, int, int))
{
#ifdef FEAT_EVAL
- char_u *(*gp)(int, void *, int);
+ char_u *(*gp)(int, void *, int, int);
struct loop_cookie *cp;
/* When "fgetline" is "get_loop_line()" use the "cookie" to find the
*/
void *
getline_cookie(
- char_u *(*fgetline)(int, void *, int) UNUSED,
+ char_u *(*fgetline)(int, void *, int, int) UNUSED,
void *cookie) /* argument for fgetline() */
{
#ifdef FEAT_EVAL
- char_u *(*gp)(int, void *, int);
+ char_u *(*gp)(int, void *, int, int);
struct loop_cookie *cp;
/* When "fgetline" is "get_loop_line()" use the "cookie" to find the
#ifdef FEAT_EVAL
struct condstack *cstack,
#endif
- char_u *(*fgetline)(int, void *, int),
+ char_u *(*fgetline)(int, void *, int, int),
void *cookie) /* argument for fgetline() */
{
char_u *p;
getcmdline(
int firstc,
long count, // only used for incremental search
- int indent) // indent for inside conditionals
+ int indent, // indent for inside conditionals
+ int do_concat UNUSED)
{
return getcmdline_int(firstc, count, indent, TRUE);
}
getexline(
int c, /* normally ':', NUL for ":append" */
void *cookie UNUSED,
- int indent) /* indent for inside conditionals */
+ int indent, /* indent for inside conditionals */
+ int do_concat)
{
/* When executing a register, remove ':' that's in front of each line. */
if (exec_from_reg && vpeekc() == ':')
(void)vgetc();
- return getcmdline(c, 1L, indent);
+ return getcmdline(c, 1L, indent, do_concat);
}
/*
int promptc, /* normally ':', NUL for ":append" and '?' for
:s prompt */
void *cookie UNUSED,
- int indent) /* indent for inside conditionals */
+ int indent, /* indent for inside conditionals */
+ int do_concat UNUSED)
{
garray_T line_ga;
char_u *pend;
#ifdef FEAT_EVAL
eap->cstack->cs_looplevel > 0 ? -1 :
#endif
- NUL, eap->cookie, 0);
+ NUL, eap->cookie, 0, TRUE);
if (theline == NULL || STRCMP(end_pattern, theline) == 0)
{
/* When using 'incsearch' the cursor may be moved to set a different search
* start position. */
- cap->searchbuf = getcmdline(cap->cmdchar, cap->count1, 0);
+ cap->searchbuf = getcmdline(cap->cmdchar, cap->count1, 0, TRUE);
if (cap->searchbuf == NULL)
{
{
char_u *new_line;
- new_line = getcmdline('=', 0L, 0);
+ new_line = getcmdline('=', 0L, 0, TRUE);
if (new_line == NULL)
return NUL;
if (*new_line == NUL) /* use previous line */
void block_autocmds(void);
void unblock_autocmds(void);
int is_autocmd_blocked(void);
-char_u *getnextac(int c, void *cookie, int indent);
+char_u *getnextac(int c, void *cookie, int indent, int do_concat);
int has_autocmd(event_T event, char_u *sfname, buf_T *buf);
char_u *get_augroup_name(expand_T *xp, int idx);
char_u *set_context_in_autocmd(expand_T *xp, char_u *arg, int doautocmd);
void scriptnames_slash_adjust(void);
char_u *get_scriptname(scid_T id);
void free_scriptnames(void);
-char_u *getsourceline(int c, void *cookie, int indent);
+char_u *getsourceline(int c, void *cookie, int indent, int do_concat);
void script_line_start(void);
void script_line_exec(void);
void script_line_end(void);
void ex_scriptversion(exarg_T *eap);
void ex_finish(exarg_T *eap);
void do_finish(exarg_T *eap, int reanimate);
-int source_finished(char_u *(*fgetline)(int, void *, int), void *cookie);
+int source_finished(char_u *(*fgetline)(int, void *, int, int), void *cookie);
void ex_checktime(exarg_T *eap);
char_u *get_mess_lang(void);
void set_lang_var(void);
/* ex_docmd.c */
void do_exmode(int improved);
int do_cmdline_cmd(char_u *cmd);
-int do_cmdline(char_u *cmdline, char_u *(*fgetline)(int, void *, int), void *cookie, int flags);
-int getline_equal(char_u *(*fgetline)(int, void *, int), void *cookie, char_u *(*func)(int, void *, int));
-void *getline_cookie(char_u *(*fgetline)(int, void *, int), void *cookie);
+int do_cmdline(char_u *cmdline, char_u *(*fgetline)(int, void *, int, int), void *cookie, int flags);
+int getline_equal(char_u *(*fgetline)(int, void *, int, int), void *cookie, char_u *(*func)(int, void *, int, int));
+void *getline_cookie(char_u *(*fgetline)(int, void *, int, int), void *cookie);
int parse_command_modifiers(exarg_T *eap, char **errormsg, int skip_only);
int parse_cmd_address(exarg_T *eap, char **errormsg, int silent);
int checkforcmd(char_u **pp, char *cmd, int len);
/* ex_getln.c */
void cmdline_init(void);
-char_u *getcmdline(int firstc, long count, int indent);
+char_u *getcmdline(int firstc, long count, int indent, int do_concat);
char_u *getcmdline_prompt(int firstc, char_u *prompt, int attr, int xp_context, char_u *xp_arg);
int text_locked(void);
void text_locked_msg(void);
char *get_text_locked_msg(void);
int curbuf_locked(void);
int allbuf_locked(void);
-char_u *getexline(int c, void *cookie, int indent);
-char_u *getexmodeline(int promptc, void *cookie, int indent);
+char_u *getexline(int c, void *cookie, int indent, int do_concat);
+char_u *getexmodeline(int promptc, void *cookie, int indent, int do_concat);
int cmdline_overstrike(void);
int cmdline_at_end(void);
colnr_T cmdline_getvcol_cursor(void);
int do_return(exarg_T *eap, int reanimate, int is_cmd, void *rettv);
void discard_pending_return(void *rettv);
char_u *get_return_cmd(void *rettv);
-char_u *get_func_line(int c, void *cookie, int indent);
+char_u *get_func_line(int c, void *cookie, int indent, int do_concat);
void func_line_start(void *cookie);
void func_line_exec(void *cookie);
void func_line_end(void *cookie);
END
call assert_equal(['something', 'endfunc'], var1)
+ " not concatenate lines
+ let var1 =<< END
+some
+ \thing
+ \ else
+END
+ call assert_equal(['some', ' \thing', ' \ else'], var1)
+
" ignore "python << xx"
let var1 =<<END
something
" horizontally or vertically.
func Test_o_arg()
let after =<< trim [CODE]
+ set cpo&vim
call writefile([winnr("$"),
\ winheight(1), winheight(2), &lines,
\ winwidth(1), winwidth(2), &columns,
hashtab_T *ht;
int todo;
hashitem_T *hi;
+ int do_concat = TRUE;
int sourcing_lnum_off;
/*
{
vim_free(line_to_free);
if (eap->getline == NULL)
- theline = getcmdline(':', 0L, indent);
+ theline = getcmdline(':', 0L, indent, do_concat);
else
- theline = eap->getline(':', eap->cookie, indent);
+ theline = eap->getline(':', eap->cookie, indent, do_concat);
line_to_free = theline;
}
if (KeyTyped)
{
VIM_CLEAR(skip_until);
VIM_CLEAR(trimmed);
+ do_concat = TRUE;
}
}
}
skip_until = vim_strsave((char_u *)".");
else
skip_until = vim_strnsave(p, (int)(skiptowhite(p) - p));
+ do_concat = FALSE;
}
}
get_func_line(
int c UNUSED,
void *cookie,
- int indent UNUSED)
+ int indent UNUSED,
+ int do_concat UNUSED)
{
funccall_T *fcp = (funccall_T *)cookie;
ufunc_T *fp = fcp->func;
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1588,
/**/
1587,
/**/