Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Unexpected side effect of 'setopt correct'



On 8/13/07, Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx> wrote:
> On Sun, 5 Aug 2007 22:36:38 -0400
> "Matt Wozniski" <godlygeek@xxxxxxxxx> wrote:
> > I just noticed this effect of 'setopt correct'.. Is this intentional behavior?
>
> Ish.
>
> > 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.  :)

> > function>
> > mastermind%
> >
> > Is it intentional that it attempts to correct on a function
> > definition?  Is it intentional that it only attempts to correct one of
> > the two types of function definition?  Something about this behavior
> > caught me off guard.  :)
>
> Correction happens as the line is parsed.  In the first case, the shell
> has read as far as "pid", and assumes to begin with it's a command word,
> hence it applies correction.  It needs to do this early on because it
> has to correct the word before it starts parsing the arguments to it.
> To change this would require a lot more lookahead, or we'd have to live
> with side effects like not being able to correct to special shell
> constructs.
>
> In the second case, since we've found the keyword "function", we know
> the next word isn't expected to be an existing command and we can
> disable spelling correction immediately,

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.  :)

~Matt



Messages sorted by: Reverse Date, Date, Thread, Author