diff options
author | Ronan Pigott <rpigott@berkeley.edu> | 2019-08-16 23:34:51 -0700 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2019-09-06 10:58:03 +0300 |
commit | 760640a04e669939a4c2d69aa6ab7001f5208f2a (patch) | |
tree | 7d8d123ae99b82c350e7ff24041a8270a5ed323c /completion | |
parent | cb0215dd5ea57b25b11179c44e331a567050d3ae (diff) | |
download | bluez-760640a04e669939a4c2d69aa6ab7001f5208f2a.tar.gz |
completion: add bluetoothctl zsh completions
This zsh compdef provides completions for the bluetoothctl command.
It has been modified from version 1 of this patch to get the command
names and descriptions from the newly introduced --zsh-complete.
It utilizes the output of `bluetoothctl devices` or
`bluetoothctl controllers` to provide a descriptive completion menu
in those contexts.
e.g.
$ bluetoothctl connect <TAB>
04:52:C7:0C:D4:A7 -- Bose QuietComfort 35
40:4E:36:D9:8F:28 -- Pixel 2
A4:38:CC:20:5D:E0 -- Pro Controller
Diffstat (limited to 'completion')
-rw-r--r-- | completion/zsh/_bluetoothctl | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/completion/zsh/_bluetoothctl b/completion/zsh/_bluetoothctl new file mode 100644 index 000000000..bf35e503e --- /dev/null +++ b/completion/zsh/_bluetoothctl @@ -0,0 +1,98 @@ +#compdef bluetoothctl + +__bluetoothctl() { + bluetoothctl "$@" 2>/dev/null +} + +_bluezcomp_controller() { + local -a controllers + bluetoothctl list | + while read _ MAC NAME; do + controllers+="${MAC//:/\\:}:${NAME//:/\\:}" + done + _describe -t controllers 'controller' controllers +} + +_bluezcomp_device() { + local -a devices + bluetoothctl devices | + while read _ MAC NAME; do + devices+="${MAC//:/\\:}:${NAME//:/\\:}" + done + _describe -t devices 'device' devices +} + +_bluezcomp_agentcap() { + local -a agent_options=(${(f)"$(__bluetoothctl agent help)"}) + agent_options=( "${(@)agent_options:#(on|off)}" ) + compadd -a agent_options +} + +_bluetoothctl_agent() { + local -a agent_options=(${(f)"$(__bluetoothctl agent help)"}) + agent_options+=help + compadd -a agent_options +} + +_bluetoothctl_advertise() { + local -a ad_options=(${(f)"$(__bluetoothctl advertise help)"}) + ad_options+=help + compadd -a ad_options +} + +_bluetoothctl() { + local -a toggle_commands=( + "discoverable" "pairable" "power" "scan" + ) + + local -a controller_commands=( + "select" "show" + ) + + local -a device_commands=( + "block" "connect" "disconnect" "info" + "pair" "remove" "trust" "unblock" "untrust" + ) + + # Other commands may be handled by _bluetoothctl_$command + local -a all_commands=( "${(@f)$(__bluetoothctl --zsh-complete help)}" ) + + local curcontext=$curcontext state line ret=1 + _arguments -C \ + + '(info)' \ + {-h,--help}'[Show help message and exit]' \ + {-v,--version}'--version[Show version info and exit]' \ + + 'mod' \ + '(info)'{-a+,--agent=}'[Register agent handler]:agent:_bluezcomp_agentcap' \ + '(info)'{-t,--timeout}'[Timeout in seconds for non-interactive mode]' \ + '(info)'{-m,--monitor}'[Enable monitor output]' \ + + 'command' \ + '(info):command:->command' \ + '(info):: :->argument' \ + ': :_message "no more arguments"' + + if [[ $state == "command" ]]; then + _describe -t commands 'command' all_commands + elif [[ $state == "argument" ]]; then + if (( ! ${"${(@)all_commands%%:*}"[(I)${line[1]}]} )); then + _message "Unknown bluetoothctl command: $line[1]" + return 1; + fi + + curcontext="${curcontext%:*:*}:bluetoothctl-$line[1]:" + if ! _call_function ret _bluetoothctl_$line[1]; then + case $line[1] in + (${(~j.|.)toggle_commands}) + compadd on off + ;; + (${(~j.|.)device_commands}) + _bluezcomp_device + ;; + (${(~j.|.)controller_commands}) + _bluezcomp_controller + ;; + esac + fi + return ret + fi +} && _bluetoothctl |