summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.1114
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.1114')
-rw-r--r--data/vim/patches/8.1.1114273
1 files changed, 273 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1114 b/data/vim/patches/8.1.1114
new file mode 100644
index 000000000..9e2453f14
--- /dev/null
+++ b/data/vim/patches/8.1.1114
@@ -0,0 +1,273 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.1114
+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.1114
+Problem: Confusing overloaded operator "." for string concatenation.
+Solution: Add ".." for string concatenation. Also "let a ..= b".
+Files: src/eval.c, src/testdir/test_eval_stuff.vim, runtime/doc/eval.txt
+
+
+*** ../vim-8.1.1113/src/eval.c 2019-03-30 20:04:05.024567549 +0100
+--- src/eval.c 2019-04-04 15:23:48.333402717 +0200
+***************
+*** 1234,1239 ****
+--- 1234,1240 ----
+ * ":let var /= expr" assignment command.
+ * ":let var %= expr" assignment command.
+ * ":let var .= expr" assignment command.
++ * ":let var ..= expr" assignment command.
+ * ":let [var1, var2] = expr" unpack list.
+ */
+ void
+***************
+*** 1255,1262 ****
+ if (argend > arg && argend[-1] == '.') // for var.='str'
+ --argend;
+ expr = skipwhite(argend);
+! if (*expr != '=' && !(vim_strchr((char_u *)"+-*/%.", *expr) != NULL
+! && expr[1] == '='))
+ {
+ /*
+ * ":let" without "=": list variables
+--- 1256,1263 ----
+ if (argend > arg && argend[-1] == '.') // for var.='str'
+ --argend;
+ expr = skipwhite(argend);
+! if (*expr != '=' && !((vim_strchr((char_u *)"+-*/%.", *expr) != NULL
+! && expr[1] == '=') || STRNCMP(expr, "..=", 3) == 0))
+ {
+ /*
+ * ":let" without "=": list variables
+***************
+*** 1286,1292 ****
+--- 1287,1297 ----
+ if (*expr != '=')
+ {
+ if (vim_strchr((char_u *)"+-*/%.", *expr) != NULL)
++ {
+ op[0] = *expr; // +=, -=, *=, /=, %= or .=
++ if (expr[0] == '.' && expr[1] == '.') // ..=
++ ++expr;
++ }
+ expr = skipwhite(expr + 2);
+ }
+ else
+***************
+*** 3813,3818 ****
+--- 3818,3824 ----
+ * + number addition
+ * - number subtraction
+ * . string concatenation
++ * .. string concatenation
+ *
+ * "arg" must point to the first non-white of the expression.
+ * "arg" is advanced to the next non-white after the recognized expression.
+***************
+*** 3872,3877 ****
+--- 3878,3885 ----
+ /*
+ * Get the second variable.
+ */
++ if (op == '.' && *(*arg + 1) == '.') // .. string concatenation
++ ++*arg;
+ *arg = skipwhite(*arg + 1);
+ if (eval6(arg, &var2, evaluate, op == '.') == FAIL)
+ {
+*** ../vim-8.1.1113/src/testdir/test_eval_stuff.vim 2019-01-24 13:58:05.817568979 +0100
+--- src/testdir/test_eval_stuff.vim 2019-04-04 15:17:26.815290594 +0200
+***************
+*** 94,96 ****
+--- 94,125 ----
+ call assert_fails('let v:errmsg = []', 'E730:')
+ let v:errmsg = ''
+ endfunc
++
++ func Test_string_concatenation()
++ call assert_equal('ab', 'a'.'b')
++ call assert_equal('ab', 'a' .'b')
++ call assert_equal('ab', 'a'. 'b')
++ call assert_equal('ab', 'a' . 'b')
++
++ call assert_equal('ab', 'a'..'b')
++ call assert_equal('ab', 'a' ..'b')
++ call assert_equal('ab', 'a'.. 'b')
++ call assert_equal('ab', 'a' .. 'b')
++
++ let a = 'a'
++ let b = 'b'
++ let a .= b
++ call assert_equal('ab', a)
++
++ let a = 'a'
++ let a.=b
++ call assert_equal('ab', a)
++
++ let a = 'a'
++ let a ..= b
++ call assert_equal('ab', a)
++
++ let a = 'a'
++ let a..=b
++ call assert_equal('ab', a)
++ endfunc
+*** ../vim-8.1.1113/runtime/doc/eval.txt 2019-04-04 13:44:31.031594540 +0200
+--- runtime/doc/eval.txt 2019-04-04 15:26:47.752500735 +0200
+***************
+*** 773,782 ****
+ expr2 ? expr1 : expr1 if-then-else
+
+ |expr2| expr3
+! expr3 || expr3 .. logical OR
+
+ |expr3| expr4
+! expr4 && expr4 .. logical AND
+
+ |expr4| expr5
+ expr5 == expr5 equal
+--- 786,795 ----
+ expr2 ? expr1 : expr1 if-then-else
+
+ |expr2| expr3
+! expr3 || expr3 ... logical OR
+
+ |expr3| expr4
+! expr4 && expr4 ... logical AND
+
+ |expr4| expr5
+ expr5 == expr5 equal
+***************
+*** 793,810 ****
+ etc. As above, append ? for ignoring case, # for
+ matching case
+
+! expr5 is expr5 same |List| instance
+! expr5 isnot expr5 different |List| instance
+
+ |expr5| expr6
+! expr6 + expr6 .. number addition, list or blob concatenation
+! expr6 - expr6 .. number subtraction
+! expr6 . expr6 .. string concatenation
+
+ |expr6| expr7
+! expr7 * expr7 .. number multiplication
+! expr7 / expr7 .. number division
+! expr7 % expr7 .. number modulo
+
+ |expr7| expr8
+ ! expr7 logical NOT
+--- 806,825 ----
+ etc. As above, append ? for ignoring case, # for
+ matching case
+
+! expr5 is expr5 same |List|, |Dictionary| or |Blob| instance
+! expr5 isnot expr5 different |List|, |Dictionary| or |Blob|
+! instance
+
+ |expr5| expr6
+! expr6 + expr6 ... number addition, list or blob concatenation
+! expr6 - expr6 ... number subtraction
+! expr6 . expr6 ... string concatenation
+! expr6 .. expr6 ... string concatenation
+
+ |expr6| expr7
+! expr7 * expr7 ... number multiplication
+! expr7 / expr7 ... number division
+! expr7 % expr7 ... number modulo
+
+ |expr7| expr8
+ ! expr7 logical NOT
+***************
+*** 833,839 ****
+ {args -> expr1} lambda expression
+
+
+! ".." indicates that the operations in this level can be concatenated.
+ Example: >
+ &nu || &list && &shell == "csh"
+
+--- 848,854 ----
+ {args -> expr1} lambda expression
+
+
+! "..." indicates that the operations in this level can be concatenated.
+ Example: >
+ &nu || &list && &shell == "csh"
+
+***************
+*** 1012,1027 ****
+
+ expr5 and expr6 *expr5* *expr6*
+ ---------------
+! expr6 + expr6 .. Number addition or |List| concatenation *expr-+*
+! expr6 - expr6 .. Number subtraction *expr--*
+! expr6 . expr6 .. String concatenation *expr-.*
+
+ For |Lists| only "+" is possible and then both expr6 must be a list. The
+ result is a new list with the two lists Concatenated.
+
+! expr7 * expr7 .. Number multiplication *expr-star*
+! expr7 / expr7 .. Number division *expr-/*
+! expr7 % expr7 .. Number modulo *expr-%*
+
+ For all, except ".", Strings are converted to Numbers.
+ For bitwise operators see |and()|, |or()| and |xor()|.
+--- 1027,1046 ----
+
+ expr5 and expr6 *expr5* *expr6*
+ ---------------
+! expr6 + expr6 Number addition, |List| or |Blob| concatenation *expr-+*
+! expr6 - expr6 Number subtraction *expr--*
+! expr6 . expr6 String concatenation *expr-.*
+! expr6 .. expr6 String concatenation *expr-..*
+
+ For |Lists| only "+" is possible and then both expr6 must be a list. The
+ result is a new list with the two lists Concatenated.
+
+! For String concatenation ".." is preferred, since "." is ambiguous, it is also
+! used for |Dict| member access and floating point numbers.
+!
+! expr7 * expr7 Number multiplication *expr-star*
+! expr7 / expr7 Number division *expr-/*
+! expr7 % expr7 Number modulo *expr-%*
+
+ For all, except ".", Strings are converted to Numbers.
+ For bitwise operators see |and()|, |or()| and |xor()|.
+***************
+*** 1080,1085 ****
+--- 1099,1111 ----
+
+ expr8 *expr8*
+ -----
++ This expression is either |expr9| or a sequence of the alternatives below,
++ in any order. E.g., these are all possible:
++ expr9[expr1].name
++ expr9.name[expr1]
++ expr9(expr1, ...)[expr1].name
++
++
+ expr8[expr1] item of String or |List| *expr-[]* *E111*
+ *E909* *subscript*
+ If expr8 is a Number or String this results in a String that contains the
+*** ../vim-8.1.1113/src/version.c 2019-04-04 15:04:32.966792195 +0200
+--- src/version.c 2019-04-04 15:32:15.826390483 +0200
+***************
+*** 773,774 ****
+--- 773,776 ----
+ { /* Add new patch number below this line */
++ /**/
++ 1114,
+ /**/
+
+--
+Press any key to continue, press any other key to quit.
+
+ /// 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 ///