#compdef keyringer # Completion for git subcommand _keyringer_git_complete() { if [ -e "/etc/bash_completion.d/git" ]; then ( source /etc/bash_completion.d/git cd $path COMP_WORDS=(git $*) COMP_CWORD=$((${#COMP_WORDS[*]} - 1)) if [ "$COMP_CWORD" == "0" ]; then COMP_CWORD=1 fi _git LAST=${COMP_WORDS[COMP_CWORD]} REPLY=${COMPREPLY[@]} if [ "$REPLY" == "$LAST" ]; then return fi echo ${COMPREPLY[@]} ) fi } _keyringer() { local curcontext="$curcontext" state line typeset -A opt_args # Initial options local config="$HOME/.keyringer" local keyrings="`ls $config | sed -e 's/config//'`" _arguments \ '1: :->keyring' \ '2: :->action' \ '3: :->options' \ '4: :->misc' \ '*: :->final' case $state in keyring) _arguments "1:Keyrings:($keyrings)" ;; action) compadd "$@" `keyringer $words[2] commands` ;; options) case $words[3] in options|preferences) compadd "$@" ls edit add ;; recipients) compadd "$@" ls edit ;; ls|encrypt|encrypt-batch|decrypt|edit|append|append-batch|del|recrypt) # TODO: do not rely on bash compadd "$@" $(bash -c "set -f && keyringer $words[2] ls -p -d $words[4]*" 2> /dev/null) ;; genpair) compadd "$@" gpg ssh ssl ssl-self ;; git) compadd "$@" $(_keyringer_git_complete $words[4]) ;; *) ;; esac ;; misc) case "$words[3]" in recipients) compadd "$@" $(cd $path/config/recipients && ls -p $words[5]* 2> /dev/null) ;; genpair) # TODO: do not rely on bash compadd "$@" $(bash -c "set -f && keyringer $instance ls -p -d $words[5]*" 2> /dev/null) ;; git) # TODO compadd "$@" $(_keyringer_git_complete $words[4] $words[5]) ;; *) ;; esac ;; *) if [ $words[3] == "$git" ]; then # TODO true fi ;; esac } _keyringer "$@"