#compdef abra _abra () { local context state line curcontext="$curcontext" ret=1 _arguments -n : \ {-h,--help}'[Help message]' \ '1:commands:(app server)' \ '*::arguments:->arguments' \ && ret=0 case $state in (arguments) curcontext="${curcontext%:*:*}:abra-arguments-$words[1]:" case $words[1] in (app) _arguments \ '1: :_abra_apps' \ && ret=0 ;; (server) _arguments \ '1:servers:_abra_servers' \ && ret=0 ;; esac ;; esac return ret } _abra_servers() { _path_files -/W $HOME/.abra/servers } _abra_apps() { local newapps apps=($HOME/.abra/servers/*/*.env) typeset -a apps newapps=() for app in $apps; do newapps+=($(_abra_basename "${app}")) done _describe -t apps 'app' newapps } _abra_basename() { printf -- "${1##*/}" } _abra "$@"