From 034c602c64cd6c8d521b54c59f6608c8bfff7d16 Mon Sep 17 00:00:00 2001 From: Pierre Ozoux Date: Mon, 17 Dec 2012 09:49:51 +0100 Subject: [PATCH] add virtualbox-completion --- .../available/virtualbox.completion.bash | 222 ++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 completion/available/virtualbox.completion.bash diff --git a/completion/available/virtualbox.completion.bash b/completion/available/virtualbox.completion.bash new file mode 100644 index 0000000000..4a660acd7f --- /dev/null +++ b/completion/available/virtualbox.completion.bash @@ -0,0 +1,222 @@ +#!/usr/bin/bash +_vboxmanage_realopts() { + echo $(vboxmanage|grep -i vboxmanage|cut -d' ' -f2|grep '\['|tr -s '[\[\|\]\n' ' ') + echo " " +} + +__vboxmanage_startvm() { + RUNNING=$(vboxmanage list runningvms | cut -d' ' -f1 | tr -d '"') + TOTAL=$(vboxmanage list vms | cut -d' ' -f1 | tr -d '"') + + AVAILABLE="" + for VM in $TOTAL; do + MATCH=0; + for RUN in $RUNNING "x"; do + if [ "$VM" == "$RUN" ]; then + MATCH=1 + fi + done + (( $MATCH == 0 )) && AVAILABLE="$AVAILABLE $VM " + done + echo $AVAILABLE +} + +__vboxmanage_list() { + INPUT=$(vboxmanage list | tr -s '[\[\]\|\n]' ' ' | cut -d' ' -f4-) + + PRUNED="" + if [ "$1" == "long" ]; then + for WORD in $INPUT; do + [ "$WORD" == "-l" ] && continue; + [ "$WORD" == "--long" ] && continue; + + PRUNED="$PRUNED $WORD" + done + else + PRUNED=$INPUT + fi + + echo $PRUNED +} + + +__vboxmanage_list_vms() { + VMS="" + if [ "x$1" == "x" ]; then + SEPARATOR=" " + else + SEPARATOR=$1 + fi + + for VM in $(vboxmanage list vms | cut -d' ' -f1 | tr -d '"'); do + [ "$VMS" != "" ] && VMS="${VMS}${SEPARATOR}" + VMS="${VMS}${VM}" + done + + echo $VMS +} + +__vboxmanage_list_runningvms() { + VMS="" + if [ "$1" == "" ]; then + SEPARATOR=" " + else + SEPARATOR=$1 + fi + + for VM in $(vboxmanage list runningvms | cut -d' ' -f1 | tr -d '"'); do + [ "$VMS" != "" ] && VMS="${VMS}${SEPARATOR}" + VMS="${VMS}${VM}" + done + + echo $VMS + +} + +__vboxmanage_controlvm() { + echo "pause resume reset poweroff savestate acpipowerbutton" + echo "acpisleepbutton keyboardputscancode guestmemoryballoon" + echo "gueststatisticsinterval usbattach usbdetach vrde vrdeport" + echo "vrdeproperty vrdevideochannelquality setvideomodehint" + echo "screenshotpng setcredentials teleport plugcpu unplugcpu" + echo "cpuexecutioncap" + +# setlinkstate<1-N> +# nic<1-N> null|nat|bridged|intnet|hostonly|generic +# [] | + # nictrace<1-N> on|off + # nictracefile<1-N> + # nicproperty<1-N> name=[value] + # natpf<1-N> [],tcp|udp,[], + # ,[], + # natpf<1-N> delete + +} + +__vboxmanage_default() { + realopts=$(_vboxmanage_realopts) + opts=$realopts$(vboxmanage | grep -i vboxmanage | cut -d' ' -f2 | grep -v '\[' | sort | uniq) + pruned="" + + # echo "" + # echo "DEBUG: cur: $cur, prev: $prev" + # echo "DEBUG: default: |$p1|$p2|$p3|$p4|" + case ${cur} in + -*) + echo $opts + # COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + return 0 + ;; + esac; + + for WORD in $opts; do + MATCH=0 + for OPT in ${COMP_WORDS[@]}; do + # opts=$(echo ${opts} | grep -v $OPT); + if [ "$OPT" == "$WORD" ]; then + MATCH=1 + break; + fi + if [ "$OPT" == "-v" ] && [ "$WORD" == "--version" ]; then + MATCH=1 + break; + fi + if [ "$OPT" == "--version" ] && [ "$WORD" == "-v" ]; then + MATCH=1 + break; + fi + if [ "$OPT" == "-q" ] && [ "$WORD" == "--nologo" ]; then + MATCH=1 + break; + fi + if [ "$OPT" == "--nologo" ] && [ "$WORD" == "-q" ]; then + MATCH=1 + break; + fi + done + (( $MATCH == 1 )) && continue; + pruned="$pruned $WORD" + + done + + # COMPREPLY=($(compgen -W "${pruned}" -- ${cur})) + echo $pruned + return 0 +} + +_vboxmanage() { + # vboxmanage | grep -i vboxmanage | cut -d' ' -f2 | sort | uniq + local cur p1 p2 p3 p4 opts + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + + # echo "cur: |$cur|" + # echo "prev: |$prev|" + + # In case current is complete command + case $cur in + startvm|list|controlvm) + COMPREPLY=($(compgen -W "$cur ")) + return 0 + ;; + esac + + case $prev in + -v|--version) + return 0 + ;; + + -l|--long) + opts=$(__vboxmanage_list "long") + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + return 0 + ;; + startvm|list) + opts=$(__vboxmanage_$prev) + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + return 0 + ;; + --type) + COMPREPLY=($(compgen -W "gui headless" -- ${cur})) + return 0 + ;; + gui|headless) + # Done. no more completion possible + return 0 + ;; + vboxmanage|-q|--nologo) + # echo "Got vboxmanage" + opts=$(__vboxmanage_default) + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + return 0 + ;; + controlvm) + opts=$(__vboxmanage_list_vms) + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + return 0 + ;; + esac + + for VM in $(__vboxmanage_list_vms); do + if [ "$VM" == "$prev" ]; then + pprev=${COMP_WORDS[COMP_CWORD-2]} + # echo "previous: $pprev" + case $pprev in + startvm) + opts="--type" + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + return 0 + ;; + controlvm) + opts=$(__vboxmanage_controlvm) + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + return 0; + ;; + esac + fi + done + + # echo "Got to end withoug completion" +} +complete -F _vboxmanage vboxmanage \ No newline at end of file