#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 # `compgen -k friends -qS/' or something like that. To get all user names # if there are no matches in the `friends' array, add # `(( compstate[nmatches] )) || compgen -nu -qS/' # below that. local c s dirs list if [[ "$SUFFIX" = */* ]]; then ISUFFIX="/${SUFFIX#*/}$ISUFFIX" SUFFIX="${SUFFIX%%/*}" s=(-S '') else s=(-qS/) fi if compset -P +; then dirs="$(dirs -v)" list=("${(f)dirs}") [[ -o pushdminus ]] && dirs="$(awk '{ $1 = '$#list' - $1 - 1; printf("%s\t%s\n", $1, $2); }' <<<$dirs)" list=("${(@)list% *}") c=(-y '$dirs' -k "($list)") elif compset -P -; then dirs="$(dirs -v)" list=("${(f)dirs}") [[ ! -o pushdminus ]] && dirs="$(awk '{ $1 = '$#list' - $1 - 1; printf("%s\t%s\n", $1, $2); }' <<<$dirs)" list=("${(@)list% *}") c=(-y '$dirs' -k "($list)") else c=(-nu) fi compgen "$c[@]" "$s[@]"