#autoload # This can be used to add options or values with descriptions as matches. local _opt _expl _tmpm _tmpd local _type=values _descr _ret=1 _showd _nm _hide _args _grp _sep local csl="$compstate[list]" csl2 # Get the option. if [[ "$1" = -o ]]; then _type=options shift elif [[ "$1" = -t ]]; then _type="$2" shift 2 elif [[ "$1" = -t* ]]; then _type="${1[3,-1]}" shift fi # Do the tests. `showd' is set if the descriptions should be shown. 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 _argv=( "$@" ) _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##(--|[-+])}" _tags "$_type" while _tags; do while _next_label "$_type" _expl "$_descr"; do if [[ -n "$_showd" ]]; then compdescribe -I "$_hide" "$_sep " _expl "$_grp[@]" "$@" else compdescribe -i "$_hide" "$@" fi compstate[list]="$csl" while compdescribe -g csl2 _args _tmpm _tmpd; do compstate[list]="$csl $csl2" compadd "$_args[@]" -d _tmpd -a _tmpm && _ret=0 done done (( _ret )) || return 0 done return 1