vim-patch:8.1.1585: :let-heredoc does not trim enough

Problem:    :let-heredoc does not trim enough.
Solution:   Trim indent from the contents based on the indent of the first
            line.  Use let-heredoc in more tests.
e7eb92708e
This commit is contained in:
Jurica Bradaric 2019-10-12 09:48:48 +02:00
parent 9af0fe529d
commit 6c012b0624
11 changed files with 461 additions and 413 deletions

View File

@ -9793,13 +9793,24 @@ text...
If {marker} is not supplied, then "." is used as the If {marker} is not supplied, then "." is used as the
default marker. default marker.
Any white space characters in the lines of text are Without "trim" any white space characters in the lines
preserved. If "trim" is specified before {marker}, of text are preserved. If "trim" is specified before
then all the leading indentation exactly matching the {marker}, then indentation is stripped so you can do: >
leading indentation before `let` is stripped from the let text =<< trim END
input lines and the line containing {marker}. Note if ok
that the difference between space and tab matters echo 'done'
here. endif
END
< Results in: ["if ok", " echo 'done'", "endif"]
The marker must line up with "let" and the indentation
of the first line is removed from all the text lines.
Specifically: all the leading indentation exactly
matching the leading indentation of the first
non-empty text line is stripped from the input lines.
All leading indentation exactly matching the leading
indentation before `let` is stripped from the line
containing {marker}. Note that the difference between
space and tab matters here.
If {var-name} didn't exist yet, it is created. If {var-name} didn't exist yet, it is created.
Cannot be followed by another command, but can be Cannot be followed by another command, but can be

View File

@ -1521,7 +1521,9 @@ heredoc_get(exarg_T *eap, char_u *cmd)
{ {
char_u *marker; char_u *marker;
char_u *p; char_u *p;
int indent_len = 0; int marker_indent_len = 0;
int text_indent_len = 0;
char_u *text_indent = NULL;
if (eap->getline == NULL) { if (eap->getline == NULL) {
EMSG(_("E991: cannot use =<< here")); EMSG(_("E991: cannot use =<< here"));
@ -1534,14 +1536,16 @@ heredoc_get(exarg_T *eap, char_u *cmd)
&& (cmd[4] == NUL || ascii_iswhite(cmd[4]))) { && (cmd[4] == NUL || ascii_iswhite(cmd[4]))) {
cmd = skipwhite(cmd + 4); cmd = skipwhite(cmd + 4);
// Trim the indentation from all the lines in the here document // Trim the indentation from all the lines in the here document.
// The amount of indentation trimmed is the same as the indentation of // The amount of indentation trimmed is the same as the indentation of
// the :let command line. // the first line after the :let command line. To find the end marker
// the indent of the :let command line is trimmed.
p = *eap->cmdlinep; p = *eap->cmdlinep;
while (ascii_iswhite(*p)) { while (ascii_iswhite(*p)) {
p++; p++;
indent_len++; marker_indent_len++;
} }
text_indent_len = -1;
} }
// The marker is the next word. Default marker is "." // The marker is the next word. Default marker is "."
@ -1559,28 +1563,48 @@ heredoc_get(exarg_T *eap, char_u *cmd)
list_T *l = tv_list_alloc(0); list_T *l = tv_list_alloc(0);
for (;;) { for (;;) {
int i = 0; int mi = 0;
int ti = 0;
char_u *theline = eap->getline(NUL, eap->cookie, 0, false); char_u *theline = eap->getline(NUL, eap->cookie, 0, false);
if (theline != NULL && indent_len > 0) {
// trim the indent matching the first line
if (STRNCMP(theline, *eap->cmdlinep, indent_len) == 0) {
i = indent_len;
}
}
if (theline == NULL) { if (theline == NULL) {
EMSG2(_("E990: Missing end marker '%s'"), marker); EMSG2(_("E990: Missing end marker '%s'"), marker);
break; break;
} }
if (STRCMP(marker, theline + i) == 0) {
// with "trim": skip the indent matching the :let line to find the
// marker
if (marker_indent_len > 0
&& STRNCMP(theline, *eap->cmdlinep, marker_indent_len) == 0) {
mi = marker_indent_len;
}
if (STRCMP(marker, theline + mi) == 0) {
xfree(theline); xfree(theline);
break; break;
} }
if (text_indent_len == -1 && *theline != NUL) {
// set the text indent from the first line.
p = theline;
text_indent_len = 0;
while (ascii_iswhite(*p)) {
p++;
text_indent_len++;
}
text_indent = vim_strnsave(theline, text_indent_len);
}
// with "trim": skip the indent matching the first line
if (text_indent != NULL) {
for (ti = 0; ti < text_indent_len; ti++) {
if (theline[ti] != text_indent[ti]) {
break;
}
}
}
tv_list_append_string(l, (char *)(theline + i), -1); tv_list_append_string(l, (char *)(theline + ti), -1);
xfree(theline); xfree(theline);
} }
xfree(text_indent);
return l; return l;
} }

