summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/eval.c24
-rw-r--r--src/testdir/test_eval.in18
-rw-r--r--src/testdir/test_eval.okbin11246 -> 11279 bytes
-rw-r--r--src/version.c2
4 files changed, 43 insertions, 1 deletions
diff --git a/src/eval.c b/src/eval.c
index 1e2a0419e6..d4e3b9ef59 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -115,6 +115,8 @@ static char *e_illvar = N_("E461: Illegal variable name: %s");
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, flags)
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, flags)
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)
{
diff --git a/src/testdir/test_eval.in b/src/testdir/test_eval.in
index 087e6099ac..84f26bafc1 100644
--- a/src/testdir/test_eval.in
+++ b/src/testdir/test_eval.in
@@ -218,6 +218,24 @@ endfun
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()
diff --git a/src/testdir/test_eval.ok b/src/testdir/test_eval.ok
index cda425c92e..9ffa54157f 100644
--- a/src/testdir/test_eval.ok
+++ b/src/testdir/test_eval.ok
Binary files differ
diff --git a/src/version.c b/src/version.c
index baecfc7d00..f74281d797 100644
--- 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,