]> granicus.if.org Git - vim/commitdiff
patch 8.1.1588: in :let-heredoc line continuation is recognized v8.1.1588
authorBram Moolenaar <Bram@vim.org>
Tue, 25 Jun 2019 02:12:16 +0000 (04:12 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 25 Jun 2019 02:12:16 +0000 (04:12 +0200)
Problem:    In :let-heredoc line continuation is recognized.
Solution:   Do not consume line continuation. (Ozaki Kiichi, closes #4580)

20 files changed:
src/autocmd.c
src/digraph.c
src/eval.c
src/evalfunc.c
src/ex_cmds.c
src/ex_cmds.h
src/ex_cmds2.c
src/ex_docmd.c
src/ex_getln.c
src/normal.c
src/ops.c
src/proto/autocmd.pro
src/proto/ex_cmds2.pro
src/proto/ex_docmd.pro
src/proto/ex_getln.pro
src/proto/userfunc.pro
src/testdir/test_let.vim
src/testdir/test_startup.vim
src/userfunc.c
src/version.c

index 1abd410d9def37be2d5095cbeba3b4a055e5d078..be8e72d2efe6dd077c123e846293e8f3e7dd5656 100644 (file)
@@ -2329,7 +2329,7 @@ auto_next_pat(
  * 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;
index a26d10ca051b636ebb976eda08b22ad15fad19aa..5b56095378c0be81e77c2150dff103a0b9c44b95 100644 (file)
@@ -2378,7 +2378,7 @@ ex_loadkeymap(exarg_T *eap)
      */
     for (;;)
     {
-       line = eap->getline(0, eap->cookie, 0);
+       line = eap->getline(0, eap->cookie, 0, TRUE);
        if (line == NULL)
            break;
 
index ac9930b94f3fb3d15438309f6170fce651d52a85..f622b6f3fa5794446463dfbf5221b23e5f179c9a 100644 (file)
@@ -1307,7 +1307,7 @@ heredoc_get(exarg_T *eap, char_u *cmd)
        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);
index faedda31ce3fb1e8aa8cd4a859662f2c4519e514..dde607cdf50cbd38221ff34719f7850698607e19 100644 (file)
@@ -3234,7 +3234,8 @@ execute_redir_str(char_u *value, int value_len)
 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;
index d1068c7cff33d276e01d7eb8edc13b2fd9d5f9ac..78fe17823e3a3897c6153a6b906e255bce1ba8bf 100644 (file)
@@ -4540,7 +4540,7 @@ ex_append(exarg_T *eap)
 #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;
@@ -5388,7 +5388,7 @@ do_sub(exarg_T *eap)
                            for ( ; i <= (long)ec; ++i)
                                msg_putchar('^');
 
-                           resp = getexmodeline('?', NULL, 0);
+                           resp = getexmodeline('?', NULL, 0, TRUE);
                            if (resp != NULL)
                            {
                                typed = *resp;
index 4e5c0aac27ce3dfaf8c96a35044b3c8619978fcc..647dce0708f97166a18e4c9e8e635e64fde37580 100644 (file)
@@ -1837,7 +1837,7 @@ struct exarg
     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. */
index 2537e8d7b4ae912323aac24ef9577aaa2fd74778..8871f5dbfa3d5e6a902fcf5e52799849f4ea1ef5 100644 (file)
@@ -371,6 +371,7 @@ check_due_timer(void)
            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;
 
@@ -385,7 +386,9 @@ check_due_timer(void)
            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;
@@ -407,6 +410,7 @@ check_due_timer(void)
            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). */
@@ -3611,7 +3615,7 @@ do_source(
     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)
     {
@@ -3794,7 +3798,7 @@ free_scriptnames(void)
  * 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;
@@ -3833,7 +3837,7 @@ getsourceline(int c UNUSED, void *cookie, int indent UNUSED)
 
     /* 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;
@@ -4212,7 +4216,7 @@ do_finish(exarg_T *eap, int reanimate)
  */
     int
 source_finished(
-    char_u     *(*fgetline)(int, void *, int),
+    char_u     *(*fgetline)(int, void *, int, int),
     void       *cookie)
 {
     return (getline_equal(fgetline, cookie, getsourceline)
index d2a6681c6db975f41c62d6eb03d3ba3225d34bd9..06a62da8c0344dc3e6843d8674aa202829639e95 100644 (file)
@@ -20,9 +20,9 @@ static int    ex_pressedreturn = FALSE;
 #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);
@@ -431,11 +431,11 @@ struct loop_cookie
     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);
 
@@ -619,7 +619,7 @@ do_cmdline_cmd(char_u *cmd)
     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)
 {
@@ -644,7 +644,7 @@ do_cmdline(
     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;
@@ -894,7 +894,7 @@ do_cmdline(
 #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
@@ -1424,7 +1424,7 @@ do_cmdline(
  * 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;
@@ -1437,9 +1437,9 @@ get_loop_line(int c, void *cookie, int indent)
 
        /* 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;
 
@@ -1487,12 +1487,12 @@ free_cmdlines(garray_T *gap)
  */
     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
@@ -1517,11 +1517,11 @@ getline_equal(
  */
     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
@@ -1654,7 +1654,7 @@ do_one_cmd(
 #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;
index 4514540d80bf2866e44528ae05abc8434ffd0873..303786cc501a75329e264fe9552366ad77e5a726 100644 (file)
@@ -838,7 +838,8 @@ cmdline_init(void)
 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);
 }
@@ -2687,12 +2688,13 @@ correct_cmdspos(int idx, int cells)
 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);
 }
 
 /*
@@ -2706,7 +2708,8 @@ getexmodeline(
     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;
@@ -7409,7 +7412,7 @@ script_get(exarg_T *eap, char_u *cmd)
 #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)
        {
index 834b2319cbe7d97c0b5a9848164a7d2ac944773e..cf9026f0976250361dc99e011f2920297f246aa2 100644 (file)
@@ -6237,7 +6237,7 @@ nv_search(cmdarg_T *cap)
 
     /* 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)
     {
index 826a03cb5071e5b2c10c4c89227524a96aad4a25..a0b91f97834ba83ba91ae2fb3f4d62d9e823c41c 100644 (file)
--- a/src/ops.c
+++ b/src/ops.c
@@ -788,7 +788,7 @@ get_expr_register(void)
 {
     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 */
index a448dad0416a79cd01473ace7e1d9b79be4479b7..009c0c4fdddc36083fbea45185b1f8fc99907787 100644 (file)
@@ -30,7 +30,7 @@ int has_completechanged(void);
 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);
index 33dee0b3be8691d536d0c0786f11ff44847226fe..0d249cb9a70f77db6bda03a46df1f26a6d67801e 100644 (file)
@@ -81,7 +81,7 @@ void ex_scriptnames(exarg_T *eap);
 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);
@@ -89,7 +89,7 @@ void ex_scriptencoding(exarg_T *eap);
 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);
index 6714b38c4e45aa70a8800cbc11529448847abb0f..373c75b4e1c6755731cb8aa71d65a457e70ceb81 100644 (file)
@@ -1,9 +1,9 @@
 /* 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);
index 8845b9c77d563812db002cc8a2408a435e0b2b77..8095eff142748c00dde7893f593e6dd78be9fce8 100644 (file)
@@ -1,14 +1,14 @@
 /* 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);
index 62babf3e7d100ecfb56d00599a87685d6d233800..c9dd974fb380ebc18c72780577c52f41a89788c5 100644 (file)
@@ -30,7 +30,7 @@ void ex_call(exarg_T *eap);
 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);
index 7a547ce62361cd43644e887f66684261b035ee24..f9c0d0d1b5651fe929b07dac873b48329df95f14 100644 (file)
@@ -237,6 +237,14 @@ END
   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
index 41bb12f20d9050d1b44ffa526917c7a56b425769..6b678fb20ba137e2b30ed44d36ab2f0b7429f37d 100644 (file)
@@ -157,6 +157,7 @@ endfunc
 " 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,
index be993130d1a247b86b860a34a41344e23a23241f..864c816f24ecece623d0473b5af89e069e2462f0 100644 (file)
@@ -2007,6 +2007,7 @@ ex_function(exarg_T *eap)
     hashtab_T  *ht;
     int                todo;
     hashitem_T *hi;
+    int                do_concat = TRUE;
     int                sourcing_lnum_off;
 
     /*
@@ -2303,9 +2304,9 @@ ex_function(exarg_T *eap)
        {
            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)
@@ -2334,6 +2335,7 @@ ex_function(exarg_T *eap)
                {
                    VIM_CLEAR(skip_until);
                    VIM_CLEAR(trimmed);
+                   do_concat = TRUE;
                }
            }
        }
@@ -2458,6 +2460,7 @@ ex_function(exarg_T *eap)
                    skip_until = vim_strsave((char_u *)".");
                else
                    skip_until = vim_strnsave(p, (int)(skiptowhite(p) - p));
+               do_concat = FALSE;
            }
        }
 
@@ -3511,7 +3514,8 @@ get_return_cmd(void *rettv)
 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;
index 37f9e61c61bc787f34d362f0bf7378352f687d5b..3f3d77fd238e9bfc6d240bf97b1c75cde52e5394 100644 (file)
@@ -777,6 +777,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1588,
 /**/
     1587,
 /**/