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>
101 lines
2.1 KiB
Plaintext
101 lines
2.1 KiB
Plaintext
_blkid_module()
|
|
{
|
|
local cur prev OPTS OUTPUT_ALL
|
|
OUTPUT_ALL=''
|
|
COMPREPLY=()
|
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
|
case $prev in
|
|
'-c'|'--cache-file')
|
|
local IFS=$'\n'
|
|
compopt -o filenames
|
|
COMPREPLY=( $(compgen -f -- $cur) )
|
|
return 0
|
|
;;
|
|
'-o'|'--output')
|
|
COMPREPLY=( $(compgen -W "value device export full" -- $cur) )
|
|
return 0
|
|
;;
|
|
'-s'|'--match-tag')
|
|
COMPREPLY=( $(compgen -W "tag" -- $cur) )
|
|
return 0
|
|
;;
|
|
'-t'|'--match-token')
|
|
COMPREPLY=( $(compgen -W "TYPE= LABEL= UUID=" -- $cur) )
|
|
return 0
|
|
;;
|
|
'-L'|'--label')
|
|
COMPREPLY=( $(compgen -W "$(cd /dev/disk/by-label/ 2>/dev/null && echo *)" -- $cur) )
|
|
return 0
|
|
;;
|
|
'-U'|'--uuid')
|
|
COMPREPLY=( $(compgen -W "$(cd /dev/disk/by-uuid/ 2>/dev/null && echo *)" -- $cur) )
|
|
return 0
|
|
;;
|
|
'-S'|'--size')
|
|
COMPREPLY=( $(compgen -W "size" -- $cur) )
|
|
return 0
|
|
;;
|
|
'-O'|'--offset')
|
|
COMPREPLY=( $(compgen -W "offset" -- $cur) )
|
|
return 0
|
|
;;
|
|
'-u'|'--usages')
|
|
OUTPUT_ALL={,no}{filesystem,raid,crypto,other}
|
|
;;
|
|
'-n'|'--match-types')
|
|
OUTPUT_ALL="
|
|
$(awk '{print $NF}' /proc/filesystems)
|
|
$(\ls /lib/modules/$(uname -r)/kernel/fs)
|
|
"
|
|
;;
|
|
'-h'|'--help'|'-V'|'--version')
|
|
return 0
|
|
;;
|
|
esac
|
|
if [ -n "$OUTPUT_ALL" ]; then
|
|
local prefix realcur OUTPUT_ALL OUTPUT
|
|
realcur="${cur##*,}"
|
|
prefix="${cur%$realcur}"
|
|
for WORD in $OUTPUT_ALL; do
|
|
if ! [[ $prefix == *"$WORD"* ]]; then
|
|
OUTPUT="$WORD ${OUTPUT:-""}"
|
|
fi
|
|
done
|
|
compopt -o nospace
|
|
COMPREPLY=( $(compgen -P "$prefix" -W "$OUTPUT" -S ',' -- "$realcur") )
|
|
return 0
|
|
fi
|
|
case $cur in
|
|
-*)
|
|
OPTS="
|
|
--cache-file
|
|
--no-encoding
|
|
--garbage-collect
|
|
--output
|
|
--list-filesystems
|
|
--match-tag
|
|
--match-token
|
|
--list-one
|
|
--label
|
|
--uuid
|
|
--probe
|
|
--info
|
|
--size
|
|
--offset
|
|
--usages
|
|
--match-types
|
|
--no-part-details
|
|
--help
|
|
--version
|
|
"
|
|
COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
|
|
return 0
|
|
;;
|
|
esac
|
|
compopt -o bashdefault -o default
|
|
COMPREPLY=( $(compgen -W "$(lsblk -pnro name)" -- $cur) )
|
|
return 0
|
|
}
|
|
complete -F _blkid_module blkid
|