mirror of
https://github.com/ericonr/util-linux.git
synced 2024-04-21 09:12:35 -05:00
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>
46 lines
760 B
Plaintext
46 lines
760 B
Plaintext
_blockdev_module()
|
|
{
|
|
local cur prev OPTS
|
|
COMPREPLY=()
|
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
|
DEVS="$(lsblk -pnro name)"
|
|
OPTS="-h -V -q
|
|
--report
|
|
--getsz
|
|
--setro
|
|
--setrw
|
|
--getro
|
|
--getdiscardzeroes
|
|
--getss
|
|
--getpbsz
|
|
--getiomin
|
|
--getioopt
|
|
--getalignoff
|
|
--getmaxsect
|
|
--getbsz
|
|
--setbsz
|
|
--getsize64
|
|
--setra
|
|
--getra
|
|
--setfra
|
|
--getfra
|
|
--flushbufs
|
|
--rereadpt
|
|
$DEVS"
|
|
case $prev in
|
|
'--setbsz')
|
|
COMPREPLY=( $(compgen -W "bytes" -- $cur) )
|
|
return 0
|
|
;;
|
|
'--setra'|'--setfra')
|
|
COMPREPLY=( $(compgen -W "sectors" -- $cur) )
|
|
return 0
|
|
;;
|
|
esac
|
|
compopt -o bashdefault -o default
|
|
COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
|
|
return 0
|
|
}
|
|
complete -F _blockdev_module blockdev
|