blob: a6405839d4edcb889c578a9eeb7f8772b1b19cc7 (
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
#!bash
#
# Keyringer bash completion
#
if [[ -n ${ZSH_VERSION-} ]]; then
autoload -U +X bashcompinit && bashcompinit
fi
# Completion for git subcommand
_keyringer_git_complete() {
local git_completion=""
if [ -e "/etc/bash_completion.d/git" ]; then
git_completion="/etc/bash_completion.d/git"
elif [ -e "/usr/share/bash-completion/completions/git" ]; then
git_completion="/usr/share/bash-completion/completions/git"
fi
if [ ! -z "$git_completion" ]; then
(
source $git_completion
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
}
# Path completion
function _keyringer_path_complete() {
# Thanks http://unix.stackexchange.com/questions/55520/create-bash-completion-script-to-autocomplete-paths-after-is-equal-sign
cur=${1//\\ / }
[[ ${cur} == "~"* ]] && cur=${cur/\~/$HOME}
echo ${cur}
}
# Main completion
_keyringer() {
# Standard stuff
local cur prev command config path keyrings instances instance opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
command="${COMP_WORDS[2]}"
# Initial options
config="$HOME/.keyringer"
# Check if we have initial configuration
if [ ! -d "$config" ]; then
return
fi
# Process config
source $config/config
keyrings="`ls --color=never $config | sed -e '/^config$/d' | xargs`"
# Available instances
instances="`echo $keyrings | sed -e 's/ /$\\\|^/g' -e 's/^/^/' -e 's/$/$/'`"
# The current instance
instance="${COMP_WORDS[1]}"
path="`eval echo '$'$instance`"
# Command completions
if [ "${#COMP_WORDS[@]}" == "2" ]; then
opts="$keyrings"
elif [ "${#COMP_WORDS[@]}" == "3" ] && echo "${prev}" | grep -qe "$instances"; then
opts="`export KEYRINGER_CHECK_VERSION=false && keyringer $instance commands`"
elif [ "${#COMP_WORDS[@]}" == "3" ]; then
opts="init"
elif [ "${#COMP_WORDS[@]}" == "4" ]; then
case "${prev}" in
options|preferences)
opts="ls edit add"
;;
recipients)
opts="ls edit"
;;
ls|tree|mkdir|encrypt|encrypt-batch|decrypt|edit|append|append-batch|del|rm|recrypt|open|clip|xclip)
cur="`echo ${cur} | sed -e "s|^/*||"`" # avoid leading slash
opts="$(bash -c "set -f && export KEYRINGER_CHECK_VERSION=false && keyringer $instance ls -p -d ${cur}*" 2> /dev/null)"
;;
genpair)
opts="gpg ssh ssl ssl-self"
;;
git)
opts="$(_keyringer_git_complete ${cur})"
;;
init)
cur="$(_keyringer_path_complete ${cur})"
opts="`compgen -o default "${cur}"`"
;;
*)
;;
esac
elif [ "${#COMP_WORDS[@]}" == "5" ]; then
case "${command}" in
recipients)
cur="`echo ${cur} | sed -e "s|^/*||"`" # avoid leading slash
opts="$(cd $path/config/recipients && ls --color=never -p ${cur}* 2> /dev/null)"
;;
genpair)
cur="`echo ${cur} | sed -e "s|^/*||"`" # avoid leading slash
opts="$(bash -c "set -f && export KEYRINGER_CHECK_VERSION=false && keyringer $instance ls -p -d ${cur}*" 2> /dev/null)"
;;
git)
# TODO
opts="$(_keyringer_git_complete ${prev} ${cur})"
;;
encrypt|encrypt-batch)
cur="$(_keyringer_path_complete ${cur})"
opts="`compgen -o default "${cur}"`"
;;
*)
;;
esac
elif [ "${command}" == "git" ]; then
# TODO
opts="$(_keyringer_git_complete ${COMP_WORDS[@]:3})"
fi
# Avoid annoying bell and extra tab
if [ -z "$ZSH_VERSION" ]; then
bind 'set show-all-if-ambiguous on'
fi
# Return the available options
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
if [ -z "$ZSH_VERSION" ]; then
[[ $COMPREPLY == */ ]] && compopt -o nospace
fi
return 0
}
complete -F _keyringer keyringer
|