#compdef -tilde- # We use all named directories and user names here. If this is too slow # for you or if there are too many of them, you may want to use # `compadd -qS/ - "$friends[@]"' or something like that. local expl suf dirs list lines revlines i ret disp if [[ "$SUFFIX" = */* ]]; then ISUFFIX="/${SUFFIX#*/}$ISUFFIX" SUFFIX="${SUFFIX%%/*}" suf=(-S '') else suf=(-qS/) fi _tags users named-directories directory-stack while _tags; do _requested users && _users "$suf[@]" "$@" && ret=0 _requested named-directories expl 'named directory' && compadd "$suf[@]" "$expl[@]" "$@" - "${(@k)nameddirs}" if _requested directory-stack -V expl 'directory stack' && { ! _style directory-stack prefix-needed || [[ "$PREFIX" = [-+]* ]] }; then if _style directory-stack verbose; then integer i lines=("${PWD}" "${dirstack[@]}") if [[ ( -prefix - && ! -o pushdminus ) || ( -prefix + && -o pushdminus ) ]]; then revlines=( $lines ) for (( i = 1; i <= $#lines; i++ )); do lines[$i]="$((i-1)) -- ${revlines[-$i]}" done else for (( i = 1; i <= $#lines; i++ )); do lines[$i]="$((i-1)) -- ${lines[$i]}" done fi list=( ${PREFIX[1]}${^lines%% *} ) disp=( -ld lines ) else list=( ${PREFIX[1]}{0..${#dirstack}} ) disp=() fi compadd "$expl[@]" "$suf[@]" "$disp[@]" -Q - "$list[@]" && ret=0 fi (( ret )) || return 0 done