#compdef vcsh function __vcsh_repositories () { local -a repos repos=( ${(f)"$(_call_program repositories vcsh list)"} ) _describe -t repositories 'repository' repos } function _vcsh-clone () { _default #TODO } local func for func in help init list list-tracked pull push version; do _vcsh-$func() { _nothing } done for func in delete enter list-tracked-by upgrade write-gitignore; do _vcsh-$func() { (( CURRENT == 2 )) && __vcsh_repositories } done function _vcsh-rename () { case $CURRENT in 2) __vcsh_repositories ;; 3) _message "new repository name" ;; *) _nothing ;; esac } function _vcsh-run () { (( CURRENT == 2 )) && __vcsh_repositories if (( CURRENT >= 3 )); then words=( "${(@)words[3,-1]}" ) (( CURRENT -= 2 )) _complete fi } function _vcsh () { local curcontext="${curcontext}" ret=1 local state vcshcommand local -a args subcommands subcommands=( "clone:clone an existing repository" "delete:delete an existing repository" "enter:enter repository; spawn new <\$SHELL>" "help:display help" "init:initialize an empty repository" "list:list all local vcsh repositories" "list-tracked:list all files tracked by vcsh" "list-tracked-by:list files tracked by a repository" "pull:pull from all vcsh remotes" "rename:rename a repository" "run:run command with <\$GIT_DIR> and <\$GIT_WORK_TREE> set" "upgrade:upgrade repository to currently recommended settings" "version:print version information" "which:find in name of any tracked file" "write-gitignore:write .gitignore.d/ via git ls-files" ) args=( '-c[source prior to other configuration files]:config files:_path_files' '-d[enable debug mode]' '-v[enable verbose mode]' '*:: :->subcommand_or_options_or_repo' ) _arguments -C ${args} && ret=0 if [[ ${state} == "subcommand_or_options_or_repo" ]]; then if (( CURRENT == 1 )); then _describe -t subcommands 'vcsh sub-commands' subcommands && ret=0 __vcsh_repositories && ret=0 else vcshcommand="${words[1]}" if ! (( ${+functions[_vcsh-$vcshcommand]} )); then # There is no handler function, so this is probably the name # of a repository. Act accordingly. _dispatch git git && ret=0 else curcontext="${curcontext%:*:*}:vcsh-${vcshcommand}:" _call_function ret _vcsh-${vcshcommand} fi fi fi return ret } _vcsh "$@"