Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Time for an obscure completion question
- X-seq: zsh-workers 10641
- From: Sven Wischnowsky <wischnow@xxxxxxxxxxxxxxxxxxxxxxx>
- To: zsh-workers@xxxxxxxxxxxxxx
- Subject: Re: Time for an obscure completion question
- Date: Tue, 11 Apr 2000 11:36:59 +0200 (MET DST)
- In-reply-to: "Bart Schaefer"'s message of Tue, 11 Apr 2000 00:49:41 +0000
- Mailing-list: contact zsh-workers-help@xxxxxxxxxxxxxx; run by ezmlm
Bart Schaefer wrote:
> Given the completion styles (straight out of compinstall except for moving
> the _ignored completer):
>
> zstyle ':completion:*' completer _oldlist _expand _complete _match _ignored _approximate _prefix
> zstyle ':completion:*' match-original both
> zstyle ':completion:*' matcher-list '' 'r:|[._-,]=* r:|=*' 'm:{a-zA-Z}={A-Za-z} r:|[._-,]=* r:|=*' 'r:|[._-,]=* r:|=* l:|=*'
> zstyle ':completion:*' max-errors 2 numeric
> zstyle ':completion:*' original true
>
> If I have a directory named "foodatthe/Bar" (to borrow from PWS) and I type:
>
> zsh% cd *at/ba<TAB>
>
> I'm offered the two completions
>
> foodatthe/ *at/ba
>
> This is apparently what I asked for, but it's not what I want. I want the
> "original" as considered by _approximate to be the output (for lack of a
> better word) of _expand _complete _match. That is, if there's exactly one
> possible expansion of the part with the pattern, then I want that accepted
> so that the menu becomes:
>
> foodatthe/Bar foodatthe/ba
[ Aside: whenever I see such requests I wonder what comes next... ;-]
The `foodatthe/' comes from _approximate. Bummer. _match kept itself
from being called more than once (for different matchers), even though
I changed the completion code to at least partly handle the mixture of
pattern-matching and match-specs some time ago. The patch comments out
the match-spec-number test in _match. With that you get `foodatthe/ba'
on the line. The reason that it doesn't complete the `ba' to `Bar' is
that _path_files stops when the first component with a pattern is
reached and that adding the whole string, with one part needing
pattern matching and the other part needing the match spec can't
behandled by the completion code. But the next TAB gives you
`foodatthe/Bar/'.
Hm.
> Ignoring that for the moment ... if I type
>
> zsh% cd *at/ba<C-x h>
>
> i.e., invoke completion help, I see a set of contexts and then the possible
> completions at the end. So far so good,
No, the completions (corrections) shouldn't be shown. I'm a bit
confused why I didn't see that before. The patch makes _approximate
don't redefine compadd() if it is already a function. This is ok for
_complete_help, if we ever come up with another function that defines
a compadd() function, we'll have to rethink this.
> but now if I hit TAB the argument
> gets erased and I'm left with
>
> zsh% cd
> ^ cursor here
>
> A similar thing happens here:
>
> zsh% cd *at/ba<TAB><C-e><TAB><TAB><TAB>
> zsh% cd
> ^cursor
>
> The first TAB gives "foodatthe/ba" and lists two completions; I hit C-e to
> break out of menu completion (is there a better way?) and TAB again which
> gives me the correction "foodatthe/Bar/" and again lists two completions.
> Hit TAB again and there's a feep; hit TAB a third time and the argument
> vanishes, replaced by a space. I would have expected it to just keep on
> feeping at me for as long as I bang on tab.
Both should be fixed now. The first one was caused by _oldlist which
took the list from _complete_help. For now I made _oldlist test if the
last widget was _complete_help and ignore the list in that case. It
was already testing widget names, but for a somewhat cleaner solution
we probably should use a new element in $_lastcomp that is set if the
list is generated by some `special' function and should not be used by
any other completion function.
The second one I couldn't reproduce after having fixed the other
things...
Bye
Sven
Index: Completion/Core/_approximate
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Core/_approximate,v
retrieving revision 1.2
diff -u -r1.2 _approximate
--- Completion/Core/_approximate 2000/04/01 20:43:43 1.2
+++ Completion/Core/_approximate 2000/04/11 09:35:42
@@ -10,7 +10,7 @@
[[ _matcher_num -gt 1 || "${#:-$PREFIX$SUFFIX}" -le 1 ]] && return 1
-local _comp_correct _correct_expl comax cfgacc
+local _comp_correct _correct_expl comax cfgacc redef
local oldcontext="${curcontext}" opm="$compstate[pattern_match]"
zstyle -s ":completion:${curcontext}:" max-errors cfgacc || cfgacc='2 numeric'
@@ -40,17 +40,20 @@
# to stick the `(#a...)' in the right place (after an
# ignored prefix).
-compadd() {
- [[ ${argv[(I)-[a-zA-Z]#U[a-zA-Z]#]} -eq 0 &&
- "${#:-$PREFIX$SUFFIX}" -le _comp_correct ]] && return
-
- if [[ "$PREFIX" = \~*/* ]]; then
- PREFIX="${PREFIX%%/*}/(#a${_comp_correct})${PREFIX#*/}"
- else
- PREFIX="(#a${_comp_correct})$PREFIX"
- fi
- builtin compadd "$_correct_expl[@]" "$@"
-}
+if (( ! $+functions[compadd] )); then
+ redef=yes
+ compadd() {
+ [[ ${argv[(I)-[a-zA-Z]#U[a-zA-Z]#]} -eq 0 &&
+ "${#:-$PREFIX$SUFFIX}" -le _comp_correct ]] && return
+
+ if [[ "$PREFIX" = \~*/* ]]; then
+ PREFIX="${PREFIX%%/*}/(#a${_comp_correct})${PREFIX#*/}"
+ else
+ PREFIX="(#a${_comp_correct})$PREFIX"
+ fi
+ builtin compadd "$_correct_expl[@]" "$@"
+ }
+fi
_comp_correct=1
@@ -81,7 +84,7 @@
[[ "$compstate[list]" != list* ]] &&
compstate[list]="$compstate[list] force"
fi
- unfunction compadd
+ [[ -n "$redef" ]] && unfunction compadd
compstate[pattern_match]="$opm"
return 0
@@ -91,7 +94,7 @@
(( _comp_correct++ ))
done
-unfunction compadd
+[[ -n "$redef" ]] && unfunction compadd
compstate[pattern_match]="$opm"
return 1
Index: Completion/Core/_match
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Core/_match,v
retrieving revision 1.2
diff -u -r1.2 _match
--- Completion/Core/_match 2000/04/01 20:43:43 1.2
+++ Completion/Core/_match 2000/04/11 09:35:42
@@ -9,7 +9,7 @@
# expand-or-complete function because otherwise the pattern will
# be expanded using globbing.
-[[ _matcher_num -gt 1 ]] && return 1
+### Shouldn't be needed any more: [[ _matcher_num -gt 1 ]] && return 1
local tmp opm="$compstate[pattern_match]" ret=0 orig ins
Index: Completion/Core/_oldlist
===================================================================
RCS file: /cvsroot/zsh/zsh/Completion/Core/_oldlist,v
retrieving revision 1.2
diff -u -r1.2 _oldlist
--- Completion/Core/_oldlist 2000/04/01 20:43:43 1.2
+++ Completion/Core/_oldlist 2000/04/11 09:35:42
@@ -13,7 +13,8 @@
# Do this also if there is an old list and it was generated by the
# completer named by the oldlist_list key.
-if [[ -n $compstate[old_list] && $list != never ]]; then
+if [[ -n $compstate[old_list] && $list != never &&
+ $LASTWIDGET != _complete_help ]]; then
if [[ $WIDGET = *list* && ( $list = always || $list != shown ) ]]; then
compstate[old_list]=keep
return 0
@@ -33,8 +34,10 @@
# and the style :oldlist:old-menu is `true', then we cycle through the
# existing list (even if it was generated by another widget).
-if [[ -z $compstate[old_insert] && -n $compstate[old_list] ]]; then
+if [[ -z $compstate[old_insert] && -n $compstate[old_list] &&
+ $LASTWIDGET != _complete_help ]]; then
compstate[old_list]=keep
+ return 0
elif [[ $WIDGET = *complete(|-prefix|-word) ]] &&
zstyle -t ":completion:${curcontext}:" old-menu; then
if [[ -n $compstate[old_insert] ]]; then
--
Sven Wischnowsky wischnow@xxxxxxxxxxxxxxxxxxxxxxx
Messages sorted by:
Reverse Date,
Date,
Thread,
Author