Re: [PATCH BlueZ 2/3] completion: add bluetoothctl zsh completions

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Ronan,

On Fri, Aug 16, 2019 at 10:48 AM Ronan Pigott <rpigott314@xxxxxxxxx> wrote:
>
> 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

Id love to see this being generated by bt_shell automatically instead
i.e ./bluetoothctl --zsh-complete/--bash-complete, that can then be
used by the auto complete script generate the commands, which seems to
be what you did with help that would print the arguments but done to
the commands as well.


-- 
Luiz Augusto von Dentz



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux