summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/repeat.txt18
-rw-r--r--runtime/indent/vim.vim18
-rw-r--r--src/ex_cmds2.c37
-rw-r--r--src/testdir/test_eval_stuff.vim11
-rw-r--r--src/version.c2
5 files changed, 63 insertions, 23 deletions
diff --git a/runtime/doc/repeat.txt b/runtime/doc/repeat.txt
index 55aed248b1..c4b38a32d8 100644
--- a/runtime/doc/repeat.txt
+++ b/runtime/doc/repeat.txt
@@ -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*
diff --git a/runtime/indent/vim.vim b/runtime/indent/vim.vim
index 8ebfa12caf..cd735c3a3c 100644
--- a/runtime/indent/vim.vim
+++ b/runtime/indent/vim.vim
@@ -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
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 28245d1781..c0cb87f70a 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -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);
diff --git a/src/testdir/test_eval_stuff.vim b/src/testdir/test_eval_stuff.vim
index 41ba1374d8..bcf45cc784 100644
--- a/src/testdir/test_eval_stuff.vim
+++ b/src/testdir/test_eval_stuff.vim
@@ -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
diff --git a/src/version.c b/src/version.c
index 48cd6d20bd..95fa7dae3c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -795,6 +795,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 369,
+/**/
368,
/**/
367,