diff options
Diffstat (limited to 'data/vim/patches/8.1.1354')
-rw-r--r-- | data/vim/patches/8.1.1354 | 275 |
1 files changed, 0 insertions, 275 deletions
diff --git a/data/vim/patches/8.1.1354 b/data/vim/patches/8.1.1354 deleted file mode 100644 index 4ee3682ba..000000000 --- a/data/vim/patches/8.1.1354 +++ /dev/null @@ -1,275 +0,0 @@ -To: vim_dev@googlegroups.com -Subject: Patch 8.1.1354 -Fcc: outbox -From: Bram Moolenaar <Bram@moolenaar.net> -Mime-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit ------------- - -Patch 8.1.1354 -Problem: Getting a list of text lines is clumsy. -Solution: Add the =<< assignment. (Yegappan Lakshmanan, closes #4386) -Files: runtime/doc/eval.txt, src/eval.c, src/testdir/test_let.vim - - -*** ../vim-8.1.1353/runtime/doc/eval.txt 2019-05-16 20:29:40.799834279 +0200 ---- runtime/doc/eval.txt 2019-05-19 18:32:00.400895195 +0200 -*************** -*** 11416,11421 **** ---- 11416,11459 ---- - Like above, but append/add/subtract the value for each - |List| item. - -+ *:let=<<* *:let-heredoc* *E990* *E991* -+ :let {var-name} =<< [trim] {marker} -+ text... -+ text... -+ {marker} -+ Set internal variable {var-name} to a List containing -+ the lines of text bounded by the string {marker}. -+ {marker} must not contain white space. -+ The last line should end only with the {marker} string -+ without any other character. Watch out for white -+ space after {marker}! -+ If {marker} is not supplied, then "." is used as the -+ default marker. -+ -+ Any white space characters in the lines of text are -+ preserved. If "trim" is specified before {marker}, -+ then all the leading indentation exactly matching the -+ leading indentation before `let` is stripped from the -+ input lines and the line containing {marker}. Note -+ that the difference between space and tab matters -+ here. -+ -+ If {var-name} didn't exist yet, it is created. -+ Cannot be followed by another command, but can be -+ followed by a comment. -+ -+ Examples: > -+ let var1 =<< END -+ Sample text 1 -+ Sample text 2 -+ Sample text 3 -+ END -+ -+ let data =<< trim DATA -+ 1 2 3 4 -+ 5 6 7 8 -+ DATA -+ < - *E121* - :let {var-name} .. List the value of variable {var-name}. Multiple - variable names may be given. Special names recognized -*** ../vim-8.1.1353/src/eval.c 2019-05-11 18:28:41.351611622 +0200 ---- src/eval.c 2019-05-19 18:31:49.948943991 +0200 -*************** -*** 1225,1230 **** ---- 1225,1326 ---- - #endif - - /* -+ * Get a list of lines from a HERE document. The here document is a list of -+ * lines surrounded by a marker. -+ * cmd << {marker} -+ * {line1} -+ * {line2} -+ * .... -+ * {marker} -+ * -+ * The {marker} is a string. If the optional 'trim' word is supplied before the -+ * marker, then the leading indentation before the lines (matching the -+ * indentation in the 'cmd' line) is stripped. -+ * Returns a List with {lines} or NULL. -+ */ -+ static list_T * -+ heredoc_get(exarg_T *eap, char_u *cmd) -+ { -+ char_u *theline; -+ char_u *marker; -+ list_T *l; -+ char_u *p; -+ int indent_len = 0; -+ -+ if (eap->getline == NULL) -+ { -+ emsg(_("E991: cannot use =<< here")); -+ return NULL; -+ } -+ -+ // Check for the optional 'trim' word before the marker -+ cmd = skipwhite(cmd); -+ if (STRNCMP(cmd, "trim", 4) == 0 && (cmd[4] == NUL || VIM_ISWHITE(cmd[4]))) -+ { -+ cmd = skipwhite(cmd + 4); -+ -+ // Trim the indentation from all the lines in the here document -+ // The amount of indentation trimmed is the same as the indentation of -+ // the :let command line. -+ p = *eap->cmdlinep; -+ while (VIM_ISWHITE(*p)) -+ { -+ p++; -+ indent_len++; -+ } -+ } -+ -+ // The marker is the next word. Default marker is "." -+ if (*cmd != NUL && *cmd != '"') -+ { -+ marker = skipwhite(cmd); -+ p = skiptowhite(marker); -+ if (*skipwhite(p) != NUL && *skipwhite(p) != '"') -+ { -+ emsg(_(e_trailing)); -+ return NULL; -+ } -+ *p = NUL; -+ } -+ else -+ marker = (char_u *)"."; -+ -+ l = list_alloc(); -+ if (l == NULL) -+ return NULL; -+ -+ for (;;) -+ { -+ int i = 0; -+ -+ theline = eap->getline(NUL, eap->cookie, 0); -+ 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) -+ { -+ semsg(_("E990: Missing end marker '%s'"), marker); -+ break; -+ } -+ if (STRCMP(marker, theline + i) == 0) -+ { -+ vim_free(theline); -+ break; -+ } -+ -+ if (list_append_string(l, theline + i, -1) == FAIL) -+ break; -+ vim_free(theline); -+ } -+ -+ return l; -+ } -+ -+ /* - * ":let" list all variable values - * ":let var1 var2" list variable values - * ":let var = expr" assignment command. -*************** -*** 1286,1291 **** ---- 1382,1403 ---- - } - eap->nextcmd = check_nextcmd(arg); - } -+ else if (expr[0] == '=' && expr[1] == '<' && expr[2] == '<') -+ { -+ list_T *l; -+ -+ // HERE document -+ l = heredoc_get(eap, expr + 3); -+ if (l != NULL) -+ { -+ rettv_list_set(&rettv, l); -+ op[0] = '='; -+ op[1] = NUL; -+ (void)ex_let_vars(eap->arg, &rettv, FALSE, semicolon, var_count, -+ op); -+ clear_tv(&rettv); -+ } -+ } - else - { - op[0] = '='; -*** ../vim-8.1.1353/src/testdir/test_let.vim 2019-03-30 20:11:45.749471761 +0100 ---- src/testdir/test_let.vim 2019-05-19 18:34:28.132194698 +0200 -*************** -*** 151,153 **** ---- 151,207 ---- - let $a = 'ĀĒĪŌŪあいうえお' - call assert_equal('ĀĒĪŌŪあいうえお', $a) - endfunc -+ -+ " Test for the setting a variable using the heredoc syntax -+ func Test_let_heredoc() -+ let var1 =<< END -+ Some sample text -+ Text with indent -+ !@#$%^&*()-+_={}|[]\~`:";'<>?,./ -+ END -+ -+ call assert_equal(["Some sample text", "\tText with indent", " !@#$%^&*()-+_={}|[]\\~`:\";'<>?,./"], var1) -+ -+ let var2 =<< -+ Editor -+ . -+ call assert_equal(['Editor'], var2) -+ -+ let var3 =<<END -+ END -+ call assert_equal([], var3) -+ -+ let var3 =<<END -+ vim -+ -+ end -+ END -+ END -+ END -+ call assert_equal(['vim', '', 'end', ' END', 'END '], var3) -+ -+ let var1 =<< trim END -+ Line1 -+ Line2 -+ Line3 -+ END -+ END -+ call assert_equal(['Line1', ' Line2', "\tLine3", ' END'], var1) -+ -+ let var1 =<< trim -+ Line1 -+ . -+ call assert_equal([' Line1'], var1) -+ -+ call assert_fails('let v =<< marker', 'E991:') -+ call assert_fails('call WrongSyntax()', 'E488:') -+ call assert_fails('call MissingEnd()', 'E990:') -+ endfunc -+ -+ func WrongSyntax() -+ let fail =<< that there -+ endfunc -+ -+ func MissingEnd() -+ let fail =<< END -+ endfunc -*** ../vim-8.1.1353/src/version.c 2019-05-19 16:38:53.034327682 +0200 ---- src/version.c 2019-05-19 17:34:18.127908356 +0200 -*************** -*** 769,770 **** ---- 769,772 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 1354, - /**/ - --- -Imagine a world without hypothetical situations. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ an exciting new programming language -- http://www.Zimbu.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |