From: Ronan Pigott <rpigott@xxxxxxxxxxxx> --- completion/zsh/_bluetoothctl | 131 +++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 completion/zsh/_bluetoothctl diff --git a/completion/zsh/_bluetoothctl b/completion/zsh/_bluetoothctl new file mode 100644 index 000000000..c9c177a83 --- /dev/null +++ b/completion/zsh/_bluetoothctl @@ -0,0 +1,131 @@ +#compdef bluetoothctl + +_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 +} + +_bluetoothctl_agent() { + local -a agent_options=(${(f)"$(bluetoothctl agent help)"}) + agent_options+=help + compadd -a agent_options +} + +_bluetoothctl_agent_cap() { + local -a agent_options=(${(f)"$(bluetoothctl agent help)"}) + agent_options=( "${(@)agent_options:#(on|off)}" ) + compadd -a agent_options +} + +_bluetoothctl_advertise() { + local -a ad_options=(${(f)"$(bluetoothctl advertise help)"}) + ad_options+=help + compadd -a ad_options +} + +_bluetoothctl() { + local curcontext=$curcontext state line ret=1 + + local -a simple_commands=( + "help:Display help" + "version:Dispaly version" + "list:List available controllers" + "devices:List available devices" + "paired-devices:List paired devices" + "reset-alias:Reset controller alias" + "default-agent:Set agent as the default one" + "export:Print environment variables" + "system-alias:Set controller alias" + "set-alias:Set device alias" + ) + + local -a toggle_commands=( + "power:Set controller power" + "pairable:Set controller pairable mode" + "discoverable:Set controller discoverable mode" + "scan:Scan for devices" + ) + + local -a controller_commands=( + "show:Controller information" + "select:Select default controller" + ) + + local -a device_commands=( + "info:Device information" + "pair:Pair with device" + "trust:Trust device" + "untrust:Untrust device" + "block:Block device" + "unblock:Unblock device" + "remove:Remove device" + "connect:Connect device" + "disconnect:Disconnect device" + ) + + local -a other_commands=( + "agent:Enable/disable advertising with given type" + "advertise:Enable/disable advertising with the given type" + ) + + local -a all_commands=( + $simple_commands + $device_commands + $toggle_commands + $controller_commands + $other_commands + ) + + _arguments -C \ + + '(info)' \ + '--help[Show help message and exit]' \ + '--version[Show version info and exit]' \ + + 'mod' \ + '(info)--timeout[Timeout in seconds for non-interactive mode]' \ + '(info)--agent=[Register agent handler]:agent:_bluetoothctl_agent_cap' \ + + 'command' \ + '(info):command:->command' \ + '(info):: :->argument' \ + ': :_message "no more arguments"' + + if [[ $state == "command" ]]; then + _describe -t commands 'command' all_commands + elif [[ $state == "argument" ]]; then + curcontext=${curcontext%:*:*}:bluetoothctl-$line[1] + case $line[1] in + (${(~j.|.)simple_commands%%:*}) + _message "no more arguments" + ;; + (${(~j.|.)toggle_commands%%:*}) + compadd on off + ;; + (${(~j.|.)device_commands%%:*}) + _bluezcomp_device + ;; + (${(~j.|.)controller_commands%%:*}) + _bluezcomp_controller + ;; + *) + if ! _call_function ret _bluetoothctl_$line[1]; then + _message "Unknown bluetoothctl command: $line[1]" + fi + return ret + ;; + esac + fi +} + +_bluetoothctl -- 2.22.1