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

Raspunde prin e-mail lui