Consider the following script: let g=1 let a=2 let b=3
let g let {0==1 ? "a" : "b"} let {0==1 ? "a" : "b"} g let g {0 ? "a" : "b"} let g {0==1 ? "a" : "b"} . It will output the following: fourth :let: g #1 fifth :let: b #3 sixths :let: b #3 g #1 seventh :let: g #1 b #3 eights :let: E15: Invalid expression: =1 ? "a" : "b"} . Reason: to determine expression start vim_strchr(argend, '=') is used. To do this correctly one needs to use expr = skipwhite(argend); if (*expr != '=' && !(vim_strchr("+-.", *expr) != NULL && expr[1] == '=')) # HG changeset patch # User ZyX <kp-...@ya.ru> # Date 1396172847 -14400 # Sun Mar 30 13:47:27 2014 +0400 # Branch fix-let-curly-brace-eq # Node ID 65a5c984027e8587502bcf6252b3bf0e756740e5 # Parent 70fac246bfe4128c74f8312b48a408c4cca1ed7b Fix :let var1 {0==1 ? "var2": "var3"} diff -r 70fac246bfe4 -r 65a5c984027e src/eval.c --- a/src/eval.c Wed Mar 19 18:57:54 2014 +0100 +++ b/src/eval.c Sun Mar 30 13:47:27 2014 +0400 @@ -1855,8 +1855,9 @@ return; if (argend > arg && argend[-1] == '.') /* for var.='str' */ --argend; - expr = vim_strchr(argend, '='); - if (expr == NULL) + expr = skipwhite(argend); + if (*expr != '=' && !(vim_strchr((char_u *)"+-.", *expr) != NULL + && expr[1] == '=')) { /* * ":let" without "=": list variables @@ -1885,12 +1886,14 @@ { op[0] = '='; op[1] = NUL; - if (expr > argend) - { - if (vim_strchr((char_u *)"+-.", expr[-1]) != NULL) - op[0] = expr[-1]; /* +=, -= or .= */ - } - expr = skipwhite(expr + 1); + if (*expr != '=') + { + if (vim_strchr((char_u *)"+-.", *expr) != NULL) + op[0] = *expr; /* +=, -= or .= */ + expr = skipwhite(expr + 2); + } + else + expr = skipwhite(expr + 1); if (eap->skip) ++emsg_skip; diff -r 70fac246bfe4 -r 65a5c984027e src/testdir/test104.in --- a/src/testdir/test104.in Wed Mar 19 18:57:54 2014 +0100 +++ b/src/testdir/test104.in Sun Mar 30 13:47:27 2014 +0400 @@ -1,4 +1,4 @@ -Tests for autoload. vim: set ft=vim ts=8 : +Tests for :let. vim: set ft=vim ts=8 : STARTTEST :so small.vim @@ -10,6 +10,20 @@ :catch : $put ='FAIL: ' . v:exception :endtry +:let a = 1 +:let b = 2 +:for letargs in ['a b', '{0 == 1 ? "a" : "b"}', '{0 == 1 ? "a" : "b"} a', 'a {0 == 1 ? "a" : "b"}'] +: try +: redir => messages +: execute 'let' letargs +: redir END +: $put ='OK:' +: $put =split(substitute(messages, '\n', '\0 ', 'g'), '\n') +: catch +: $put ='FAIL: ' . v:exception +: redir END +: endtry +:endfor :/^Results/,$wq! test.out ENDTEST diff -r 70fac246bfe4 -r 65a5c984027e src/testdir/test104.ok --- a/src/testdir/test104.ok Wed Mar 19 18:57:54 2014 +0100 +++ b/src/testdir/test104.ok Sun Mar 30 13:47:27 2014 +0400 @@ -1,2 +1,13 @@ Results of test104: OK: function('tr') +OK: + a #1 + b #2 +OK: + b #2 +OK: + b #2 + a #1 +OK: + a #1 + b #2 -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
diff -crN vim-small-patches.70fac246bfe4/src/eval.c vim-small-patches.65a5c984027e/src/eval.c *** vim-small-patches.70fac246bfe4/src/eval.c 2014-03-30 13:48:34.817317900 +0400 --- vim-small-patches.65a5c984027e/src/eval.c 2014-03-30 13:48:34.839317903 +0400 *************** *** 1855,1862 **** return; if (argend > arg && argend[-1] == '.') /* for var.='str' */ --argend; ! expr = vim_strchr(argend, '='); ! if (expr == NULL) { /* * ":let" without "=": list variables --- 1855,1863 ---- return; 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 *************** *** 1885,1896 **** { op[0] = '='; op[1] = NUL; ! if (expr > argend) { ! if (vim_strchr((char_u *)"+-.", expr[-1]) != NULL) ! op[0] = expr[-1]; /* +=, -= or .= */ } ! expr = skipwhite(expr + 1); if (eap->skip) ++emsg_skip; --- 1886,1899 ---- { op[0] = '='; op[1] = NUL; ! if (*expr != '=') { ! if (vim_strchr((char_u *)"+-.", *expr) != NULL) ! op[0] = *expr; /* +=, -= or .= */ ! expr = skipwhite(expr + 2); } ! else ! expr = skipwhite(expr + 1); if (eap->skip) ++emsg_skip; diff -crN vim-small-patches.70fac246bfe4/src/testdir/test104.in vim-small-patches.65a5c984027e/src/testdir/test104.in *** vim-small-patches.70fac246bfe4/src/testdir/test104.in 2014-03-30 13:48:34.796317898 +0400 --- vim-small-patches.65a5c984027e/src/testdir/test104.in 2014-03-30 13:48:34.819317901 +0400 *************** *** 1,4 **** ! Tests for autoload. vim: set ft=vim ts=8 : STARTTEST :so small.vim --- 1,4 ---- ! Tests for :let. vim: set ft=vim ts=8 : STARTTEST :so small.vim *************** *** 10,15 **** --- 10,29 ---- :catch : $put ='FAIL: ' . v:exception :endtry + :let a = 1 + :let b = 2 + :for letargs in ['a b', '{0 == 1 ? "a" : "b"}', '{0 == 1 ? "a" : "b"} a', 'a {0 == 1 ? "a" : "b"}'] + : try + : redir => messages + : execute 'let' letargs + : redir END + : $put ='OK:' + : $put =split(substitute(messages, '\n', '\0 ', 'g'), '\n') + : catch + : $put ='FAIL: ' . v:exception + : redir END + : endtry + :endfor :/^Results/,$wq! test.out ENDTEST diff -crN vim-small-patches.70fac246bfe4/src/testdir/test104.ok vim-small-patches.65a5c984027e/src/testdir/test104.ok *** vim-small-patches.70fac246bfe4/src/testdir/test104.ok 2014-03-30 13:48:34.795317898 +0400 --- vim-small-patches.65a5c984027e/src/testdir/test104.ok 2014-03-30 13:48:34.819317901 +0400 *************** *** 1,2 **** --- 1,13 ---- Results of test104: OK: function('tr') + OK: + a #1 + b #2 + OK: + b #2 + OK: + b #2 + a #1 + OK: + a #1 + b #2