aboutsummaryrefslogtreecommitdiff
path: root/lib/keyringer/completions/zsh/_keyringer
blob: 3aba2b3da15556d167b8d9423982929f947a00ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#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 "$@"