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

Re: Remaining zsh3.0-pre2 bugs



On Jul 6, 10:53pm, Bart Schaefer wrote:
} Subject: Re: Remaining zsh3.0-pre2 bugs
}
} On Jul 6,  3:59pm, Huy Le wrote:
} } Subject: Remaining zsh3.0-pre2 bugs
} }
} } 1. History bug:
} } The magic-space binding seems to mess up the history of
} } a line with a quoted argument that spawns two lines.
} 
} This is not a magic-space bug, specifically.  It happens any time
} doexpandhist() is called on the second or later line of a command
} that spans multiple lines.
} 
} zsh[85] echo 'a
} > b'<TAB><RET>	<-- TAB moves cursor to beginning of line, then RET
} a
} b
} zsh[85] history -4	<-- Note event number in prompt hasn't changed!
}    81   c
}    82  history
}    83   co
}    84  history -2
}    85  history -4
} 
} I think the problem is with the "if (!err)" block near the end of
} doexpandhist(), because it has a comment about resetting the cursor
} to the beginning of line for vi mode.  However, I don't know enough
} about how history works to want to mess with it.

Further investigation indicates that docomplete() itself is also
broken, in this section:

    /* If we are completing in a multi-line buffer (which was not taken *
     * from the history), we have to prepend the stuff saved in chline  *
     * to the contents of line.                                         */

    if (!isfirstln && chline != NULL) {
	char *p, *q;

	/* .... */
    }
    else
	ol = NULL;

I think the problem has to do with metafication of the stuff that was
in chline; specifically, here:

        /* Finally remove quoted newlines and replace non-quoted newlines *
         * with semicolons.  This second thing isn't really correct (e.g. *
         * if the command separated by the newlines were actually         *
         * connected with a pipe), but the effect in the completion code  *
         * is the same.                                                   */
        for (p = (char *)line; *p; p++)
            if (*p == '\n')
                if (p > (char *) line && p[-1] == '\\')
                    p[-1] = *p = ' ';
                else
                    *p = ';';

When that loop starts, line is "echo 'a\nb'" and after the loop, it's
"echo 'a;b'" which I'm pretty certain is wrong.  However, I don't know
what to do about it.

-- 
Bart Schaefer                             Brass Lantern Enterprises
http://www.well.com/user/barts            http://www.nbn.com/people/lantern

New male in /home/schaefer:
>N  2 Justin William Schaefer  Sat May 11 03:43  53/4040  "Happy Birthday"




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