#compdef ct ## vim:ft=zsh ## caretaker completion typeset expl function _ct_action () { _wanted action expl 'action' \ compadd add debug eval remove info list \ log new pull push refresh status update } function _ct_installed () { _wanted package expl 'local package' \ compadd $(ct list local) } function _ct_all () { _wanted package expl 'package' \ compadd $(ct list all) } function _ct_notinstalled () { _wanted package expl 'remote package' \ compadd $(ct list not-installed) } function _ct_args { if (( CURRENT == 2 )) { case ${words[1]} in l|log|f|pull|p|push|r|refresh|rm|remove|s|status) _ct_installed ;; i|info) _ct_all ;; a|add) _ct_notinstalled ;; e|eval) _message 'shell code for evaluation' _wanted function expl 'internal function' \ compadd $(grep -E '^\S*\s*\(\)\s*{' =ct | cut -d ' ' -f 1) \ $(grep -E 'function \S* (\(\) )?{' =ct | cut -d ' ' -f 2) ;; ls|list) _wanted something expl 'list mode' \ compadd all local not-installed ;; u|update) _wanted mode expl 'update target' \ compadd local remote ;; n|new) _message 'New or existing package name' _ct_installed ;; *) _message 'no more arguments' ;; esac } elif [[ ${words[1]} == e(val|) ]] { _message 'shell code for evaluation' if (( CURRENT == 3 )) { case ${words[2]} in exec_hook|check_prereqs|*_collected|) _ct_installed ;; esac } elif (( CURRENT == 4 )) { case ${words[2]} in exec_hook) _wanted hook expl 'package hook' \ compadd $(ls -1 ~/packages/${words[3]}/hooks 2> /dev/null) ;; esac } } elif [[ ${words[1]} == (a|add) ]] { _ct_notinstalled } elif [[ ${words[1]} == (rm|remove) ]] { _ct_installed } elif [[ ${words[1]} == (n|new) ]] { _files -W ${HOME} } } _arguments \ '--quiet[quiet mode]' \ '--auto-update[automatically update package list]' \ '*--checklinks-options[options for checklinks]:option' \ '--packagedir[package directory]:directory:_files -/' \ '--packageroot[package root]:url' \ '--colours[use colours]' \ '--no-colours[No colours]' \ '--hook-on-push[Execute hooks for ct push]' \ '--no-hook-on-push[Do not execute hooks for ct push]' \ '--progress[show progress bar]' \ '--no-progress[No progress bar]' \ ':action:_ct_action' \ '*::arguments:_ct_args'