From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19454 invoked from network); 13 Aug 2007 21:25:12 -0000 X-Spam-Checker-Version: SpamAssassin 3.2.1 (2007-05-02) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-2.5 required=5.0 tests=AWL,BAYES_00 autolearn=ham version=3.2.1 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 13 Aug 2007 21:25:12 -0000 Received-SPF: none (ns1.primenet.com.au: domain at sunsite.dk does not designate permitted sender hosts) Received: (qmail 29531 invoked from network); 13 Aug 2007 21:25:04 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 13 Aug 2007 21:25:04 -0000 Received: (qmail 4102 invoked by alias); 13 Aug 2007 21:25:01 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 23757 Received: (qmail 4066 invoked from network); 13 Aug 2007 21:25:00 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by sunsite.dk with SMTP; 13 Aug 2007 21:25:00 -0000 Received: (qmail 29024 invoked from network); 13 Aug 2007 21:25:00 -0000 Received: from mtaout01-winn.ispmail.ntl.com (81.103.221.47) by a.mx.sunsite.dk with SMTP; 13 Aug 2007 21:24:54 -0000 Received: from aamtaout03-winn.ispmail.ntl.com ([81.103.221.35]) by mtaout01-winn.ispmail.ntl.com with ESMTP id <20070813212453.CKGD1783.mtaout01-winn.ispmail.ntl.com@aamtaout03-winn.ispmail.ntl.com> for ; Mon, 13 Aug 2007 22:24:53 +0100 Received: from pws-pc.ntlworld.com ([81.107.45.67]) by aamtaout03-winn.ispmail.ntl.com with ESMTP id <20070813212453.ENCE26699.aamtaout03-winn.ispmail.ntl.com@pws-pc.ntlworld.com> for ; Mon, 13 Aug 2007 22:24:53 +0100 Received: from pws-pc.ntlworld.com (pws-pc.ntlworld.com [127.0.0.1]) by pws-pc.ntlworld.com (8.14.1/8.13.8) with ESMTP id l7DLOgUL004001 for ; Mon, 13 Aug 2007 22:24:42 +0100 Message-Id: <200708132124.l7DLOgUL004001@pws-pc.ntlworld.com> From: Peter Stephenson To: zsh-workers@sunsite.dk Subject: Re: Unexpected side effect of 'setopt correct' In-Reply-To: Message from "Matt Wozniski" of "Mon, 13 Aug 2007 16:42:23 EDT." <17393e3e0708131342v4f1054cdo42a7076a91b8f0b4@mail.gmail.com> Date: Mon, 13 Aug 2007 22:24:42 +0100 "Matt Wozniski" wrote: > > > mastermind% function pid() { > > ^^ (actually you don't want the () in this case) > > I've seen you mention before that the () shouldn't be used after > 'function', but the grammar says it's allowed: > function word ... [ () ] [ term ] { list } > Either you've made a tiny mistake in the grammar or on the lists. :) The documentation's right: the parser will ignore the () if it's already found the function keyword. > I understand what you're saying, but have a tiny suggestion to make: I > understand the necessity of correcting the command before parsing its > arguments, but in the case of "pid() {\n", the first word is not "pid" > but "pid()" - so, I haven't sourcedived on this, but I assume while > parsing out the command, it's iterating over the line, peeking at the > next character, and checking if it's a whitespace or '('... Wouldn't > it be easy to special-case "word()" to turn off correction in the same > way as "function word" turns it off? Of course, that wouldn't work as > easily for "word ()" with some whitespace stuck in there, but I'd > consider it a slight improvement if it's as easy a tweak as I think it > would be. :) Yes, it looks like it can be done with a bit of hackery in this case. Index: Src/lex.c =================================================================== RCS file: /cvsroot/zsh/zsh/Src/lex.c,v retrieving revision 1.39 diff -u -r1.39 lex.c --- Src/lex.c 3 Jun 2007 17:44:20 -0000 1.39 +++ Src/lex.c 13 Aug 2007 21:20:59 -0000 @@ -66,7 +66,12 @@ /**/ int inalmore; -/* don't do spelling correction */ +/* + * Don't do spelling correction. + * Bit 1 is only valid for the current word. It's + * set when we detect a lookahead that stops the word from + * needing correction. + */ /**/ int nocorrect; @@ -344,6 +349,7 @@ do tok = gettok(); while (tok != ENDINPUT && exalias()); + nocorrect &= 1; if (tok == NEWLIN || tok == ENDINPUT) { while (hdocs) { struct heredocs *next = hdocs->next; @@ -629,7 +635,7 @@ } /**/ -int +static int gettok(void) { int c, d; @@ -1036,8 +1042,16 @@ * pws 1999/6/14 */ if (e == ')' || (isset(SHGLOB) && inblank(e) && !bct && - !brct && !intpos && incmdpos)) + !brct && !intpos && incmdpos)) { + /* + * Either a () token, or a command word with + * something suspiciously like a ksh function + * definition. + * The current word isn't spellcheckable. + */ + nocorrect |= 2; goto brk; + } } /* * This also handles the [k]sh `foo( )' function definition.