diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | Completion/Base/Utility/_describe | 90 | ||||
-rw-r--r-- | Src/Zle/complete.c | 5 |
3 files changed, 54 insertions, 45 deletions
diff --git a/ChangeLog b/ChangeLog index 44f16c151..6e6bd380a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2001-07-25 Sven Wischnowsky <wischnow@zsh.org> + * 15487: Completion/Base/Utility/_describe, Src/Zle/complete.c: + move pattern matching in the loop to make sure all match specs + are used + * 15485: Completion/Unix/Command/_lzop, Completion/Zsh/Type/_directory_stack, Completion/Zsh/Type/_file_descriptors, Completion/Zsh/Type/_jobs: diff --git a/Completion/Base/Utility/_describe b/Completion/Base/Utility/_describe index bed75a318..f97834586 100644 --- a/Completion/Base/Utility/_describe +++ b/Completion/Base/Utility/_describe @@ -5,6 +5,7 @@ local _opt _expl _tmpm _tmpd local _type=values _descr _ret=1 _showd _nm _hide _args _grp _sep local csl="$compstate[list]" csl2 +local _oargv _argv _new _strs _mats _opts _i _try=0 # Get the option. @@ -25,55 +26,17 @@ zstyle -T ":completion:${curcontext}:$_type" verbose && _showd=yes zstyle -s ":completion:${curcontext}:$_type" list-separator _sep || _sep=-- -if zstyle -T ":completion:${curcontext}:$_type" list-grouped; then - local _argv _new _strs _mats _opts _i=2 +_descr="$1" +shift - _argv=( "$@" ) +if [[ -n "$showd" ]] && + zstyle -T ":completion:${curcontext}:$_type" list-grouped; then + _oargv=( "$@" ) _grp=(-g) - _new=( "$1" ) - shift - - while (( $# )); do - - _strs="_a_$_i" - eval local "_a_$_i;_a_$_i"'=( "${'$1'[@]}" )' - _argv[_i]="_a_$_i" - shift - (( _i++ )) - - if [[ "$1" = (|-*) ]]; then - _mats= - else - _matss="_a_$_i" - eval local "_a_$_i;_a_$_i"'=( "${'$1'[@]}" )' - _argv[_i]="_a_$_i" - shift - (( _i++ )) - fi - - _opts=( "${(@)argv[1,(i)--]:#--}" ) - shift "$#_opts" - (( _i += $#_opts )) - if [[ $1 == -- ]]; then - shift - (( _i++ )) - fi - - if [[ -n $_mats ]]; then - compadd "$_opts[@]" -O $_strs -D $_mats -a $_strs - else - compadd "$_opts[@]" -O $_strs -a $_strs - fi - done - - set - "$_argv[@]" else _grp=() fi -_descr="$1" -shift - [[ "$_type" = options ]] && zstyle -t ":completion:${curcontext}:options" prefix-hidden && _hide="${(M)PREFIX##(--|[-+])}" @@ -82,6 +45,47 @@ _tags "$_type" while _tags; do while _next_label "$_type" _expl "$_descr"; do + if (( $#_grp )); then + + set -- "$_oargv[@]" + _argv=( "$_oargv[@]" ) + _i=1 + (( _try++ )) + while (( $# )); do + + _strs="_a_$_try$_i" + eval local "_a_$_try$_i;_a_$_try$_i"'=( "${'$1'[@]}" )' + _argv[_i]="_a_$_try$_i" + shift + (( _i++ )) + + if [[ "$1" = (|-*) ]]; then + _mats= + else + _matss="_a_$_try$_i" + eval local "_a_$_try$_i;_a_$_try$_i"'=( "${'$1'[@]}" )' + _argv[_i]="_a_$_try$_i" + shift + (( _i++ )) + fi + + _opts=( "${(@)argv[1,(i)--]:#--}" ) + shift "$#_opts" + (( _i += $#_opts )) + if [[ $1 == -- ]]; then + shift + (( _i++ )) + fi + + if [[ -n $_mats ]]; then + compadd "$_opts[@]" "$_expl[@]" -O $_strs -D $_mats -s $_strs + else + compadd "$_opts[@]" "$_expl[@]" -O $_strs -a $_strs + fi + done + set - "$_argv[@]" + fi + if [[ -n "$_showd" ]]; then compdescribe -I "$_hide" "$_sep " _expl "$_grp[@]" "$@" else diff --git a/Src/Zle/complete.c b/Src/Zle/complete.c index 106e0ddab..f9a160bb7 100644 --- a/Src/Zle/complete.c +++ b/Src/Zle/complete.c @@ -616,14 +616,15 @@ bin_compadd(char *name, char **argv, char *ops, int func) } } } + + ca_args: + if (mstr && (match = parse_cmatcher(name, mstr)) == pcm_err) { zsfree(mstr); return 1; } zsfree(mstr); - ca_args: - if (!*argv && !dat.group && !dat.mesg && !(dat.aflags & (CAF_NOSORT|CAF_UNIQALL|CAF_UNIQCON|CAF_ALL))) return 1; |