forked from aniani/vim
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)
This commit is contained in:
parent
4e640bd930
commit
9bbf63dbf8
24
src/eval.c
24
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");
|
static char *e_float_as_string = N_("E806: using Float as a String");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define NAMESPACE_CHAR (char_u *)"abglstvw"
|
||||||
|
|
||||||
static dictitem_T globvars_var; /* variable used for g: */
|
static dictitem_T globvars_var; /* variable used for g: */
|
||||||
#define globvarht globvardict.dv_hashtab
|
#define globvarht globvardict.dv_hashtab
|
||||||
|
|
||||||
@ -20666,7 +20668,17 @@ get_id_len(arg)
|
|||||||
|
|
||||||
/* Find the end of the name. */
|
/* Find the end of the name. */
|
||||||
for (p = *arg; eval_isnamec(*p); ++p)
|
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 */
|
if (p == *arg) /* no name found */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -20766,6 +20778,7 @@ find_name_end(arg, expr_start, expr_end, flags)
|
|||||||
int mb_nest = 0;
|
int mb_nest = 0;
|
||||||
int br_nest = 0;
|
int br_nest = 0;
|
||||||
char_u *p;
|
char_u *p;
|
||||||
|
int len;
|
||||||
|
|
||||||
if (expr_start != NULL)
|
if (expr_start != NULL)
|
||||||
{
|
{
|
||||||
@ -20801,6 +20814,15 @@ find_name_end(arg, expr_start, expr_end, flags)
|
|||||||
if (*p == NUL)
|
if (*p == NUL)
|
||||||
break;
|
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)
|
if (mb_nest == 0)
|
||||||
{
|
{
|
||||||
|
@ -218,6 +218,24 @@ endfun
|
|||||||
0:call setpos('.', sp)
|
0:call setpos('.', sp)
|
||||||
jyl:$put
|
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
|
:/^start:/+1,$wq! test.out
|
||||||
:" vim: et ts=4 isk-=\: fmr=???,???
|
:" vim: et ts=4 isk-=\: fmr=???,???
|
||||||
:call getchar()
|
:call getchar()
|
||||||
|
Binary file not shown.
@ -741,6 +741,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1105,
|
||||||
/**/
|
/**/
|
||||||
1104,
|
1104,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user