From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2152 invoked from network); 12 Jul 2000 10:30:01 -0000 Received: from sunsite.auc.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 12 Jul 2000 10:30:01 -0000 Received: (qmail 3429 invoked by alias); 12 Jul 2000 10:29:46 -0000 Mailing-List: contact zsh-workers-help@sunsite.auc.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 12228 Received: (qmail 3422 invoked from network); 12 Jul 2000 10:29:46 -0000 Date: Wed, 12 Jul 2000 12:29:43 +0200 (MET DST) Message-Id: <200007121029.MAA21938@beta.informatik.hu-berlin.de> From: Sven Wischnowsky To: zsh-workers@sunsite.auc.dk In-reply-to: "Bart Schaefer"'s message of Wed, 12 Jul 2000 08:25:15 +0000 Subject: Re: Bug in ${(z)...} lexing, or what? Bart Schaefer wrote: > This has me baffled. > > Consider the following innocuous-looking function: > > widget() { > zle up-history > lastcmd=( ${(z)BUFFER} ) > zle down-history > } > > Now try this: > > zagzig% zle -N widget > zagzig% bindkey '\e=' widget > zagzig% ( setopt extendedglob ; [[ 'foo[x]=y' = (#i)[[:alpha:]][][[:alnum:]]#=* ]] ) > zagzig% echo $lastcmd > ( setopt extendedglob ; [[ 'foo[x]=y' = ( ; > zagzig% > > What happened to everything after the '#' in '(#i)' ?? And where did that > extra semicolon come from? > > The really strange thing is that this happens only in ZLE widgets, and only > when there's a command separator (semi, amper, pipe, etc.) somewhere to the > left of the [[ ]] expression. If I try the same thing outside of ZLE, it > works perfectly; if I try a bare glob (not in [[ ... ]]) it also works. You have interactive_comments set, right? This should fix that (I haven't looked close enough to find out when it did that and when it didn't). There is still something fishy, though. A string like `ls (#i)foo' is broken into `ls' and `(#i)foo', but `[[ (#i)foo ]]' is broken into `[[', `(', `#i', `)', ... I haven't found out where and why this happens yet. Bye Sven Index: Src/hist.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/hist.c,v retrieving revision 1.8 diff -u -r1.8 hist.c --- Src/hist.c 2000/05/30 14:08:48 1.8 +++ Src/hist.c 2000/07/12 10:29:12 @@ -2058,15 +2058,15 @@ bufferwords(LinkList list, char *buf, int *index) { int num = 0, cur = -1, got = 0, ne = noerrs, ocs = cs; - int owb = wb, owe = we, oadx = addedx, ozp = zleparse; + int owb = wb, owe = we, oadx = addedx, ozp = zleparse, oexp = expanding; char *p; if (!list) list = newlinklist(); - zleparse = 1; + zleparse = 3; addedx = 0; - noerrs = 1; + noerrs = expanding = 1; lexsave(); if (buf) { int l = strlen(buf); @@ -2133,6 +2133,7 @@ inpop(); errflag = 0; zleparse = ozp; + expanding = oexp; noerrs = ne; lexrestore(); cs = ocs; Index: Src/lex.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/lex.c,v retrieving revision 1.8 diff -u -r1.8 lex.c --- Src/lex.c 2000/06/06 08:35:54 1.8 +++ Src/lex.c 2000/07/12 10:29:12 @@ -673,7 +673,7 @@ /* chars in initial position in word */ if (c == hashchar && - (isset(INTERACTIVECOMMENTS) || + ((zleparse != 3 && isset(INTERACTIVECOMMENTS)) || (!zleparse && !expanding && (!interact || unset(SHINSTDIN) || strin)))) { /* History is handled here to prevent extra * -- Sven Wischnowsky wischnow@informatik.hu-berlin.de