#autoload # Usage: # _complete_opts H '' f '_files' emulate -L zsh setopt extendedglob local done=yes typeset -A option_pairs option_pairs=("$@") typeset -a no_arg with_arg opt_arg no_arg=($option_pairs[(I)?]) opt_arg=($option_pairs[(I)?::]:s/:://) with_arg=($option_pairs[(I)?:]:s/:// $opt_arg) case "${#no_arg}-${#with_arg}" in 0-0) if [[ x$PREFIX = x-* ]]; then compadd -nQ - "$PREFIX$SUFFIX" else done='' fi ;; 0-*) if [[ x$PREFIX = x- ]]; then IPREFIX="$IPREFIX$PREFIX" PREFIX= compadd $with_arg elif [[ x$PREFIX = x-[${(j::)with_arg}] ]]; then IPREFIX="$IPREFIX$PREFIX" PREFIX= eval $option_pairs[$IPREFIX[-1]:] elif [[ x$PREFIX = x-[${(j::)with_arg}]* ]]; then local p="$PREFIX[1,(r)[${(j::)with_arg}]]" IPREFIX="$IPREFIX$p" PREFIX="$PREFIX[$#p + 1,-1]" eval $option_pairs[$IPREFIX[-1]:] elif [[ x$words[$CURRENT-1] = x-[${(j::)with_arg}] ]]; then local p="$words[$CURRENT - 1]" eval $option_pairs[$p[-1]:] else done='' fi ;; *-0) if [[ x$PREFIX = x-[${(j::)no_arg}]# ]]; then IPREFIX="$IPREFIX$PREFIX" PREFIX= compadd $no_arg else done='' fi ;; *-*) if [[ x$PREFIX = x-[${(j::)no_arg}]# ]]; then IPREFIX="$IPREFIX$PREFIX" PREFIX= compadd $no_arg compadd $with_arg elif [[ x$PREFIX = x-[${(j::)no_arg}]#[${(j::)with_arg}] ]]; then IPREFIX="$IPREFIX$PREFIX" PREFIX= eval $option_pairs[$IPREFIX[-1]:] elif [[ x$PREFIX = x-[${(j::)no_arg}]#[${(j::)with_arg}]* ]]; then local p="$PREFIX[1,(r)[${(j::)with_arg}]]" IPREFIX="$IPREFIX$p" PREFIX="$PREFIX[$#p + 1,-1]" eval $option_pairs[$IPREFIX[-1]:] elif [[ x$words[$CURRENT-1] = x-[${(j::)no_arg}]#[${(j::)with_arg}] ]]; then local p="$words[$CURRENT - 1]" eval $option_pairs[$p[-1]:] else done='' fi ;; esac if [[ -z "$done" ]]; then if (( $+complete_opts_verbose )); then compadd - -${(k)^option_pairs:gs/://} fi false else true fi