]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.1.0369: continuation lines cannot contain comments v8.1.0369
authorBram Moolenaar <Bram@vim.org>
Tue, 11 Sep 2018 20:37:29 +0000 (22:37 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 11 Sep 2018 20:37:29 +0000 (22:37 +0200)
Problem:    Continuation lines cannot contain comments.
Solution:   Support using "\ .

runtime/doc/repeat.txt
runtime/indent/vim.vim
src/ex_cmds2.c
src/testdir/test_eval_stuff.vim
src/version.c

index 55aed248b15e13f677919c8abc0e3dd7827679bf..c4b38a32d8bd54a16ee41561175d4d120118f5ed 100644 (file)
@@ -465,6 +465,16 @@ flag when defining the function, it is not relevant when executing it. >
    .
    :endfunction
    :set cpo-=C
+<
+                                       *line-continuation-comment*
+To add a comment in between the lines start with '\" '.  Notice the space
+after the double quote.  Example: >
+       let array = [
+               "\ first entry comment
+               \ 'first',
+               "\ second entry comment
+               \ 'second',
+               \ ]
 
 Rationale:
        Most programs work with a trailing backslash to indicate line
@@ -473,6 +483,14 @@ Rationale:
                :map xx  asdf\
 <      Therefore the unusual leading backslash is used.
 
+       Starting a comment in a continuation line results in all following
+       continuation lines to be part of the comment.  Since it was like this
+       for a long time, when making it possible to add a comment halfway a
+       sequence of continuation lines, it was not possible to use \", since
+       that was a valid continuation line.  Using '"\ ' comes closest, even
+       though it may look a bit weird.  Requiring the space after the
+       backslash is to make it very unlikely this is a normal comment line.
+
 ==============================================================================
 5. Using Vim packages                                  *packages*
 
index 8ebfa12cafc27baf498fc58e5ce9f879fd563c06..cd735c3a3c89b271120bc15c3482120337458674 100644 (file)
@@ -10,7 +10,7 @@ endif
 let b:did_indent = 1
 
 setlocal indentexpr=GetVimIndent()
-setlocal indentkeys+==end,=else,=cat,=fina,=END,0\\
+setlocal indentkeys+==end,=else,=cat,=fina,=END,0\\,0=\"\\\ 
 
 let b:undo_indent = "setl indentkeys< indentexpr<"
 
@@ -31,15 +31,17 @@ function GetVimIndent()
   endtry
 endfunc
 
+let s:lineContPat = '^\s*\(\\\|"\\ \)'
+
 function GetVimIndentIntern()
   " Find a non-blank line above the current line.
   let lnum = prevnonblank(v:lnum - 1)
 
-  " If the current line doesn't start with '\' and below a line that starts
-  " with '\', use the indent of the line above it.
+  " If the current line doesn't start with '\' or '"\ ' and below a line that
+  " starts with '\' or '"\ ', use the indent of the line above it.
   let cur_text = getline(v:lnum)
-  if cur_text !~ '^\s*\\'
-    while lnum > 0 && getline(lnum) =~ '^\s*\\'
+  if cur_text !~ s:lineContPat
+    while lnum > 0 && getline(lnum) =~ s:lineContPat
       let lnum = lnum - 1
     endwhile
   endif
@@ -51,10 +53,10 @@ function GetVimIndentIntern()
   let prev_text = getline(lnum)
 
   " Add a 'shiftwidth' after :if, :while, :try, :catch, :finally, :function
-  " and :else.  Add it three times for a line that starts with '\' after
-  " a line that doesn't (or g:vim_indent_cont if it exists).
+  " and :else.  Add it three times for a line that starts with '\' or '"\ '
+  " after a line that doesn't (or g:vim_indent_cont if it exists).
   let ind = indent(lnum)
-  if cur_text =~ '^\s*\\' && v:lnum > 1 && prev_text !~ '^\s*\\'
+  if cur_text =~ s:lineContPat && v:lnum > 1 && prev_text !~ s:lineContPat
     if exists("g:vim_indent_cont")
       let ind = ind + g:vim_indent_cont
     else
index 28245d1781c56c006df7c67c18ba9edf836f2dfc..c0cb87f70ad58422cd4227145950c1f7454ef730 100644 (file)
@@ -4864,17 +4864,21 @@ getsourceline(int c UNUSED, void *cookie, int indent UNUSED)
        /* compensate for the one line read-ahead */
        --sourcing_lnum;
 
-       /* Get the next line and concatenate it when it starts with a
-        * backslash. We always need to read the next line, keep it in
-        * sp->nextline. */
+       // Get the next line and concatenate it when it starts with a
+       // backslash. We always need to read the next line, keep it in
+       // sp->nextline.
+       /* Also check for a comment in between continuation lines: "\ */
        sp->nextline = get_one_sourceline(sp);
-       if (sp->nextline != NULL && *(p = skipwhite(sp->nextline)) == '\\')
+       if (sp->nextline != NULL
+               && (*(p = skipwhite(sp->nextline)) == '\\'
+                             || (p[0] == '"' && p[1] == '\\' && p[2] == ' ')))
        {
            garray_T    ga;
 
            ga_init2(&ga, (int)sizeof(char_u), 400);
            ga_concat(&ga, line);
-           ga_concat(&ga, p + 1);
+           if (*p == '\\')
+               ga_concat(&ga, p + 1);
            for (;;)
            {
                vim_free(sp->nextline);
@@ -4882,18 +4886,21 @@ getsourceline(int c UNUSED, void *cookie, int indent UNUSED)
                if (sp->nextline == NULL)
                    break;
                p = skipwhite(sp->nextline);
-               if (*p != '\\')
-                   break;
-               /* Adjust the growsize to the current length to speed up
-                * concatenating many lines. */
-               if (ga.ga_len > 400)
+               if (*p == '\\')
                {
-                   if (ga.ga_len > 8000)
-                       ga.ga_growsize = 8000;
-                   else
-                       ga.ga_growsize = ga.ga_len;
+                   // Adjust the growsize to the current length to speed up
+                   // concatenating many lines.
+                   if (ga.ga_len > 400)
+                   {
+                       if (ga.ga_len > 8000)
+                           ga.ga_growsize = 8000;
+                       else
+                           ga.ga_growsize = ga.ga_len;
+                   }
+                   ga_concat(&ga, p + 1);
                }
-               ga_concat(&ga, p + 1);
+               else if (p[0] != '"' || p[1] != '\\' || p[2] != ' ')
+                   break;
            }
            ga_append(&ga, NUL);
            vim_free(line);
index 41ba1374d8e054578dda7affb2b0119cf9bfd5dd..bcf45cc784fdb92bb7be2c982e6d37cf92b623a2 100644 (file)
@@ -42,3 +42,14 @@ func Test_mkdir_p()
   call delete('Xfile')
   call delete('Xmkdir', 'rf')
 endfunc
+
+func Test_line_continuation()
+  let array = [5,
+       "\ ignore this
+       \ 6,
+       "\ more to ignore
+       "\ more moreto ignore
+       \ ]
+       "\ and some more
+  call assert_equal([5, 6], array)
+endfunc
index 48cd6d20bd66b252f9f5610c22c6b2f9f717fc92..95fa7dae3cccc9becaeb011d8004900c23636230 100644 (file)
@@ -794,6 +794,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    369,
 /**/
     368,
 /**/