It is desirable for bash-completion to complete block devices via symlinks (e.g. under /dev/disk) and with non-canonical locations (e.g. ./sda if $PWD is /dev, and /chroot/dev/sda). Unfortunately, this is a non-trivial task due to how bash-completion works. It is necessary to un-escape the last partial argument, search, then escape the results, ideally handling tilde and variable expansion/completion. See [_get_comp_words_by_ref] and [_filedir] in the bash-completion project for details. Given the development costs of a complete and correct implementation, the annoyance/frustration which would result from an incomplete/buggy implementation, and the trade-offs between under- and over-completion, this commit adds fallback to bash default completion if the argument does not match any canonical device names. This correctly completes in the cases mentioned above, although it incorrectly completes on non-block-device files as well. [_filedir]: https://github.com/scop/bash-completion/blob/2.9/bash_completion#L552 [_get_comp_words_by_ref]: https://github.com/scop/bash-completion/blob/2.9/bash_completion#L365 Signed-off-by: Kevin Locke <kevin@kevinlocke.name>
92 lines
2 KiB
Text
92 lines
2 KiB
Text
_lsblk_module()
|
|
{
|
|
local cur prev OPTS LSBLK_COLS_ALL
|
|
COMPREPLY=()
|
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
|
|
|
LSBLK_COLS_ALL="
|
|
NAME KNAME MAJ:MIN FSTYPE MOUNTPOINT LABEL UUID PARTTYPE
|
|
PARTLABEL PARTUUID PARTFLAGS RA RO RM HOTPLUG MODEL SERIAL SIZE
|
|
STATE OWNER GROUP MODE ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC
|
|
ROTA SCHED RQ-SIZE TYPE DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
|
|
WSAME WWN RAND PKNAME HCTL TRAN SUBSYSTEMS REV VENDOR
|
|
"
|
|
|
|
case $prev in
|
|
'-e'|'--exclude'|'-I'|'--include')
|
|
local realcur prefix MAJOR_ALL MAJOR I J
|
|
realcur="${cur##*,}"
|
|
prefix="${cur%$realcur}"
|
|
for I in /sys/dev/block/*; do
|
|
J=${I##*/}
|
|
MAJOR_ALL="${MAJOR_ALL:-""} ${J%%:*}"
|
|
done
|
|
for WORD in ${MAJOR_ALL:-""}; do
|
|
if ! [[ $prefix == *"$WORD"* ]]; then
|
|
MAJOR="$WORD ${MAJOR:-""}"
|
|
fi
|
|
done
|
|
compopt -o nospace
|
|
COMPREPLY=( $(compgen -P "$prefix" -W "${MAJOR:-""}" -S ',' -- $realcur) )
|
|
return 0
|
|
;;
|
|
'-o'|'--output'|'-M'|'--dedup')
|
|
local prefix realcur LSBLK_COLS
|
|
realcur="${cur##*,}"
|
|
prefix="${cur%$realcur}"
|
|
for WORD in $LSBLK_COLS_ALL; do
|
|
if ! [[ $prefix == *"$WORD"* ]]; then
|
|
LSBLK_COLS="$WORD ${LSBLK_COLS:-""}"
|
|
fi
|
|
done
|
|
compopt -o nospace
|
|
COMPREPLY=( $(compgen -P "$prefix" -W "$LSBLK_COLS" -S ',' -- $realcur) )
|
|
return 0
|
|
;;
|
|
'-x'|'--sort')
|
|
compopt -o nospace
|
|
COMPREPLY=( $(compgen -W "$LSBLK_COLS_ALL" -- $cur) )
|
|
return 0
|
|
;;
|
|
'-h'|'--help'|'-V'|'--version')
|
|
return 0
|
|
;;
|
|
esac
|
|
case $cur in
|
|
-*)
|
|
OPTS="--all
|
|
--bytes
|
|
--nodeps
|
|
--discard
|
|
--exclude
|
|
--fs
|
|
--help
|
|
--include
|
|
--json
|
|
--ascii
|
|
--list
|
|
--dedup
|
|
--merge
|
|
--perms
|
|
--noheadings
|
|
--output
|
|
--output-all
|
|
--paths
|
|
--pairs
|
|
--raw
|
|
--inverse
|
|
--topology
|
|
--scsi
|
|
--sort
|
|
--help
|
|
--version"
|
|
COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
|
|
return 0
|
|
;;
|
|
esac
|
|
compopt -o bashdefault -o default
|
|
COMPREPLY=( $(compgen -W "$($1 -pnro name)" -- $cur) )
|
|
return 0
|
|
}
|
|
complete -F _lsblk_module lsblk
|