alias pjo="pj open" function pj () { cmd="cd" file=$1 if [[ "open" == "$file" ]] then shift file=$* cmd=(${(s: :)EDITOR}) else file=$* fi for project in $PROJECT_PATHS; do if [[ -d $project/$file ]] then $cmd "$project/$file" unset project # Unset project var return fi done echo "No such project $1" } function _pj () { # might be possible to improve this using glob, without the basename trick typeset -a projects projects=($PROJECT_PATHS/*) projects=$projects:t _arguments "*:file:($projects)" } compdef _pj pj