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 <[email protected]>
# 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 [email protected].
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