changeset 7611:9c420b8db435 v7.4.1105

commit https://github.com/vim/vim/commit/9bbf63dbf8286fadc0cd6b3428010abb67b1b64d Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jan 16 16:49:28 2016 +0100 patch 7.4.1105 Problem: When using slices there is a mixup of variable name and namespace. Solution: Recognize variables that can't be a namespace. (Hirohito Higashi)
author Christian Brabandt <cb@256bit.org>
date Sat, 16 Jan 2016 17:00:05 +0100
parents a49853dd0ccf
children 68c8b377f278
files src/eval.c src/testdir/test_eval.in src/testdir/test_eval.ok src/version.c
diffstat 4 files changed, 43 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -115,6 +115,8 @@ static char *e_illvar = N_("E461: Illega
 static char *e_float_as_string = N_("E806: using Float as a String");
 #endif
 
+#define NAMESPACE_CHAR	(char_u *)"abglstvw"
+
 static dictitem_T	globvars_var;		/* variable used for g: */
 #define globvarht globvardict.dv_hashtab
 
@@ -20666,7 +20668,17 @@ get_id_len(arg)
 
     /* Find the end of the name. */
     for (p = *arg; eval_isnamec(*p); ++p)
-	;
+    {
+	if (*p == ':')
+	{
+	    /* "s:" is start of "s:var", but "n:" is not and can be used in
+	     * slice "[n:]".  Also "xx:" is not a namespace. */
+	    len = (int)(p - *arg);
+	    if ((len == 1 && vim_strchr(NAMESPACE_CHAR, **arg) == NULL)
+		    || len > 1)
+		break;
+	}
+    }
     if (p == *arg)	    /* no name found */
 	return 0;
 
@@ -20766,6 +20778,7 @@ find_name_end(arg, expr_start, expr_end,
     int		mb_nest = 0;
     int		br_nest = 0;
     char_u	*p;
+    int		len;
 
     if (expr_start != NULL)
     {
@@ -20801,6 +20814,15 @@ find_name_end(arg, expr_start, expr_end,
 	    if (*p == NUL)
 		break;
 	}
+	else if (br_nest == 0 && mb_nest == 0 && *p == ':')
+	{
+	    /* "s:" is start of "s:var", but "n:" is not and can be used in
+	     * slice "[n:]".  Also "xx:" is not a namespace. */
+	    len = (int)(p - arg);
+	    if ((len == 1 && vim_strchr(NAMESPACE_CHAR, *arg) == NULL)
+		    || len > 1)
+		break;
+	}
 
 	if (mb_nest == 0)
 	{
--- a/src/testdir/test_eval.in
+++ b/src/testdir/test_eval.in
@@ -218,6 +218,24 @@ 6l:let sp = getcurpos()
 0:call setpos('.', sp)
 jyl:$put
 :"
+:" substring and variable name
+:let str = 'abcdef'
+:let n = 3
+:$put =str[n:]
+:$put =str[:n]
+:$put =str[n:n]
+:unlet n
+:let nn = 3
+:$put =str[nn:]
+:$put =str[:nn]
+:$put =str[nn:nn]
+:unlet nn
+:let b:nn = 4
+:$put =str[b:nn:]
+:$put =str[:b:nn]
+:$put =str[b:nn:b:nn]
+:unlet b:nn
+:"
 :/^start:/+1,$wq! test.out
 :" vim: et ts=4 isk-=\: fmr=???,???
 :call getchar()
index cda425c92e30762a9c5949964be411a517884f0d..9ffa54157fabaf710b0af4f13d191292d206e785
GIT binary patch
literal 11279
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
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1105,
+/**/
     1104,
 /**/
     1103,