#autoload # This can be used to add options or values with descriptions as matches. local _opt _expl _tmpm _tmpd _mlen _noprefix 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. if [[ "$1" = -o ]]; then _type=options shift elif [[ "$1" = -O ]]; then _type=options _noprefix=1 shift elif [[ "$1" = -t ]]; then _type="$2" shift 2 elif [[ "$1" = -t* ]]; then _type="${1[3,-1]}" shift fi [[ "$_type$_noprefix" = options && ! -prefix [-+]* ]] && \ zstyle -T ":completion:${curcontext}:options" prefix-needed && return 1 # 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=-- zstyle -s ":completion:${curcontext}:$_type" max-matches-width _mlen || _mlen=$((COLUMNS/2)) _descr="$1" shift if [[ -n "$_showd" ]] && zstyle -T ":completion:${curcontext}:$_type" list-grouped; then _oargv=( "$@" ) _grp=(-g) else _grp=() fi [[ "$_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 (( $#_grp )); then set -- "$_oargv[@]" _argv=( "$_oargv[@]" ) _i=1 (( _try++ )) while (( $# )); do _strs="_a_$_try$_i" if [[ "$1" = \(*\) ]]; then eval local "_a_$_try$_i;_a_$_try$_i"'='$1 else eval local "_a_$_try$_i;_a_$_try$_i"'=( "${'$1'[@]}" )' fi _argv[_i]="_a_$_try$_i" shift (( _i++ )) if [[ "$1" = (|-*) ]]; then _mats= else _mats="_a_$_try$_i" if [[ "$1" = \(*\) ]]; then eval local "_a_$_try$_i;_a_$_try$_i"'='$1 else eval local "_a_$_try$_i;_a_$_try$_i"'=( "${'$1'[@]}" )' fi _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:/-J/-2V}" -D $_strs - \ "${(@M)${(@P)_mats}##([^:\\]|\\?)##}" else compadd "$_opts[@]" "${(@)_expl:/-J/-2V}" -D $_strs - \ "${(@M)${(@P)_strs}##([^:\\]|\\?)##}" fi done set - "$_argv[@]" fi if [[ -n "$_showd" ]]; then compdescribe -I "$_hide" "$_mlen" "$_sep " _expl "$_grp[@]" "$@" else compdescribe -i "$_hide" "$_mlen" "$@" fi compstate[list]="$csl" while compdescribe -g csl2 _args _tmpm _tmpd; do compstate[list]="$csl $csl2" [[ -n "$csl2" ]] && compstate[list]="${compstate[list]:s/rows//}" compadd "$_args[@]" -d _tmpd -a _tmpm && _ret=0 done done (( _ret )) || return 0 done return 1