libvirt/tools/bash-completion/vsh.in
Michal Privoznik 6aa94ce105 bash-completion: Run virsh/virt-admin in quiet mode
In some cases (e.g. when virt-admin connects to the default URI)
some info message is printed onto stdout (using vshPrintExtra()).
This hurts user experience, just consider:

  virt-admin<TAB><TAB>
  NOTE\:\ Connecting\ to\ default\ daemon.\ Specify\ daemon\ using\ -c\ \(e.g.\ virtqemud\:///system\)

when no daemon is running. Suppress extra prints by passing '-q'
in the bash-completion script.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
2024-05-28 08:51:45 +02:00

69 lines
2.0 KiB
Bash

#
# @command@ completion support
#
_@command@_complete()
{
local words cword c=0 i=0 cur RO URI CMDLINE INPUT A
# Here, $COMP_WORDS is an array of words on the bash
# command line that user wants to complete. However, when
# parsing command line, the default set of word breaks is
# applied. This doesn't work for us as it mangles libvirt
# arguments, e.g. connection URI (with the default set it's
# split into multiple items within the array). Fortunately,
# there's a fixup function for the array.
_get_comp_words_by_ref -n "\"'><=;|&(:" -w words -i cword
COMP_WORDS=( "${words[@]}" )
COMP_CWORD=${cword}
cur=${COMP_WORDS[$COMP_CWORD]}
# See what URI is user trying to connect to and if they are
# connecting RO. Honour that.
while [ $c -le $COMP_CWORD ]; do
local word="${COMP_WORDS[c]}"
case "$word" in
-r|--readonly) RO=1 ;;
-c|--connect) c=$((++c)); URI=${COMP_WORDS[c]} ;;
*) if [ $c -ne 0 ] && [ $i -eq 0 ]; then i=$c; break; fi ;;
esac
c=$((++c))
done
CMDLINE=( "-q" )
if [ -n "${RO}" ]; then
CMDLINE+=("-r")
fi
if [ -n "${URI}" ]; then
CMDLINE+=("-c" "${URI}")
fi
INPUT=( "${COMP_WORDS[@]:$i:$COMP_CWORD}" )
INPUT[-1]=${INPUT[-1]//\\:/:}
# Uncomment these lines for easy debug.
# echo;
# echo "RO=${flag_ro}";
# echo "URI=${URI}";
# echo "CMDLINE=${CMDLINE}";
# echo "INPUT[${#INPUT[@]}]=**${INPUT[@]}**";
# echo "cur=${cur}";
# echo;
# return 0;
# Small shortcut here. According to manpage:
# When the function is executed, the first argument ($1) is
# the name of the command whose arguments are being
# completed.
# Therefore, we might just run $1.
local IFS=$'\n'
A=($($1 ${CMDLINE[@]} complete -- "${INPUT[@]}" 2>/dev/null))
COMPREPLY=($(compgen -W "${A[*]%--}" -- ${cur}))
__ltrim_colon_completions "$cur"
return 0
} &&
complete -o default -o filenames -F _@command@_complete @command@
# vim: ft=sh:et:ts=4:sw=4:tw=80