#compdef sandbox __get_sandboxes() { /bin/ls $SANDBOX_ROOT 2> /dev/null } __sandboxes() { local -a sandboxes sandboxes=(${(fo)"$(__get_sandboxes)"}) _describe 'in' sandboxes } _sandbox_cmds() { local commands; commands=( 'create:Create a new sandbox' 'rename:Rename an existing sandbox' 'destroy:Destroy an existing sandbox' 'list:Show all existing sandboxes' 'enable:Enable an existing sandbox' 'disable:Disable the current sandbox' ) _describe -t commands 'sandbox command' commands "$@" } _sandbox() { local context curcontext="$curcontext" state line typeset -A opt_args _arguments -C \ '1: :_sandbox_cmds' \ '*::arg:->args' case $state in (args) curcontext="${curcontext%:*:*}:sandbox-cmd-$words[1]:" case $line[1] in (create|list|disable) ;; (enable|destroy) _arguments -C '1:: :__sandboxes' ;; (rename) _arguments -C '1:: :__sandboxes' ;; esac esac } _sandbox "$@"