-
Notifications
You must be signed in to change notification settings - Fork 27
/
zsh-completion
130 lines (118 loc) · 4.58 KB
/
zsh-completion
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
#compdef ponymix
local -a _commands _movesink
local state line curcontext="$curcontext"
typeset -U _commands
_common_command(){
_commands+=(
'list:list available devices'
'list-short:list available devices, short form'
'list-cards:list available cards'
'list-cards-short:list available cards, short form'
'get-volume:get volume for device'
'set-volume:set volume for device:integer'
'get-balance:get balance for device'
'set-balance:set balance for device:integer'
'adj-balance:increase or decrease balance for device:integer'
'increase:increase volume:integer'
'decrease:decrease volume:integer'
'mute:mute device'
'kill:kill device'
'unmute:unmute device'
'toggle:toggle mute'
'is-muted:check if muted'
)
cmd="${${_commands[(r)$words[$((CURRENT - 1))]:*]%%:*}}"
if (( ! $#cmd )); then
_describe commands _commands;
else
if (( $#cmd )) && [[ "$cmd" == set-* || "$cmd" == adj-* ]]; then
_message "number for $cmd"
else
_message "no more options"
fi
fi
}
_devices(){
local -a _sourcelist _sinklist _inputlist
for f in ${(f)"$(_call_program sink_tag "$service --sink list-short")"}; do
_sinklist+=(${${(ps:\t:)f}[3]}:${(q)${(ps:\t:)f}[4]})
done
for f in ${(f)"$(_call_program source_tag "$service --source list-short")"}; do
_sourcelist+=(${${(ps:\t:)f}[3]}:${(q)${(ps:\t:)f}[4]})
done
for f in ${(f)"$(_call_program sink_input_tag "$service --sink-input list-short")"}; do
_inputlist+=(${${(ps:\t:)f}[2]}:${(q)${(ps:\t:)f}[4]})
done
if [[ $words[(r)*sink-input*] == *sink-input ]]; then
_describe "sink inputs" _inputlist
elif [[ $words[(r)*(sink|output)*] == *(sink|output) ]]; then
_describe "sink" _sinklist
elif [[ $words[(r)*(source|input)*] == *(source|input) ]]; then
_describe "source" _sourcelist
else
_alternative \
"source_tag:source list:((${(q)_sourcelist[@]}))" \
"sink_tag:sink:((${(q)_sinklist[@]}))" \
"sink_input_tag:sink_input:((${(q)_inputlist[@]}))"
fi
}
_set_profiles(){
local -a _profileslist
local _card
_card=$words[$(($words[(i)-(c|-card)] + 1))]
_profileslist=(${${(f)"$(_call_program profiles_tag "$service --card $_card list-profiles-short")"}//:/\:})
compadd "$@" - "$_profileslist[@]"
}
_cards(){
local -a _cardlist
_cardlist=(${(f)"$(_call_program card_tag "$service list-cards-short")"})
_describe 'card list' _cardlist
}
_card_commands=(
'list-profiles:list available profiles for a card'
'list-profiles-short:list available profiles for a card, short form'
'get-profile:get active profile for card'
'set-profile:set profile for a card:_set_profiles'
)
if [[ -n $words[(r)*(sink-input|source-output)] ]]; then
_commands+=(
'move:Move device'
)
fi
[[ $words[(r)-(d|-device)] == -(d|-device) ]] && _commands+=(
'defaults:list default devices (default command)'
'set-default:set default devices')
[[ $words[(r)-(c|-card)] == -(c|-card) ]] && _commands+=( "$_card_commands[@]" )
if [[ $words[$((CURRENT - 1))] == move ]]; then
for f in ${(f)"$(_call_program sink_tag "$service --sink list-short")"}; do
_movesink+=(${${(ps:\t:)f}[3]}:${(q)${(ps:\t:)f}[4]})
done
_describe "sink" _movesink
elif [[ $words[$((CURRENT - 1))] == set-profile ]]; then
_set_profiles
else
_arguments -C \
'::common commands:_common_command' \
'(-c --card -d --device)'{-d,--device}'[Select Device]:devices:_devices' \
- '(help)' \
{-h,--help}'[display this help and exit]' \
- '(version)' \
{-V,--version}'[display program version and exit]' \
- '(sink)' \
'--sink[alias to type sink]' \
'--output[alias to type sink]' \
{-t,--devtype}'[Device Type]: :(sink output)' \
- '(source)' \
'--source[alias to type source]' \
'--input[alias to type source]' \
{-t,--devtype}'[Device Type]: :(source input)' \
- '(sink-input)' \
'--sink-input[alias to type sink-input]' \
{-t,--devtype}'[Device Type]: :(sink-input)' \
- '(source-output)' \
{-t,--devtype}'[Device Type]:device types:(source-output)' \
'--source-output[alias to type source-output]' \
- '(card)' \
'(-d --device)'{-c,--card}'[target card]:Cards:_cards:Card Commands:((${(q)_card_commands}))'
fi
#vim: set ft=zsh sw=4 ts=4 noet