View File

@ -19,23 +19,23 @@ func Test_cino_extern_c()
" Test for cino-E " Test for cino-E
let without_ind =<< trim [CODE] let without_ind =<< trim [CODE]
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
int func_a(void); int func_a(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
[CODE] [CODE]
let with_ind =<< trim [CODE] let with_ind =<< trim [CODE]
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
int func_a(void); int func_a(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
[CODE] [CODE]
new new
setlocal cindent cinoptions=E0 setlocal cindent cinoptions=E0
@ -90,30 +90,30 @@ func Test_cindent_expr()
endfunc endfunc
setl expandtab sw=8 indentkeys+=; indentexpr=MyIndentFunction() setl expandtab sw=8 indentkeys+=; indentexpr=MyIndentFunction()
let testinput =<< trim [CODE] let testinput =<< trim [CODE]
var_a = something() var_a = something()
b = something() b = something()
[CODE] [CODE]
call setline(1, testinput) call setline(1, testinput)
call cursor(1, 1) call cursor(1, 1)
call feedkeys("^\<c-v>j$A;\<esc>", 'tnix') call feedkeys("^\<c-v>j$A;\<esc>", 'tnix')
let expected =<< trim [CODE] let expected =<< [CODE]
var_a = something(); var_a = something();
b = something(); b = something();
[CODE] [CODE]
call assert_equal(expected, getline(1, '$')) call assert_equal(expected, getline(1, '$'))
%d %d
let testinput =<< trim [CODE] let testinput =<< [CODE]
var_a = something() var_a = something()
b = something() b = something()
[CODE] [CODE]
call setline(1, testinput) call setline(1, testinput)
call cursor(1, 1) call cursor(1, 1)
call feedkeys("^\<c-v>j$A;\<esc>", 'tnix') call feedkeys("^\<c-v>j$A;\<esc>", 'tnix')
let expected =<< trim [CODE] let expected =<< [CODE]
var_a = something(); var_a = something();
b = something() b = something()
[CODE] [CODE]
call assert_equal(expected, getline(1, '$')) call assert_equal(expected, getline(1, '$'))
bw! bw!
endfunc endfunc

View File

@ -26,27 +26,29 @@ func Test_Debugger()
endif endif
" Create a Vim script with some functions " Create a Vim script with some functions
call writefile([ let lines =<< trim END
\ 'func Foo()', func Foo()
\ ' let var1 = 1', let var1 = 1
\ ' let var2 = Bar(var1) + 9', let var2 = Bar(var1) + 9
\ ' return var2', return var2
\ 'endfunc', endfunc
\ 'func Bar(var)', func Bar(var)
\ ' let var1 = 2 + a:var', let var1 = 2 + a:var
\ ' let var2 = Bazz(var1) + 4', let var2 = Bazz(var1) + 4
\ ' return var2', return var2
\ 'endfunc', endfunc
\ 'func Bazz(var)', func Bazz(var)
\ ' try', try
\ ' let var1 = 3 + a:var', let var1 = 3 + a:var
\ ' let var3 = "another var"', let var3 = "another var"
\ ' let var3 = "value2"', let var3 = "value2"
\ ' catch', catch
\ ' let var4 = "exception"', let var4 = "exception"
\ ' endtry', endtry
\ ' return var1', return var1
\ 'endfunc'], 'Xtest.vim') endfunc
END
call writefile(lines, 'Xtest.vim')
" Start Vim in a terminal " Start Vim in a terminal
let buf = RunVimInTerminal('-S Xtest.vim', {}) let buf = RunVimInTerminal('-S Xtest.vim', {})
@ -294,11 +296,13 @@ func Test_Debugger()
" Tests for :breakadd file and :breakadd here " Tests for :breakadd file and :breakadd here
" Breakpoints should be set before sourcing the file " Breakpoints should be set before sourcing the file
call writefile([ let lines =<< trim END
\ 'let var1 = 10', let var1 = 10
\ 'let var2 = 20', let var2 = 20
\ 'let var3 = 30', let var3 = 30
\ 'let var4 = 40'], 'Xtest.vim') let var4 = 40
END
call writefile(lines, 'Xtest.vim')
" Start Vim in a terminal " Start Vim in a terminal
let buf = RunVimInTerminal('Xtest.vim', {}) let buf = RunVimInTerminal('Xtest.vim', {})

View File

@ -16,12 +16,12 @@ endfunc
func Test_gD() func Test_gD()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int x; int x;
int func(void) int func(void)
{ {
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gD', lines, 1, 5) call XTest_goto_decl('gD', lines, 1, 5)
@ -29,12 +29,12 @@ endfunc
func Test_gD_too() func Test_gD_too()
let lines =<< trim [CODE] let lines =<< trim [CODE]
Filename x;
int Filename
int func() {
Filename x; Filename x;
return x;
int Filename
int func() {
Filename x;
return x;
[CODE] [CODE]
call XTest_goto_decl('gD', lines, 1, 10) call XTest_goto_decl('gD', lines, 1, 10)
@ -42,13 +42,13 @@ endfunc
func Test_gD_comment() func Test_gD_comment()
let lines =<< trim [CODE] let lines =<< trim [CODE]
/* int x; */ /* int x; */
int x; int x;
int func(void) int func(void)
{ {
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gD', lines, 2, 5) call XTest_goto_decl('gD', lines, 2, 5)
@ -56,13 +56,13 @@ endfunc
func Test_gD_inline_comment() func Test_gD_inline_comment()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int y /* , x */; int y /* , x */;
int x; int x;
int func(void) int func(void)
{ {
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gD', lines, 2, 5) call XTest_goto_decl('gD', lines, 2, 5)
@ -70,13 +70,13 @@ endfunc
func Test_gD_string() func Test_gD_string()
let lines =<< trim [CODE] let lines =<< trim [CODE]
char *s[] = "x"; char *s[] = "x";
int x = 1; int x = 1;
int func(void) int func(void)
{ {
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gD', lines, 2, 5) call XTest_goto_decl('gD', lines, 2, 5)
@ -84,12 +84,12 @@ endfunc
func Test_gD_string_same_line() func Test_gD_string_same_line()
let lines =<< trim [CODE] let lines =<< trim [CODE]
char *s[] = "x", int x = 1; char *s[] = "x", int x = 1;
int func(void) int func(void)
{ {
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gD', lines, 1, 22) call XTest_goto_decl('gD', lines, 1, 22)
@ -97,13 +97,13 @@ endfunc
func Test_gD_char() func Test_gD_char()
let lines =<< trim [CODE] let lines =<< trim [CODE]
char c = 'x'; char c = 'x';
int x = 1; int x = 1;
int func(void) int func(void)
{ {
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gD', lines, 2, 5) call XTest_goto_decl('gD', lines, 2, 5)
@ -111,12 +111,12 @@ endfunc
func Test_gd() func Test_gd()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int x; int x;
int func(int x) int func(int x)
{ {
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gd', lines, 3, 14) call XTest_goto_decl('gd', lines, 3, 14)
@ -124,15 +124,15 @@ endfunc
func Test_gd_not_local() func Test_gd_not_local()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int func1(void) int func1(void)
{ {
return x; return x;
} }
int func2(int x) int func2(int x)
{ {
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gd', lines, 3, 10) call XTest_goto_decl('gd', lines, 3, 10)
@ -140,11 +140,11 @@ endfunc
func Test_gd_kr_style() func Test_gd_kr_style()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int func(x) int func(x)
int x; int x;
{ {
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gd', lines, 2, 7) call XTest_goto_decl('gd', lines, 2, 7)
@ -152,15 +152,15 @@ endfunc
func Test_gd_missing_braces() func Test_gd_missing_braces()
let lines =<< trim [CODE] let lines =<< trim [CODE]
def func1(a) def func1(a)
a + 1 a + 1
end end
a = 1 a = 1
def func2() def func2()
return a return a
end end
[CODE] [CODE]
call XTest_goto_decl('gd', lines, 1, 11) call XTest_goto_decl('gd', lines, 1, 11)
@ -168,12 +168,12 @@ endfunc
func Test_gd_comment() func Test_gd_comment()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int func(void) int func(void)
{ {
/* int x; */ /* int x; */
int x; int x;
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gd', lines, 4, 7) call XTest_goto_decl('gd', lines, 4, 7)
@ -181,12 +181,12 @@ endfunc
func Test_gd_comment_in_string() func Test_gd_comment_in_string()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int func(void) int func(void)
{ {
char *s ="//"; int x; char *s ="//"; int x;
int x; int x;
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gd', lines, 3, 22) call XTest_goto_decl('gd', lines, 3, 22)
@ -195,12 +195,12 @@ endfunc
func Test_gd_string_in_comment() func Test_gd_string_in_comment()
set comments= set comments=
let lines =<< trim [CODE] let lines =<< trim [CODE]
int func(void) int func(void)
{ {
/* " */ int x; /* " */ int x;
int x; int x;
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gd', lines, 3, 15) call XTest_goto_decl('gd', lines, 3, 15)
@ -209,10 +209,10 @@ endfunc
func Test_gd_inline_comment() func Test_gd_inline_comment()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int func(/* x is an int */ int x) int func(/* x is an int */ int x)
{ {
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gd', lines, 1, 32) call XTest_goto_decl('gd', lines, 1, 32)
@ -220,10 +220,10 @@ endfunc
func Test_gd_inline_comment_only() func Test_gd_inline_comment_only()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int func(void) /* one lonely x */ int func(void) /* one lonely x */
{ {
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gd', lines, 3, 10) call XTest_goto_decl('gd', lines, 3, 10)
@ -231,16 +231,16 @@ endfunc
func Test_gd_inline_comment_body() func Test_gd_inline_comment_body()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int func(void) int func(void)
{ {
int y /* , x */; int y /* , x */;
for (/* int x = 0 */; y < 2; y++); for (/* int x = 0 */; y < 2; y++);
int x = 0; int x = 0;
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gd', lines, 7, 7) call XTest_goto_decl('gd', lines, 7, 7)
@ -248,10 +248,10 @@ endfunc
func Test_gd_trailing_multiline_comment() func Test_gd_trailing_multiline_comment()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int func(int x) /* x is an int */ int func(int x) /* x is an int */
{ {
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gd', lines, 1, 14) call XTest_goto_decl('gd', lines, 1, 14)
@ -259,10 +259,10 @@ endfunc
func Test_gd_trailing_comment() func Test_gd_trailing_comment()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int func(int x) // x is an int int func(int x) // x is an int
{ {
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gd', lines, 1, 14) call XTest_goto_decl('gd', lines, 1, 14)
@ -270,13 +270,13 @@ endfunc
func Test_gd_string() func Test_gd_string()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int func(void) int func(void)
{ {
char *s = "x"; char *s = "x";
int x = 1; int x = 1;
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gd', lines, 4, 7) call XTest_goto_decl('gd', lines, 4, 7)
@ -284,12 +284,12 @@ endfunc
func Test_gd_string_only() func Test_gd_string_only()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int func(void) int func(void)
{ {
char *s = "x"; char *s = "x";
return x; return x;
} }
[CODE] [CODE]
call XTest_goto_decl('gd', lines, 5, 10) call XTest_goto_decl('gd', lines, 5, 10)
@ -312,21 +312,21 @@ endfunc
func Test_gd_local_block() func Test_gd_local_block()
let lines =<< trim [CODE] let lines =<< trim [CODE]
int main() int main()
{
char *a = "NOT NULL";
if(a)
{ {
char *b = a; char *a = "NOT NULL";
printf("%s\n", b); if(a)
{
char *b = a;
printf("%s\n", b);
}
else
{
char *b = "NULL";
return b;
}
return 0;
} }
else
{
char *b = "NULL";
return b;
}
return 0;
}
[CODE] [CODE]
call XTest_goto_decl('1gd', lines, 11, 11) call XTest_goto_decl('1gd', lines, 11, 11)

View File

@ -199,10 +199,18 @@ END
END END
call assert_equal(['Line1', ' Line2', "\tLine3", ' END'], var1) call assert_equal(['Line1', ' Line2', "\tLine3", ' END'], var1)
let var1 =<< trim !!!
Line1
line2
Line3
!!!
!!!
call assert_equal(['Line1', ' line2', "\tLine3", '!!!',], var1)
let var1 =<< trim let var1 =<< trim
Line1 Line1
. .
call assert_equal([' Line1'], var1) call assert_equal(['Line1'], var1)
" ignore "endfunc" " ignore "endfunc"
let var1 =<< END let var1 =<< END

View File

@ -66,32 +66,32 @@ func Test_mksession_utf8()
mksession! test_mks.out mksession! test_mks.out
let li = filter(readfile('test_mks.out'), 'v:val =~# "\\(^ *normal! 0\\|^ *exe ''normal!\\)"') let li = filter(readfile('test_mks.out'), 'v:val =~# "\\(^ *normal! 0\\|^ *exe ''normal!\\)"')
let expected =<< trim [DATA] let expected =<< trim [DATA]
normal! 016|
normal! 016|
normal! 016|
normal! 08|
normal! 08|
normal! 016|
normal! 016|
normal! 016|
exe 'normal! ' . s:c . '|zs' . 16 . '|'
normal! 016| normal! 016|
exe 'normal! ' . s:c . '|zs' . 16 . '|'
normal! 016| normal! 016|
exe 'normal! ' . s:c . '|zs' . 16 . '|'
normal! 016| normal! 016|
exe 'normal! ' . s:c . '|zs' . 8 . '|'
normal! 08| normal! 08|
exe 'normal! ' . s:c . '|zs' . 8 . '|'
normal! 08| normal! 08|
exe 'normal! ' . s:c . '|zs' . 16 . '|'
normal! 016| normal! 016|
exe 'normal! ' . s:c . '|zs' . 16 . '|'
normal! 016| normal! 016|
exe 'normal! ' . s:c . '|zs' . 16 . '|'
normal! 016|
exe 'normal! ' . s:c . '|zs' . 16 . '|'
normal! 016| normal! 016|
exe 'normal! ' . s:c . '|zs' . 16 . '|'
normal! 016|
exe 'normal! ' . s:c . '|zs' . 16 . '|'
normal! 016|
exe 'normal! ' . s:c . '|zs' . 16 . '|'
normal! 016|
exe 'normal! ' . s:c . '|zs' . 8 . '|'
normal! 08|
exe 'normal! ' . s:c . '|zs' . 8 . '|'
normal! 08|
exe 'normal! ' . s:c . '|zs' . 16 . '|'
normal! 016|
exe 'normal! ' . s:c . '|zs' . 16 . '|'
normal! 016|
exe 'normal! ' . s:c . '|zs' . 16 . '|'
normal! 016|
exe 'normal! ' . s:c . '|zs' . 16 . '|'
normal! 016|
[DATA] [DATA]
call assert_equal(expected, li) call assert_equal(expected, li)

View File

@ -1564,34 +1564,34 @@ endfunc
fun! Test_normal29_brace() fun! Test_normal29_brace()
" basic test for { and } movements " basic test for { and } movements
let text =<< trim [DATA] let text =<< trim [DATA]
A paragraph begins after each empty line, and also at each of a set of A paragraph begins after each empty line, and also at each of a set of
paragraph macros, specified by the pairs of characters in the 'paragraphs' paragraph macros, specified by the pairs of characters in the 'paragraphs'
option. The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to option. The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds to
the macros ".IP", ".LP", etc. (These are nroff macros, so the dot must be in the macros ".IP", ".LP", etc. (These are nroff macros, so the dot must be in
the first column). A section boundary is also a paragraph boundary. the first column). A section boundary is also a paragraph boundary.
Note that a blank line (only containing white space) is NOT a paragraph Note that a blank line (only containing white space) is NOT a paragraph
boundary. boundary.
Also note that this does not include a '{' or '}' in the first column. When Also note that this does not include a '{' or '}' in the first column. When
the '{' flag is in 'cpoptions' then '{' in the first column is used as a the '{' flag is in 'cpoptions' then '{' in the first column is used as a
paragraph boundary |posix|. paragraph boundary |posix|.
{ {
This is no paragraph This is no paragraph
unless the '{' is set unless the '{' is set
in 'cpoptions' in 'cpoptions'
} }
.IP .IP
The nroff macros IP separates a paragraph The nroff macros IP separates a paragraph
That means, it must be a '.' That means, it must be a '.'
followed by IP followed by IP
.LPIt does not matter, if afterwards some .LPIt does not matter, if afterwards some
more characters follow. more characters follow.
.SHAlso section boundaries from the nroff .SHAlso section boundaries from the nroff
macros terminate a paragraph. That means macros terminate a paragraph. That means
a character like this: a character like this:
.NH .NH
End of text here End of text here
[DATA] [DATA]
new new
@ -1600,17 +1600,17 @@ fun! Test_normal29_brace()
norm! 0d2} norm! 0d2}
let expected =<< trim [DATA] let expected =<< trim [DATA]
.IP .IP
The nroff macros IP separates a paragraph The nroff macros IP separates a paragraph
That means, it must be a '.' That means, it must be a '.'
followed by IP followed by IP
.LPIt does not matter, if afterwards some .LPIt does not matter, if afterwards some
more characters follow. more characters follow.
.SHAlso section boundaries from the nroff .SHAlso section boundaries from the nroff
macros terminate a paragraph. That means macros terminate a paragraph. That means
a character like this: a character like this:
.NH .NH
End of text here End of text here
[DATA] [DATA]
call assert_equal(expected, getline(1, '$')) call assert_equal(expected, getline(1, '$'))
@ -1618,13 +1618,13 @@ fun! Test_normal29_brace()
norm! 0d} norm! 0d}
let expected =<< trim [DATA] let expected =<< trim [DATA]
.LPIt does not matter, if afterwards some .LPIt does not matter, if afterwards some
more characters follow. more characters follow.
.SHAlso section boundaries from the nroff .SHAlso section boundaries from the nroff
macros terminate a paragraph. That means macros terminate a paragraph. That means
a character like this: a character like this:
.NH .NH
End of text here End of text here
[DATA] [DATA]
call assert_equal(expected, getline(1, '$')) call assert_equal(expected, getline(1, '$'))
@ -1633,11 +1633,11 @@ fun! Test_normal29_brace()
norm! d{ norm! d{
let expected =<< trim [DATA] let expected =<< trim [DATA]
.LPIt does not matter, if afterwards some .LPIt does not matter, if afterwards some
more characters follow. more characters follow.
.SHAlso section boundaries from the nroff .SHAlso section boundaries from the nroff
macros terminate a paragraph. That means macros terminate a paragraph. That means
a character like this: a character like this:
[DATA] [DATA]
call assert_equal(expected, getline(1, '$')) call assert_equal(expected, getline(1, '$'))
@ -1645,8 +1645,8 @@ fun! Test_normal29_brace()
norm! d{ norm! d{
let expected =<< trim [DATA] let expected =<< trim [DATA]
.LPIt does not matter, if afterwards some .LPIt does not matter, if afterwards some
more characters follow. more characters follow.
[DATA] [DATA]
call assert_equal(expected, getline(1, '$')) call assert_equal(expected, getline(1, '$'))
@ -1659,22 +1659,22 @@ fun! Test_normal29_brace()
" 1 " 1
" norm! 0d2} " norm! 0d2}
" let expected =<< trim [DATA] " let expected =<< trim [DATA]
" { " {
" This is no paragraph " This is no paragraph
" unless the '{' is set " unless the '{' is set
" in 'cpoptions' " in 'cpoptions'
" } " }
" .IP " .IP
" The nroff macros IP separates a paragraph " The nroff macros IP separates a paragraph
" That means, it must be a '.' " That means, it must be a '.'
" followed by IP " followed by IP
" .LPIt does not matter, if afterwards some " .LPIt does not matter, if afterwards some
" more characters follow. " more characters follow.
" .SHAlso section boundaries from the nroff " .SHAlso section boundaries from the nroff
" macros terminate a paragraph. That means " macros terminate a paragraph. That means
" a character like this: " a character like this:
" .NH " .NH
" End of text here " End of text here
" "
" [DATA] " [DATA]
" call assert_equal(expected, getline(1, '$')) " call assert_equal(expected, getline(1, '$'))
@ -1682,22 +1682,22 @@ fun! Test_normal29_brace()
" $ " $
" norm! d} " norm! d}
" let expected =<< trim [DATA] " let expected =<< trim [DATA]
" { " {
" This is no paragraph " This is no paragraph
" unless the '{' is set " unless the '{' is set
" in 'cpoptions' " in 'cpoptions'
" } " }
" .IP " .IP
" The nroff macros IP separates a paragraph " The nroff macros IP separates a paragraph
" That means, it must be a '.' " That means, it must be a '.'
" followed by IP " followed by IP
" .LPIt does not matter, if afterwards some " .LPIt does not matter, if afterwards some
" more characters follow. " more characters follow.
" .SHAlso section boundaries from the nroff " .SHAlso section boundaries from the nroff
" macros terminate a paragraph. That means " macros terminate a paragraph. That means
" a character like this: " a character like this:
" .NH " .NH
" End of text here " End of text here
" "
" [DATA] " [DATA]
" call assert_equal(expected, getline(1, '$')) " call assert_equal(expected, getline(1, '$'))
@ -1706,11 +1706,11 @@ fun! Test_normal29_brace()
" norm! d5} " norm! d5}
" "
" let expected =<< trim [DATA] " let expected =<< trim [DATA]
" { " {
" This is no paragraph " This is no paragraph
" unless the '{' is set " unless the '{' is set
" in 'cpoptions' " in 'cpoptions'
" } " }
" [DATA] " [DATA]
" call assert_equal(expected, getline(1, '$')) " call assert_equal(expected, getline(1, '$'))

View File

@ -737,11 +737,12 @@ func Test_popup_position()
if !CanRunVimInTerminal() if !CanRunVimInTerminal()
return return
endif endif
call writefile([ let lines =<< trim END
\ '123456789_123456789_123456789_a', 123456789_123456789_123456789_a
\ '123456789_123456789_123456789_b', 123456789_123456789_123456789_b
\ ' 123', 123
\ ], 'Xtest') END
call writefile(lines, 'Xtest')
let buf = RunVimInTerminal('Xtest', {}) let buf = RunVimInTerminal('Xtest', {})
call term_sendkeys(buf, ":vsplit\<CR>") call term_sendkeys(buf, ":vsplit\<CR>")

View File

@ -312,13 +312,13 @@ endfunc
func Test_profile_file() func Test_profile_file()
let lines =<< trim [CODE] let lines =<< trim [CODE]
func! Foo() func! Foo()
endfunc endfunc
for i in range(10) for i in range(10)
" a comment " a comment
call Foo()
endfor
call Foo() call Foo()
endfor
call Foo()
[CODE] [CODE]
call writefile(lines, 'Xprofile_file.vim') call writefile(lines, 'Xprofile_file.vim')

View File

@ -776,67 +776,67 @@ func Test_efm1()
endif endif
let l =<< trim [DATA] let l =<< trim [DATA]
"Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set. "Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.
"Xtestfile", line 6 col 19; this is an error "Xtestfile", line 6 col 19; this is an error
gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include version.c gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include version.c
Xtestfile:9: parse error before `asd' Xtestfile:9: parse error before `asd'
make: *** [vim] Error 1 make: *** [vim] Error 1
in file "Xtestfile" linenr 10: there is an error in file "Xtestfile" linenr 10: there is an error
2 returned 2 returned
"Xtestfile", line 11 col 1; this is an error "Xtestfile", line 11 col 1; this is an error
"Xtestfile", line 12 col 2; this is another error "Xtestfile", line 12 col 2; this is another error
"Xtestfile", line 14:10; this is an error in column 10 "Xtestfile", line 14:10; this is an error in column 10
=Xtestfile=, line 15:10; this is another error, but in vcol 10 this time =Xtestfile=, line 15:10; this is another error, but in vcol 10 this time
"Xtestfile", linenr 16: yet another problem "Xtestfile", linenr 16: yet another problem
Error in "Xtestfile" at line 17: Error in "Xtestfile" at line 17:
x should be a dot x should be a dot
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17
^ ^
Error in "Xtestfile" at line 18: Error in "Xtestfile" at line 18:
x should be a dot x should be a dot
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18
.............^ .............^
Error in "Xtestfile" at line 19: Error in "Xtestfile" at line 19:
x should be a dot x should be a dot
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19
--------------^ --------------^
Error in "Xtestfile" at line 20: Error in "Xtestfile" at line 20:
x should be a dot x should be a dot
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20
^ ^
Does anyone know what is the problem and how to correction it? Does anyone know what is the problem and how to correction it?
"Xtestfile", line 21 col 9: What is the title of the quickfix window? "Xtestfile", line 21 col 9: What is the title of the quickfix window?
"Xtestfile", line 22 col 9: What is the title of the quickfix window? "Xtestfile", line 22 col 9: What is the title of the quickfix window?
[DATA] [DATA]
call writefile(l, 'Xerrorfile1') call writefile(l, 'Xerrorfile1')
call writefile(l[:-2], 'Xerrorfile2') call writefile(l[:-2], 'Xerrorfile2')
let m =<< trim [DATA] let m =<< [DATA]
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 2 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 2
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 3 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 3
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 4 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 4
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 5 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 5
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 6 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 6
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 7
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 8 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 8
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 9 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 9
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 10 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 10
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 11 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 11
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 12 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 12
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 13 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 13
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 14 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 14
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 15 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 15
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 16 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 16
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 17
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 18
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 19
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 20
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 21 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 21
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 22 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx line 22
[DATA] [DATA]
call writefile(m, 'Xtestfile') call writefile(m, 'Xtestfile')
let save_efm = &efm let save_efm = &efm
@ -1053,20 +1053,20 @@ func Test_efm2()
" Test for %P, %Q and %t format specifiers " Test for %P, %Q and %t format specifiers
let lines =<< trim [DATA] let lines =<< trim [DATA]
[Xtestfile1] [Xtestfile1]
(1,17) error: ';' missing (1,17) error: ';' missing
(21,2) warning: variable 'z' not defined (21,2) warning: variable 'z' not defined
(67,3) error: end of file found before string ended (67,3) error: end of file found before string ended
-- --
[Xtestfile2] [Xtestfile2]
-- --
[Xtestfile3] [Xtestfile3]
NEW compiler v1.1 NEW compiler v1.1
(2,2) warning: variable 'x' not defined (2,2) warning: variable 'x' not defined
(67,3) warning: 's' already defined (67,3) warning: 's' already defined
- --
[DATA] [DATA]
set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r
" To exercise the push/pop file functionality in quickfix, the test files " To exercise the push/pop file functionality in quickfix, the test files
@ -1090,10 +1090,10 @@ func Test_efm2()
" Tests for %E, %C and %Z format specifiers " Tests for %E, %C and %Z format specifiers
let lines =<< trim [DATA] let lines =<< trim [DATA]
Error 275 Error 275
line 42 line 42
column 3 column 3
' ' expected after '--' ' ' expected after '--'
[DATA] [DATA]
set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
@ -1107,8 +1107,8 @@ func Test_efm2()
" Test for %> " Test for %>
let lines =<< trim [DATA] let lines =<< trim [DATA]
Error in line 147 of foo.c: Error in line 147 of foo.c:
unknown variable 'i' unknown variable 'i'
[DATA] [DATA]
set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m