Mercurial > vim
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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