From 004f0b0f950d0c8e43e2a4d59638fa152138dc71 Mon Sep 17 00:00:00 2001 From: Silvio Rhatto Date: Fri, 16 Aug 2013 22:57:43 -0300 Subject: Matching zsh with bash completion --- lib/keyringer/completions/zsh/_keyringer | 82 +++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 6 deletions(-) diff --git a/lib/keyringer/completions/zsh/_keyringer b/lib/keyringer/completions/zsh/_keyringer index 1f1c250..3aba2b3 100644 --- a/lib/keyringer/completions/zsh/_keyringer +++ b/lib/keyringer/completions/zsh/_keyringer @@ -1,5 +1,32 @@ #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 @@ -8,10 +35,12 @@ _keyringer() { local config="$HOME/.keyringer" local keyrings="`ls $config | sed -e 's/config//'`" - _arguments \ - '1: :->keyring'\ - '2: :->action'\ - '*: :->options' + _arguments \ + '1: :->keyring' \ + '2: :->action' \ + '3: :->options' \ + '4: :->misc' \ + '*: :->final' case $state in keyring) @@ -20,9 +49,50 @@ _keyringer() { 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 + ;; *) - # TODO - true + if [ $words[3] == "$git" ]; then + # TODO + true + fi ;; esac } -- cgit v1.2.3