# HG changeset patch # User Bram Moolenaar # Date 1573049703 -3600 # Node ID c0cd979000f97588d109f97bceccf4a0d5cda2f2 # Parent 669d5689143badc2111f4368bd87b9061966c0f6 patch 8.1.2262: unpack assignment in function not recognized Commit: https://github.com/vim/vim/commit/1e673b9eb686459bd0e7fc3f2199dd077546a18e Author: Bram Moolenaar Date: Wed Nov 6 15:02:50 2019 +0100 patch 8.1.2262: unpack assignment in function not recognized Problem: Unpack assignment in function not recognized. Solution: Skip over "[a, b]". (closes https://github.com/vim/vim/issues/5051) diff --git a/src/testdir/test_let.vim b/src/testdir/test_let.vim --- a/src/testdir/test_let.vim +++ b/src/testdir/test_let.vim @@ -303,4 +303,12 @@ E END endif call assert_equal([], check) + + " unpack assignment + let [a, b, c] =<< END + x + \y + z +END + call assert_equal([' x', ' \y', ' z'], [a, b, c]) endfunc diff --git a/src/userfunc.c b/src/userfunc.c --- a/src/userfunc.c +++ b/src/userfunc.c @@ -2482,25 +2482,31 @@ ex_function(exarg_T *eap) } // Check for ":let v =<< [trim] EOF" + // and ":let [a, b] =<< [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])))))) + if (*arg == '[') + arg = vim_strchr(arg, ']'); + if (arg != NULL) { - p = skipwhite(arg + 3); - if (STRNCMP(p, "trim", 4) == 0) + 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])))))) { - // Ignore leading white space. - p = skipwhite(p + 4); - heredoc_trimmed = vim_strnsave(theline, + p = skipwhite(arg + 3); + if (STRNCMP(p, "trim", 4) == 0) + { + // Ignore leading white space. + p = skipwhite(p + 4); + heredoc_trimmed = vim_strnsave(theline, (int)(skipwhite(theline) - theline)); + } + skip_until = vim_strnsave(p, (int)(skiptowhite(p) - p)); + do_concat = FALSE; + is_heredoc = TRUE; } - skip_until = vim_strnsave(p, (int)(skiptowhite(p) - p)); - do_concat = FALSE; - is_heredoc = TRUE; } } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2262, +/**/ 2261, /**/ 2260,