]> code.delx.au - pulseaudio/blob - shell-completion/pulseaudio-bash-completion.sh
build: Add bash completion
[pulseaudio] / shell-completion / pulseaudio-bash-completion.sh
1 #!/bin/bash
2
3 __cards () {
4 while IFS=$'\t' read idx name _; do
5 printf "%s %s\n" "$idx" "$name"
6 done < <(pactl list cards short 2> /dev/null)
7 }
8
9 __sinks () {
10 while IFS=$'\t' read _ name _ _ _; do
11 printf "%s\n" "$name"
12 done < <(pactl list sinks short 2> /dev/null)
13 }
14
15 __sinks_idx () {
16 while IFS=$'\t' read idx _ _ _ _; do
17 printf "%s\n" "$idx"
18 done < <(pactl list sinks short 2> /dev/null)
19 }
20
21 __sources () {
22 while IFS=$'\t' read _ name _ _ _; do
23 printf "%s\n" "$name"
24 done < <(pactl list sources short 2> /dev/null)
25 }
26
27 __sink_inputs () {
28 while IFS=$'\t' read idx _ _ _ _; do
29 printf "%s\n" "$idx"
30 done < <(pactl list sink-inputs short 2> /dev/null)
31 }
32
33 __source_outputs () {
34 while IFS=$'\t' read idx _ _ _ _; do
35 printf "%s\n" "$idx"
36 done < <(pactl list source-outputs short 2> /dev/null)
37 }
38
39 __ports () {
40 pactl list cards 2> /dev/null | awk -e \
41 '/^\tPorts:/ {
42 flag=1; next
43 }
44
45 /^\t[A-Za-z]/ {
46 flag=0
47 }
48
49 flag {
50 if (/^\t\t[A-Za-z]/)
51 ports = ports substr($0, 3, index($0, ":")-3) " "
52 }
53
54 END {
55 print ports
56 }'
57 }
58
59 __profiles () {
60 pactl list cards 2> /dev/null | awk -e \
61 '/^\tProfiles:/ {
62 flag=1; next
63 }
64
65 /^\t[A-Za-z]/ {
66 flag=0
67 }
68
69 flag {
70 if (/^\t\t[A-Za-z]/)
71 profiles = profiles substr($0, 3, index($0, ": ")-3) " "
72 }
73
74 END {
75 print profiles
76 }'
77 }
78
79 __all_modules () {
80 while read name; do
81 name=${name%% *}
82 printf "%s\n" "$name"
83 done < <(pulseaudio --dump-modules 2> /dev/null)
84 }
85
86 __loaded_modules () {
87 while IFS=$'\t' read idx name _; do
88 printf "%s %s\n" "$idx" "$name"
89 done < <(pactl list modules short 2> /dev/null)
90 }
91
92 __resample_methods () {
93 while read name; do
94 printf "%s\n" "$name"
95 done < <(pulseaudio --dump-resample-methods 2> /dev/null)
96 }
97
98 _pacat_file_formats () {
99 while IFS=$'\t' read name _; do
100 printf "%s\n" "$name"
101 done < <(pacat --list-file-formats 2> /dev/null)
102 }
103
104 in_array() {
105 local i
106 for i in "${@:2}"; do
107 [[ $1 = "$i" ]] && return
108 done
109 }
110
111 _pactl() {
112 local cur prev words cword preprev command
113 local comps
114 local flags='-h --help --version -s --server= --client-name='
115 local list_types='short sinks sources sink-inputs source outputs cards
116 modules samples clients'
117 local commands=(stat info list exit upload-sample play-sample remove-sample
118 load-module unload-module move-sink-input move-source-output
119 suspend-sink suspend-source set-card-profile set-sink-port
120 set-source-port set-sink-volume set-source-volume
121 set-sink-input-volume set-source-output-volume set-sink-mute
122 set-source-mute set-sink-input-mute set-source-output-mute
123 set-sink-formats set-port-latency-offset subscribe help)
124
125 _init_completion -n = || return
126 preprev=${words[$cword-2]}
127
128 for word in "${COMP_WORDS[@]}"; do
129 if in_array "$word" "${commands[@]}"; then
130 command=$word
131 break
132 fi
133 done
134
135 case $preprev in
136 list) COMPREPLY=($(compgen -W 'short' -- "$cur")) ;;
137
138 play-sample)
139 comps=$(__sinks)
140 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
141 ;;
142
143 move-sink-input)
144 comps=$(__sinks)
145 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
146 ;;
147
148 move-source-output)
149 comps=$(__sources)
150 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
151 ;;
152
153 set-card-profile)
154 comps=$(__profiles)
155 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
156 ;;
157
158 set-*-port)
159 comps=$(__ports)
160 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
161 ;;
162
163 set-*-mute) COMPREPLY=($(compgen -W 'true false toggle' -- "$cur")) ;;
164
165 set-sink-formats)
166 ;; #TODO
167
168 set-port-*)
169 comps=$(__ports)
170 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
171 ;;
172 --server)
173 compopt +o nospace
174 _known_hosts_real "$cur"
175 ;;
176 esac
177
178 case $prev in
179 list) COMPREPLY=($(compgen -W '${list_types[*]}' -- "$cur")) ;;
180
181 stat) COMPREPLY=($(compgen -W 'short' -- "$cur")) ;;
182
183 upload-sample) _filedir ;;
184
185 play-sample) ;; # TODO
186
187 remove-sample) ;; # TODO
188
189 load-module)
190 comps=$(__all_modules)
191 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
192 ;;
193
194 unload-module)
195 comps=$(__loaded_modules)
196 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
197 ;;
198
199 set-card*)
200 comps=$(__cards)
201 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
202 ;;
203
204 *sink-input*)
205 comps=$(__sink_inputs)
206 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
207 ;;
208
209 *source-output*)
210 comps=$(__source_outputs)
211 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
212 ;;
213
214 set-sink-formats)
215 comps=$(__sinks_idx)
216 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
217 ;;
218
219 *sink*)
220 comps=$(__sinks)
221 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
222 ;;
223
224 *source*)
225 comps=$(__sources)
226 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
227 ;;
228
229 set-port*)
230 comps=$(__cards)
231 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
232 ;;
233
234 -s)
235 _known_hosts_real "$cur" ;;
236 esac
237
238 case $cur in
239 --server=*)
240 cur=${cur#*=}
241 _known_hosts_real "$cur"
242 ;;
243
244 -*)
245 COMPREPLY=($(compgen -W '${flags[*]}' -- "$cur"))
246 [[ $COMPREPLY == *= ]] && compopt -o nospace
247 ;;
248
249 *)
250 [[ -z $command ]] && COMPREPLY=($(compgen -W '${commands[*]}' -- "$cur"))
251 ;;
252 esac
253 }
254 complete -F _pactl pactl
255
256 _pacmd() {
257 local cur prev words cword preprev command
258 local comps
259 local flags='-h --help --version'
260 local commands=(exit help list-modules list-sinks list-sources list-clients
261 list-samples list-sink-inputs list-source-outputs stat info
262 load-module unload-module describe-module set-sink-volume
263 set-source-volume set-sink-input-volume set-source-output-volume
264 set-sink-mute set-source-mut set-sink-input-mute
265 set-source-output-mute update-sink-proplist update-source-proplist
266 update-sink-input-proplist update-source-output-proplist
267 set-default-sink set-default-source kill-client kill-sink-input
268 kill-source-output play-sample remove-sample load-sample
269 load-sample-lazy load-sample-dir-lazy play-file dump
270 move-sink-input move-source-output suspend-sink suspend-source
271 suspend set-card-profile set-sink-port set-source-port
272 set-port-latency-offset set-log-target set-log-level set-log-meta
273 set-log-time set-log-backtrace)
274 _init_completion -n = || return
275 preprev=${words[$cword-2]}
276
277 for word in "${COMP_WORDS[@]}"; do
278 if in_array "$word" "${commands[@]}"; then
279 command=$word
280 break
281 fi
282 done
283
284 case $preprev in
285 play-sample|play-file)
286 comps=$(__sinks)
287 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
288 ;;
289
290 load-sample*) _filedir ;;
291
292 move-sink-input)
293 comps=$(__sinks)
294 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
295 ;;
296
297 move-source-output)
298 comps=$(__sources)
299 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
300 ;;
301
302 set-card-profile)
303 comps=$(__profiles)
304 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
305 ;;
306
307 set-*port*)
308 comps=$(__ports)
309 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
310 ;;
311
312 set-*-mute) COMPREPLY=($(compgen -W 'true false' -- "$cur"));;
313
314 set-sink-formats)
315 ;; #TODO
316 esac
317
318 case $prev in
319 describe-module|load-module)
320 comps=$(__all_modules)
321 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
322 ;;
323
324 unload-module)
325 comps=$(__loaded_modules)
326 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
327 ;;
328
329 load-sample-dir-lazy) _filedir -d ;;
330 play-file) _filedir ;;
331
332 *sink-input*)
333 comps=$(__sink_inputs)
334 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
335 ;;
336
337 *source-output*)
338 comps=$(__source_outputs)
339 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
340 ;;
341
342 *sink*)
343 comps=$(__sinks)
344 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
345 ;;
346
347 *source*)
348 comps=$(__sources)
349 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
350 ;;
351
352 set-card*)
353 comps=$(__cards)
354 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
355 ;;
356
357 set-port-*)
358 comps=$(__cards)
359 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
360 ;;
361
362 set-log-target)
363 COMPREPLY=($(compgen -W 'auto syslog stderr file: newfile:' -- "$cur"))
364 ;;
365
366 set-log-level)
367 COMPREPLY=($(compgen -W '{0..4}' -- "$cur"))
368 ;;
369
370 set-log-meta|set-log-time|suspend)
371 COMPREPLY=($(compgen -W 'true false' -- "$cur"))
372 ;;
373 esac
374
375 case $cur in
376 -*) COMPREPLY=($(compgen -W '${flags[*]}' -- "$cur")) ;;
377 suspend)
378 COMPREPLY=($(compgen -W 'suspend suspend-sink suspend-source' -- "$cur"))
379 ;;
380
381 load-sample)
382 COMPREPLY=($(compgen -W 'load-sample load-sample-lazy load-sample-dir-lazy' -- "$cur"))
383 ;;
384
385 *)
386 [[ -z $command ]] && COMPREPLY=($(compgen -W '${commands[*]}' -- "$cur"))
387 ;;
388 esac
389 }
390 complete -F _pacmd pacmd
391
392 _pasuspender () {
393 local cur prev
394 local flags='-h --help --version -s --server='
395
396 _init_completion -n = || return
397
398 case $cur in
399 --server=*)
400 cur=${cur#*=}
401 _known_hosts_real "$cur"
402 ;;
403
404 -*)
405 COMPREPLY=($(compgen -W '${flags[*]}' -- "$cur"))
406 [[ $COMPREPLY == *= ]] && compopt -o nospace
407 ;;
408 esac
409
410 case $prev in
411 -s) _known_hosts_real "$cur" ;;
412 esac
413 }
414 complete -F _pasuspender pasuspender
415
416 _padsp () {
417 local cur prev
418 local flags='-h -s -n -m -M -S -D -d'
419
420 _get_comp_words_by_ref cur prev
421
422 case $cur in
423 -*) COMPREPLY=($(compgen -W '${flags[*]}' -- "$cur")) ;;
424 esac
425
426 case $prev in
427 -s) _known_hosts_real "$cur" ;;
428 esac
429 }
430 complete -F _padsp padsp
431
432 _pacat () {
433 local cur prev comps
434 local flags='-h --help --version -r --record -p --playback -v --verbose -s
435 --server= -d --device= -n --client-name= --stream-name= --volume=
436 --rate= --format= --channels= --channel-map= --fix-format --fix-rate
437 --fix-channels --no-remix --no-remap --latency= --process-time=
438 --latency-msec= --process-time-msec= --property= --raw --passthrough
439 --file-format= --list-file-formats'
440
441 _init_completion -n = || return
442
443 case $cur in
444 --server=*)
445 cur=${cur#*=}
446 _known_hosts_real "$cur"
447 ;;
448
449 --device=*)
450 cur=${cur#*=}
451 comps=$(__sinks)
452 comps+=$(__sources)
453 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
454 ;;
455
456 --rate=*)
457 cur=${cur#*=}
458 COMPREPLY=($(compgen -W '32000 44100 48000 9600 192000' -- "$cur"))
459 ;;
460
461 --file-format=*)
462 cur=${cur#*=}
463 comps=$(_pacat_file_formats)
464 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
465 ;;
466
467 --*=*)
468 ;;
469
470 -*)
471 COMPREPLY=($(compgen -W '${flags[*]}' -- "$cur"))
472 [[ $COMPREPLY == *= ]] && compopt -o nospace
473 ;;
474 *) _filedir ;;
475 esac
476
477 case $prev in
478 -s) _known_hosts_real "$cur" ;;
479 -d)
480 comps=$(__sinks)
481 comps+=$(__sources)
482 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
483 ;;
484 esac
485 }
486 complete -F _pacat pacat paplay parecord
487
488 _pulseaudio()
489 {
490 local cur prev words cword
491 local flags='-h --help --version --dump-conf --dump-resample-methods --cleanup-shm
492 --start -k --kill --check --system= -D --daemonize= --fail= --high-priority=
493 --realtime= --disallow-module-loading= --disallow-exit= --exit-idle-time=
494 --scache-idle-time= --log-level= -v --log-target= --log-meta= --log-time=
495 --log-backtrace= -p --dl-search-path= --resample-method= --use-pit-file=
496 --no-cpu-limit= --disable-shm= -L --load= -F --file= -C -n'
497 _init_completion -n = || return
498
499 case $cur in
500 --system=*|--daemonize=*|--fail=*|--high-priority=*|--realtime=*| \
501 --disallow-*=*|--log-meta=*|--log-time=*|--use-pid-file=*| \
502 --no-cpu-limit=*|--disable-shm=*)
503 cur=${cur#*=}
504 COMPREPLY=($(compgen -W 'true false' -- "$cur"))
505 ;;
506
507 --log-target=*)
508 cur=${cur#*=}
509 COMPREPLY=($(compgen -W 'auto syslog stderr file: newfile:' -- "$cur"))
510 ;;
511
512 --log-level=*)
513 cur=${cur#*=}
514 COMPREPLY=($(compgen -W '{0..4}' -- "$cur"))
515 ;;
516
517 --dl-search-path=*)
518 cur=${cur#*=}
519 _filedir -d
520 ;;
521
522 --file=*)
523 cur=${cur#*=}
524 _filedir
525 ;;
526
527 --resample-method=*)
528 cur=${cur#*=}
529 comps=$(__resample_methods)
530 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
531 ;;
532
533 --load=*)
534 cur=${cur#*=}
535 comps=$(__all_modules)
536 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
537 ;;
538
539 --*=*)
540 ;;
541
542 -*)
543 COMPREPLY=($(compgen -W '${flags[*]}' -- "$cur"))
544 [[ $COMPREPLY == *= ]] && compopt -o nospace
545 ;;
546 esac
547
548 case $prev in
549 -D) COMPREPLY=($(compgen -W 'true false' -- "$cur")) ;;
550 -p) _filedir -d ;;
551 -F) _filedir ;;
552 -L)
553 cur=${cur#*=}
554 comps=$(__all_modules)
555 COMPREPLY=($(compgen -W '${comps[*]}' -- "$cur"))
556 ;;
557 esac
558 }
559 complete -F _pulseaudio pulseaudio
560
561 #vim: set ft=zsh sw=4 ts=4 noet