# HG changeset patch # User Christian Brabandt # Date 1452960005 -3600 # Node ID 9c420b8db435db3469d21d5656bc370c3dff160b # Parent a49853dd0ccf132a4f83e323a3128c9a063c4645 commit https://github.com/vim/vim/commit/9bbf63dbf8286fadc0cd6b3428010abb67b1b64d Author: Bram Moolenaar 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) diff --git a/src/eval.c b/src/eval.c --- 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) { diff --git a/src/testdir/test_eval.in b/src/testdir/test_eval.in --- 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() diff --git a/src/testdir/test_eval.ok b/src/testdir/test_eval.ok index cda425c92e30762a9c5949964be411a517884f0d..9ffa54157fabaf710b0af4f13d191292d206e785 GIT binary patch literal 11279 zc%02zOK;ma5awCHUUMeA2Pcabwk4+zFMRMrP68CYwCE+sL6Q~63;6*_X&VIl-^IQ(%{H{;-uN&#JM6K;#o~q=KJw{Kqhg)VA}#ZD zrRL4#zLK1FqwX8ZktY0_bkDp9qnjwciS4K<_Qqpx%tQ5nAn8TpY zI99+h=$j-L3hlxsF~vY~LB(H<>P}HzipdD7JDloLVP4u)rWmL$QK~CNb;UTYu;{%~ zP**mCDF%kCvCPZKexGia>+Omb>|d7BY`skj`eR+*0q>dZ#RM`nfmEHKsVY<;F{Qqp zw5WnkUm+Mfs58j12^Rm-R_GB6Uz#FbwCJilF@%kbsaC{4U`ZsGR7V&qD5swX+1d*! z9hZZy!YJQovljKY3mI!E9jQ=t))8@@Lf#rJF8K zNE(gA=TA?z55&23`+66yZ-Dj)Y|DOQ8K#mzEx{D6+Zt;sN@T5+HAi)UVsuD$6K8et zi7puk6E+Oh#P=FAo9mfnMsC`ze}yYjy^03sin0mGKsIZ(0wf0R(1H3t4MGH)H{_ zU(0ZlM47Q$TMIr7bYRw)Y9nfyr$J+t6X2RjuGl!I+O>5C&d+LG_JH13>a$t`(_ESPhr&v5OURmgi% z=8pVKhJMr%`%=#cbk#@(StA)*RjcffBD7;u5gtpoVxz#HytC7UNX05CRM!>6^}K1- ztP)A}B23&Y|0*TK4v236f`w@q`J+0oz;EPOt7?^WQiPs+)oT~}_>K-CA}`f0ZiWin z)%W~kZJ{fGc#{{rM^K?r>ssNShSeU|H{qS+5sXmcF_VIX^*SMw9 zKHchG%brHWVdm@iby%tpqU@dseCV7sOKTE6AJvs!#8WzsL?cz4`^Tl5be7w-XOH2l zBxy^;=YzUZRIUJ5LX(wLIpgb?*Zax))|@5k*>6uk!&k}Dn#|7zHFhauo1!Y$DFKm> zB|WK9?z}J8;k<8s%Fu61f9bU_Zck^!ZAH~q8eRfxl#OHlnk7c9oWOOSQ$Bw>@W3*B z+qbfJ_|_NqL_P$Se5gcBgHIn7t}x+|mOx zuVK?Db5$cdOl&8(pz?x01;)q_gu)S381avqIj|~R0#e@w1ObD>_7Zoj68Z}Cy4Z3Q zRbhp_r;R;MZ^$)c>$_#1A@T8 zCh!u6to`N{==HwDQS6OJZ8QRnJpq=Mnn=h;Eu1hM#)H1?ofK96$>+ct9aaPSt%>i; z^$!f}@5>d9TrVIn9s=TkhEE-TjhohIn*S4*^!FALPrp_GlP^|586!3jG#XK!+|g*e z6!T1rV!hkeex1{USKs60J#2&OsVVmC6*I-)b#LrKCvJEsTSCVqum&^*sd0=22meh{ zujBkR6E+8F0zYW#!7rLnWYPkS`md}sI;nmz_2r=`(+y3s^*-K3`O^ENvG?dPn(Ve^ zx-APq(i9tv$Jij0#cq?9cf2o6vmzCyw#cA5L|4u=%=2Adc;U}9xfe}u5@lJ{<$hal zPPyc46b=R-NA&Zqr0I5dzhY6FukJV8U3$CA>FxbCDOvQ6l&u4C@Gn5hPkZ0cVGaAk zh<@Ge=qB1eJP-Mr)k)t1eIN8k^q&7*hkjy*0~!@HqF>6K3EbX2{$0Zu0LFYR+=%jr z!;siKuWw%HP^Z^nD4hZO-|;&(+J_GTUlLK2_EA};`LE@o96lIi` z^0*i=?)|!qGVWWa7CGfiuz1p(sw_ZB(mqy}~L0QRGX_?&T c`(4pvZ<<}aciu9+<*o42Tbj4(F7;CH9|rs{s{jB1 diff --git a/src/version.c b/src/version.c --- 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,