diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-05-19 21:37:18 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-05-19 21:37:18 +0200 |
commit | 8471e57026714c5a0faf89288ceef5231fb88d4f (patch) | |
tree | b130d4fb4a56167e3ed26447fa79aec6a08103a5 /src | |
parent | 16e9b85113e0b354ece1cb4f5fcc7866850f3685 (diff) | |
download | vim-git-8471e57026714c5a0faf89288ceef5231fb88d4f.tar.gz |
patch 8.1.1356: some text in heredoc assignment ends the textv8.1.1356
Problem: Some text in heredoc assignment ends the text. (Ozaki Kiichi)
Solution: Recognize "let v =<<" and skip until the end.
Diffstat (limited to 'src')
-rw-r--r-- | src/testdir/test_let.vim | 68 | ||||
-rw-r--r-- | src/userfunc.c | 41 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 99 insertions, 12 deletions
diff --git a/src/testdir/test_let.vim b/src/testdir/test_let.vim index 10670b002..4fa010bab 100644 --- a/src/testdir/test_let.vim +++ b/src/testdir/test_let.vim @@ -152,6 +152,28 @@ func Test_let_utf8_environment() call assert_equal('ĀĒĪŌŪあいうえお', $a) endfunc +func Test_let_heredoc_fails() + call assert_fails('let v =<< marker', 'E991:') + + let text =<< trim END + func WrongSyntax() + let v =<< that there + endfunc + END + call writefile(text, 'XheredocFail') + call assert_fails('source XheredocFail', 'E126:') + call delete('XheredocFail') + + let text =<< trim END + func MissingEnd() + let v =<< END + endfunc + END + call writefile(text, 'XheredocWrong') + call assert_fails('source XheredocWrong', 'E126:') + call delete('XheredocWrong') +endfunc + " Test for the setting a variable using the heredoc syntax func Test_let_heredoc() let var1 =<< END @@ -193,15 +215,45 @@ END . call assert_equal([' Line1'], var1) - call assert_fails('let v =<< marker', 'E991:') - call assert_fails('call WrongSyntax()', 'E488:') - call assert_fails('call MissingEnd()', 'E990:') + " ignore "endfunc" + let var1 =<< END +something endfunc +END + call assert_equal(['something', 'endfunc'], var1) -func WrongSyntax() - let fail =<< that there -endfunc + " ignore "endfunc" with trim + let var1 =<< trim END + something + endfunc + END + call assert_equal(['something', 'endfunc'], var1) + + " ignore "python << xx" + let var1 =<<END +something +python << xx +END + call assert_equal(['something', 'python << xx'], var1) + + " ignore "python << xx" with trim + let var1 =<< trim END + something + python << xx + END + call assert_equal(['something', 'python << xx'], var1) -func MissingEnd() - let fail =<< END + " ignore "append" + let var1 =<< +something +app +. + call assert_equal(['something', 'app'], var1) + + " ignore "append" with trim + let var1 =<< trim + something + app + . + call assert_equal(['something', 'app'], var1) endfunc diff --git a/src/userfunc.c b/src/userfunc.c index 4959b0d6a..763903f85 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -1979,6 +1979,7 @@ ex_function(exarg_T *eap) int indent; int nesting; char_u *skip_until = NULL; + char_u *trimmed = NULL; dictitem_T *v; funcdict_T fudi; static int func_nr = 0; /* number for nameless function */ @@ -2303,10 +2304,18 @@ ex_function(exarg_T *eap) if (skip_until != NULL) { - /* between ":append" and "." and between ":python <<EOF" and "EOF" - * don't check for ":endfunc". */ - if (STRCMP(theline, skip_until) == 0) - VIM_CLEAR(skip_until); + // Between ":append" and "." and between ":python <<EOF" and "EOF" + // don't check for ":endfunc". + if (trimmed == NULL + || STRNCMP(theline, trimmed, STRLEN(trimmed)) == 0) + { + p = trimmed == NULL ? theline : theline + STRLEN(trimmed); + if (STRCMP(p, skip_until) == 0) + { + VIM_CLEAR(skip_until); + VIM_CLEAR(trimmed); + } + } } else { @@ -2406,6 +2415,30 @@ ex_function(exarg_T *eap) else skip_until = vim_strsave(p); } + + // Check for ":let v =<< [trim] EOF" + arg = skipwhite(skiptowhite(p)); + arg = skipwhite(skiptowhite(arg)); + if (arg[0] == '=' && arg[1] == '<' && arg[2] =='<' + && ((p[0] == 'l' + && p[1] == 'e' + && (!ASCII_ISALNUM(p[2]) + || (p[2] == 't' && !ASCII_ISALNUM(p[3])))))) + { + // ":let v =<<" continues until a dot + p = skipwhite(arg + 3); + if (STRNCMP(p, "trim", 4) == 0) + { + // Ignore leading white space. + p = skipwhite(p + 4); + trimmed = vim_strnsave(theline, + (int)(skipwhite(theline) - theline)); + } + if (*p == NUL) + skip_until = vim_strsave((char_u *)"."); + else + skip_until = vim_strnsave(p, (int)(skiptowhite(p) - p)); + } } /* Add the line to the function. */ diff --git a/src/version.c b/src/version.c index 042a8bcd9..2dd024f0f 100644 --- a/src/version.c +++ b/src/version.c @@ -768,6 +768,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1356, +/**/ 1355, /**/ 1354, |