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

While on the subject of expansion ...



I noticed that the built-in expand-word widget also mishandles the case
with a backslashed quote.  There's a bit of a disagreement between
doexpansion() and get_comp_string() over who is responsible for what.
get_comp_string() strips out the backslashes, but it also "leaves ...
quotes unchanged when they are inside parameter expansions" according
to the comment in doexpansion().

2187     /* get_comp_string() leaves these quotes unchanged when they are
2188      * inside parameter expansions. */
2189     for (ts = ss; *ts; ts++)
2190         if (*ts == '"')
2191             *ts = Dnull;
2192         else if (*ts == '\'')
2193             *ts = Snull;

Therefore doexpansion() attempts to fix up the quotes, but gets it
wrong in some of the cases because it doesn't have full context at
each character position.  The "inwhat" and "instring" globals give
some hints but only for the position of the cursor, and there may be
multiple differently-quoted substrings of the current word.

Unlike the _expand completer which tries globbing separately from other
expansions, doexpansion() attempts to set up for everything to expand
at once [via a call to prefork()].  This makes the completion-oriented
[de-]quoting applied by get_comp_string() problematic.  I wonder which
kinds of parameter expansions would break if we skipped that part.

Again I suppose the theory is that quotes are much less likely to
appear in globs than they are in parameter references, so handling the
more common case is the right thing.

Incidental aside:  Both doexpansion() and expandorcomplete() contain
code to fall back on docompletion() if expansion does not change the
word, but I can't figure out how to get that branch in doexpansion()
to ever be taken.  It has something to do with words that start with
a tilde.



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