417 lines
9.9 KiB
Bash
417 lines
9.9 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# Bash completions for liquidctl.
|
|
#
|
|
# Requires bash-completion.[1]
|
|
#
|
|
# Users can place this file in the `completions` subdir of
|
|
# $BASH_COMPLETION_USER_DIR (defaults to `$XDG_DATA_HOME/bash-completion` or
|
|
# `~/.local/share/bash-completion` if $XDG_DATA_HOME is not set).
|
|
#
|
|
# Distros should instead use the directory returned by
|
|
# pkg-config --variable=completionsdir bash-completion
|
|
#
|
|
# See [1] for more information.
|
|
#
|
|
# [1] https://github.com/scop/bash-completion
|
|
#
|
|
# Copyright Marshall Asch and contributors
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
# logging method
|
|
_e() { echo "$1" >> log; }
|
|
|
|
|
|
_list_bus_options () {
|
|
liquidctl list -v | grep 'Bus:' | cut -d ':' -f 2 | sort -u
|
|
}
|
|
|
|
_list_vendor_options () {
|
|
liquidctl list -v | grep 'Vendor ID:' | cut -d ':' -f 2 | cut -c4-6 | sort -u
|
|
}
|
|
|
|
_list_product_options () {
|
|
liquidctl list -v | grep 'Product ID:' | cut -d ':' -f 2 | cut -c4-6 | sort -u
|
|
}
|
|
|
|
_list_device_options () {
|
|
liquidctl list | cut -d ' ' -f 3 | cut -d ':' -f 1 | sort -u
|
|
}
|
|
|
|
_list_match_options () {
|
|
liquidctl list | cut -d ':' -f 2 | sort -u | awk '{gsub(/\(|\)/,"",$0); print tolower($0)}'
|
|
}
|
|
|
|
_list_pick_options () {
|
|
num=$(liquidctl list | wc -l)
|
|
seq $num
|
|
}
|
|
|
|
_list_release_options () {
|
|
liquidctl list -v | grep 'Release number:' | cut -d ':' -f 2 | sort -u
|
|
}
|
|
|
|
_list_address_options () {
|
|
liquidctl list -v | grep 'Address:' | cut -d ':' -f 2 | sort -u
|
|
}
|
|
|
|
_list_port_options () {
|
|
liquidctl list -v | grep 'Port:' | cut -d ':' -f 2 | sort -u
|
|
}
|
|
|
|
_list_serial_options () {
|
|
liquidctl list -v | grep 'Serial number:' | cut -d ':' -f 2 | sort -u
|
|
}
|
|
|
|
_liquidctl_main() {
|
|
local commands="
|
|
set
|
|
initialize
|
|
list
|
|
status
|
|
"
|
|
|
|
local boolean_options="
|
|
--verbose -v
|
|
--debug -g
|
|
--json
|
|
--version
|
|
--help
|
|
--single-12v-ocp
|
|
--legacy-690lc
|
|
--non-volatile
|
|
--direct-access
|
|
"
|
|
|
|
local options_with_args="
|
|
--match -m
|
|
--pick -n
|
|
--vendor
|
|
--product
|
|
--release
|
|
--serial
|
|
--bus
|
|
--address
|
|
--usb-port
|
|
--device -d
|
|
--speed
|
|
--time-per-color
|
|
--time-off
|
|
--alert-threshold
|
|
--alert-color
|
|
--pump-mode
|
|
--unsafe
|
|
--direction
|
|
--start-led
|
|
--maximum-leds
|
|
--temperature-sensor
|
|
--fan-mode
|
|
"
|
|
|
|
# generate options list and remove any flag that has already been given
|
|
# note this will note remove the short and long versions
|
|
options=($options_with_args $boolean_options)
|
|
for i in "${!options[@]}";
|
|
do
|
|
if [[ "${COMP_WORDS[@]}" =~ "${options[i]}" ]]; then
|
|
unset 'options[i]'
|
|
fi
|
|
done;
|
|
options=$(echo "${options[@]}")
|
|
|
|
|
|
|
|
# This part will check if it is currently completing a flag
|
|
local previous=$3
|
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
|
|
|
case "$previous" in
|
|
--vendor)
|
|
COMPREPLY=($(compgen -W "$(_list_vendor_options)" -- "$cur"))
|
|
return
|
|
;;
|
|
--product)
|
|
COMPREPLY=($(compgen -W "$(_list_product_options)" -- "$cur"))
|
|
return
|
|
;;
|
|
--bus)
|
|
COMPREPLY=($(compgen -W "$(_list_bus_options)" -- "$cur"))
|
|
return
|
|
;;
|
|
--address)
|
|
COMPREPLY=($(compgen -W "$(_list_port_options)" -- "$cur"))
|
|
return
|
|
;;
|
|
--match | -m )
|
|
COMPREPLY=($(compgen -W "$(_list_match_options)" -- "$cur"))
|
|
return
|
|
;;
|
|
--pick | -n )
|
|
COMPREPLY=($(compgen -W "$(_list_pick_options)" -- "$cur"))
|
|
return
|
|
;;
|
|
--device | -d )
|
|
COMPREPLY=($(compgen -W "$(_list_device_options)" -- "$cur"))
|
|
return
|
|
;;
|
|
--release)
|
|
COMPREPLY=($(compgen -W "$(_list_release_options)" -- "$cur"))
|
|
return
|
|
;;
|
|
--serial)
|
|
COMPREPLY=($(compgen -W "$(_list_serial_options)" -- "$cur"))
|
|
return
|
|
;;
|
|
--usb-port)
|
|
COMPREPLY=($(compgen -W "$(_list_port_options)" -- "$cur"))
|
|
return
|
|
;;
|
|
--pump-mode)
|
|
COMPREPLY=($(compgen -W "balanced quiet extreme" -- "$cur"))
|
|
return
|
|
;;
|
|
--* | -[a-z]*1)
|
|
COMPREPLY=()
|
|
return
|
|
;;
|
|
esac
|
|
|
|
# This will handle auto completing arguments even if they are given at the end of the command
|
|
case "$cur" in
|
|
-*)
|
|
COMPREPLY=($(compgen -W "$options" -- "$cur"))
|
|
return
|
|
;;
|
|
esac
|
|
|
|
local i=1 cmd
|
|
|
|
# find the subcommand - first word after the flags
|
|
while [[ "$i" -lt "$COMP_CWORD" ]]
|
|
do
|
|
local s="${COMP_WORDS[i]}"
|
|
case "$s" in
|
|
--help | --version)
|
|
COMPREPLY=()
|
|
return
|
|
;;
|
|
-*) ;;
|
|
initialize | list | status | set )
|
|
cmd="$s"
|
|
break
|
|
;;
|
|
esac
|
|
(( i++ ))
|
|
done
|
|
|
|
if [[ "$i" -eq "$COMP_CWORD" ]]
|
|
then
|
|
|
|
COMPREPLY=($(compgen -W "$commands $options" -- "$cur"))
|
|
return # return early if we're still completing the 'current' command
|
|
fi
|
|
|
|
# we've completed the 'current' command and now need to call the next completion function
|
|
# subcommands have their own completion functions
|
|
case "$cmd" in
|
|
list) COMPREPLY="" ;;
|
|
initialize) _liquidctl_initialize_command ;;
|
|
status) COMPREPLY="" ;;
|
|
set) _liquidctl_set_command ;;
|
|
*) ;;
|
|
esac
|
|
}
|
|
|
|
_liquidctl_initialize_command ()
|
|
{
|
|
local i=1 subcommand_index
|
|
|
|
# find the sub command (either a fan or an led to set)
|
|
while [[ $i -lt $COMP_CWORD ]]; do
|
|
local s="${COMP_WORDS[i]}"
|
|
case "$s" in
|
|
all)
|
|
subcommand_index=$i
|
|
break
|
|
;;
|
|
esac
|
|
(( i++ ))
|
|
done
|
|
|
|
|
|
if [[ "$i" -eq "$COMP_CWORD" ]]
|
|
then
|
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
|
COMPREPLY=($(compgen -W "all" -- "$cur"))
|
|
return # return early if we're still completing the 'current' command
|
|
fi
|
|
|
|
|
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
|
COMPREPLY=() #($(compgen -W "all" -- "$cur"))
|
|
}
|
|
|
|
|
|
_liquidctl_set_command ()
|
|
{
|
|
local i=1 subcommand_index handled=0
|
|
|
|
# find the sub command (either a fan or an led to set)
|
|
while [[ $i -lt $COMP_CWORD ]]; do
|
|
local s="${COMP_WORDS[i]}"
|
|
case "$s" in
|
|
fan[0-9] | fan | pump)
|
|
subcommand_index=$i
|
|
_liquidctl_set_fan
|
|
handled=1
|
|
break
|
|
;;
|
|
led[0-9] | led | sync | ring | logo | external)
|
|
subcommand_index=$i
|
|
_liquidctl_set_led
|
|
handled=1
|
|
break
|
|
;;
|
|
lcd)
|
|
subcommand_index=$i
|
|
_liquidctl_set_lcd
|
|
handled=1
|
|
break
|
|
;;
|
|
esac
|
|
(( i++ ))
|
|
done
|
|
|
|
# check if it is a fan or an LED that is being set
|
|
if [[ "$handled" -eq "0" ]]
|
|
then
|
|
# no trailing space here so that the fan number can be appended
|
|
compopt -o nospace
|
|
# possibly use some command here to get a list of all the possible channels from liquidctl
|
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
|
COMPREPLY=($(compgen -W "fan fan1 fan2 fan3 fan4 fan5 fan6 led led1 led2 led3 led4 led5 led6 pump sync ring logo external lcd" -- "$cur"))
|
|
fi
|
|
}
|
|
|
|
_liquidctl_set_fan ()
|
|
{
|
|
local i=1 found=0
|
|
|
|
# find the sub command (either a fan or an led to set)
|
|
while [[ $i -lt $COMP_CWORD ]]; do
|
|
local s="${COMP_WORDS[i]}"
|
|
|
|
if [[ "$s" = "speed" ]]; then
|
|
found=1
|
|
break
|
|
fi
|
|
|
|
(( i++ ))
|
|
done
|
|
|
|
# check if it is a fan or an LED that is being set
|
|
if [[ $found = 1 ]]; then
|
|
COMPREPLY=""
|
|
else
|
|
COMPREPLY="speed"
|
|
fi
|
|
}
|
|
|
|
_liquidctl_set_led ()
|
|
{
|
|
|
|
local i=1 found=0
|
|
|
|
# find the sub command (either a fan or an led to set)
|
|
while [[ $i -lt $COMP_CWORD ]]; do
|
|
local s="${COMP_WORDS[i]}"
|
|
if [[ "$s" = "color" ]]; then
|
|
found=1
|
|
break
|
|
fi
|
|
|
|
(( i++ ))
|
|
done
|
|
|
|
# check if it is a fan or an LED that is being set
|
|
if [[ $found = 1 ]]; then
|
|
COMPREPLY=""
|
|
else
|
|
COMPREPLY="color"
|
|
fi
|
|
}
|
|
|
|
_liquidctl_set_lcd ()
|
|
{
|
|
local i=1 found=0
|
|
|
|
# find the sub command
|
|
while [[ $i -lt $COMP_CWORD ]]; do
|
|
local s="${COMP_WORDS[i]}"
|
|
if [[ "$s" = "screen" ]]; then
|
|
found=1
|
|
break
|
|
fi
|
|
|
|
(( i++ ))
|
|
done
|
|
|
|
# check if it is a fan or an LED that is being set
|
|
if [[ $found = 1 ]]; then
|
|
_liquidctl_set_screen
|
|
else
|
|
COMPREPLY="screen"
|
|
fi
|
|
}
|
|
|
|
_liquidctl_set_screen ()
|
|
{
|
|
local i=1 subcommand_index handled=0
|
|
|
|
# find the sub command (either a fan or an led to set)
|
|
while [[ $i -lt $COMP_CWORD ]]; do
|
|
local s="${COMP_WORDS[i]}"
|
|
case "$s" in
|
|
liquid)
|
|
subcommand_index=$i
|
|
COMPREPLY=""
|
|
handled=1
|
|
break
|
|
;;
|
|
brightness)
|
|
subcommand_index=$i
|
|
COMPREPLY=""
|
|
handled=1
|
|
break
|
|
;;
|
|
orientation)
|
|
subcommand_index=$i
|
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
|
COMPREPLY=($(compgen -W "0 90 180 270" -- "$cur"))
|
|
handled=1
|
|
break
|
|
;;
|
|
static | gif)
|
|
subcommand_index=$i
|
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
|
COMPREPLY=( $(compgen -f -- ${cur}) )
|
|
handled=1
|
|
break
|
|
;;
|
|
esac
|
|
(( i++ ))
|
|
done
|
|
|
|
# check if it is a fan or an LED that is being set
|
|
if [[ "$handled" -eq "0" ]]
|
|
then
|
|
# no trailing space here so that the fan number can be appended
|
|
compopt -o nospace
|
|
# possibly use some command here to get a list of all the possible channels from liquidctl
|
|
local cur="${COMP_WORDS[COMP_CWORD]}"
|
|
COMPREPLY=($(compgen -W "liquid brightness orientation static gif" -- "$cur"))
|
|
fi
|
|
}
|
|
|
|
complete -F _liquidctl_main liquidctl
|