0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.1.1723: heredoc assignment has no room for new features

Problem:    Heredoc assignment has no room for new features. (FUJIWARA Takuya)
Solution:   Require the marker does not start with a lower case character.
            (closes #4705)
This commit is contained in:
Bram Moolenaar 2019-07-21 14:14:26 +02:00
parent 61343f0c44
commit 2458200729
4 changed files with 39 additions and 15 deletions

View File

@ -11386,7 +11386,8 @@ This does NOT work: >
Like above, but append/add/subtract the value for each Like above, but append/add/subtract the value for each
|List| item. |List| item.
*:let=<<* *:let-heredoc* *E990* *E991* *:let=<<* *:let-heredoc*
*E990* *E991* *E172* *E221*
:let {var-name} =<< [trim] {marker} :let {var-name} =<< [trim] {marker}
text... text...
text... text...
@ -11394,11 +11395,10 @@ text...
Set internal variable {var-name} to a List containing Set internal variable {var-name} to a List containing
the lines of text bounded by the string {marker}. the lines of text bounded by the string {marker}.
{marker} must not contain white space. {marker} must not contain white space.
{marker} cannot start with a lower case character.
The last line should end only with the {marker} string The last line should end only with the {marker} string
without any other character. Watch out for white without any other character. Watch out for white
space after {marker}! space after {marker}!
If {marker} is not supplied, then "." is used as the
default marker.
Without "trim" any white space characters in the lines Without "trim" any white space characters in the lines
of text are preserved. If "trim" is specified before of text are preserved. If "trim" is specified before

View File

@ -1283,7 +1283,7 @@ heredoc_get(exarg_T *eap, char_u *cmd)
text_indent_len = -1; text_indent_len = -1;
} }
// The marker is the next word. Default marker is "." // The marker is the next word.
if (*cmd != NUL && *cmd != '"') if (*cmd != NUL && *cmd != '"')
{ {
marker = skipwhite(cmd); marker = skipwhite(cmd);
@ -1294,9 +1294,17 @@ heredoc_get(exarg_T *eap, char_u *cmd)
return NULL; return NULL;
} }
*p = NUL; *p = NUL;
if (vim_islower(*marker))
{
emsg(_("E221: Marker cannot start with lower case letter"));
return NULL;
}
} }
else else
marker = (char_u *)"."; {
emsg(_("E172: Missing marker"));
return NULL;
}
l = list_alloc(); l = list_alloc();
if (l == NULL) if (l == NULL)

View File

@ -164,14 +164,28 @@ func Test_let_heredoc_fails()
call assert_fails('source XheredocFail', 'E126:') call assert_fails('source XheredocFail', 'E126:')
call delete('XheredocFail') call delete('XheredocFail')
let text =<< trim END let text =<< trim CodeEnd
func MissingEnd() func MissingEnd()
let v =<< END let v =<< END
endfunc endfunc
END CodeEnd
call writefile(text, 'XheredocWrong') call writefile(text, 'XheredocWrong')
call assert_fails('source XheredocWrong', 'E126:') call assert_fails('source XheredocWrong', 'E126:')
call delete('XheredocWrong') call delete('XheredocWrong')
let text =<< trim TEXTend
let v =<< " comment
TEXTend
call writefile(text, 'XheredocNoMarker')
call assert_fails('source XheredocNoMarker', 'E172:')
call delete('XheredocNoMarker')
let text =<< trim TEXTend
let v =<< text
TEXTend
call writefile(text, 'XheredocBadMarker')
call assert_fails('source XheredocBadMarker', 'E221:')
call delete('XheredocBadMarker')
endfunc endfunc
" Test for the setting a variable using the heredoc syntax " Test for the setting a variable using the heredoc syntax
@ -184,9 +198,9 @@ END
call assert_equal(["Some sample text", "\tText with indent", " !@#$%^&*()-+_={}|[]\\~`:\";'<>?,./"], var1) call assert_equal(["Some sample text", "\tText with indent", " !@#$%^&*()-+_={}|[]\\~`:\";'<>?,./"], var1)
let var2 =<< let var2 =<< XXX
Editor Editor
. XXX
call assert_equal(['Editor'], var2) call assert_equal(['Editor'], var2)
let var3 =<<END let var3 =<<END
@ -218,9 +232,9 @@ END
!!! !!!
call assert_equal(['Line1', ' line2', "\tLine3", '!!!',], var1) call assert_equal(['Line1', ' line2', "\tLine3", '!!!',], var1)
let var1 =<< trim let var1 =<< trim XX
Line1 Line1
. XX
call assert_equal(['Line1'], var1) call assert_equal(['Line1'], var1)
" ignore "endfunc" " ignore "endfunc"
@ -260,16 +274,16 @@ END
call assert_equal(['something', 'python << xx'], var1) call assert_equal(['something', 'python << xx'], var1)
" ignore "append" " ignore "append"
let var1 =<< let var1 =<< E
something something
app app
. E
call assert_equal(['something', 'app'], var1) call assert_equal(['something', 'app'], var1)
" ignore "append" with trim " ignore "append" with trim
let var1 =<< trim let var1 =<< trim END
something something
app app
. END
call assert_equal(['something', 'app'], var1) call assert_equal(['something', 'app'], var1)
endfunc endfunc

View File

@ -777,6 +777,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1723,
/**/ /**/
1722, 1722,
/**/ /**/