diff options
Diffstat (limited to 'Completion')
-rw-r--r-- | Completion/Base/Utility/_describe | 90 |
1 files changed, 47 insertions, 43 deletions
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 |