├── .gitignore ├── INSTALL.md ├── README.md └── vboxmanage_completion.bash /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | -------------------------------------------------------------------------------- /INSTALL.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tfmalt/bash-completion-virtualbox/02df30e0b8e399b8011d95aa917caf0aafe01d27/INSTALL.md -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This is an attempt of creating a package of autocomplete scripts for the 2 | virtualbox command line tools. 3 | -------------------------------------------------------------------------------- /vboxmanage_completion.bash: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # Attempt at autocompletion script for vboxmanage. This scripts assumes an 4 | # alias between VBoxManage and vboxmanaage. 5 | # 6 | # Copyright (c) 2012 Thomas Malt 7 | # 8 | 9 | alias vboxmanage="VBoxManage" 10 | 11 | complete -F _vboxmanage vboxmanage 12 | 13 | # export VBOXMANAGE_NIC_TYPES 14 | 15 | _vboxmanage() { 16 | local cur prev opts 17 | 18 | COMPREPLY=() 19 | 20 | cur="${COMP_WORDS[COMP_CWORD]}" 21 | prev="${COMP_WORDS[COMP_CWORD-1]}" 22 | 23 | # echo "cur: |$cur|" 24 | # echo "prev: |$prev|" 25 | 26 | case $prev in 27 | -v|--version) 28 | return 0 29 | ;; 30 | 31 | -l|--long) 32 | opts=$(__vboxmanage_list "long") 33 | COMPREPLY=($(compgen -W "${opts}" -- ${cur})) 34 | return 0 35 | ;; 36 | --nic[1-8]) 37 | # This is part of modifyvm subcommand 38 | opts=$(__vboxmanage_nic_types) 39 | COMPREPLY=($(compgen -W "${opts}" -- ${cur})) 40 | ;; 41 | startvm|list) 42 | opts=$(__vboxmanage_$prev) 43 | COMPREPLY=($(compgen -W "${opts}" -- ${cur})) 44 | return 0 45 | ;; 46 | --type) 47 | COMPREPLY=($(compgen -W "gui headless" -- ${cur})) 48 | return 0 49 | ;; 50 | gui|headless) 51 | # Done. no more completion possible 52 | return 0 53 | ;; 54 | vboxmanage) 55 | # In case current is complete command we return emmideatly. 56 | case $cur in 57 | startvm|list|controlvm|showvminfo|modifyvm) 58 | COMPREPLY=($(compgen -W "$cur ")) 59 | return 0 60 | ;; 61 | esac 62 | 63 | # echo "Got vboxmanage" 64 | opts=$(__vboxmanage_default) 65 | COMPREPLY=($(compgen -W "${opts}" -- ${cur})) 66 | return 0 67 | ;; 68 | -q|--nologo) 69 | opts=$(__vboxmanage_default) 70 | COMPREPLY=($(compgen -W "${opts}" -- ${cur})) 71 | return 0 72 | ;; 73 | controlvm|showvminfo|modifyvm) 74 | opts=$(__vboxmanage_list_vms) 75 | COMPREPLY=($(compgen -W "${opts}" -- ${cur})) 76 | return 0 77 | ;; 78 | vrde|setlinkstate*) 79 | # vrde is a complete subcommand of controlvm 80 | opts="on off" 81 | COMPREPLY=($(compgen -W "${opts}" -- ${cur})) 82 | return 0 83 | ;; 84 | esac 85 | 86 | for VM in $(__vboxmanage_list_vms); do 87 | if [ "$VM" == "$prev" ]; then 88 | pprev=${COMP_WORDS[COMP_CWORD-2]} 89 | # echo "previous: $pprev" 90 | case $pprev in 91 | startvm) 92 | opts="--type" 93 | COMPREPLY=($(compgen -W "${opts}" -- ${cur})) 94 | return 0 95 | ;; 96 | controlvm) 97 | opts=$(__vboxmanage_controlvm $VM) 98 | COMPREPLY=($(compgen -W "${opts}" -- ${cur})) 99 | return 0; 100 | ;; 101 | showvminfo) 102 | opts="--details --machinereadable --log" 103 | COMPREPLY=($(compgen -W "${opts}" -- ${cur})) 104 | return 0; 105 | ;; 106 | modifyvm) 107 | opts=$(__vboxmanage_modifyvm) 108 | COMPREPLY=($(compgen -W "${opts}" -- ${cur})) 109 | return 0 110 | ;; 111 | esac 112 | fi 113 | done 114 | 115 | # echo "Got to end withoug completion" 116 | } 117 | 118 | _vboxmanage_realopts() { 119 | echo $(vboxmanage | grep -Eo "^\s{2}[a-z]+") 120 | echo " " 121 | } 122 | 123 | __vboxmanage_nic_types() { 124 | echo $( \ 125 | vboxmanage | \ 126 | grep ' nic<' | \ 127 | sed 's/.*nic<1-N> \([a-z\|]*\).*/\1/' | tr '|' ' ' \ 128 | ) 129 | } 130 | 131 | __vboxmanage_startvm() { 132 | RUNNING=$(vboxmanage list runningvms | cut -d' ' -f1 | tr -d '"') 133 | TOTAL=$(vboxmanage list vms | cut -d' ' -f1 | tr -d '"') 134 | 135 | AVAILABLE="" 136 | for VM in $TOTAL; do 137 | MATCH=0; 138 | for RUN in $RUNNING "x"; do 139 | if [ "$VM" == "$RUN" ]; then 140 | MATCH=1 141 | fi 142 | done 143 | (( $MATCH == 0 )) && AVAILABLE="$AVAILABLE $VM " 144 | done 145 | echo $AVAILABLE 146 | } 147 | 148 | __vboxmanage_list() { 149 | INPUT=$(vboxmanage list | tr -s '[\[\]\|\n]' ' ' | cut -d' ' -f4-) 150 | 151 | PRUNED="" 152 | if [ "$1" == "long" ]; then 153 | for WORD in $INPUT; do 154 | [ "$WORD" == "-l" ] && continue; 155 | [ "$WORD" == "--long" ] && continue; 156 | 157 | PRUNED="$PRUNED $WORD" 158 | done 159 | else 160 | PRUNED=$INPUT 161 | fi 162 | 163 | echo $PRUNED 164 | } 165 | 166 | 167 | __vboxmanage_list_vms() { 168 | VMS="" 169 | if [ "x$1" == "x" ]; then 170 | SEPARATOR=" " 171 | else 172 | SEPARATOR=$1 173 | fi 174 | 175 | for VM in $(vboxmanage list vms | cut -d' ' -f1 | tr -d '"'); do 176 | [ "$VMS" != "" ] && VMS="${VMS}${SEPARATOR}" 177 | VMS="${VMS}${VM}" 178 | done 179 | 180 | echo $VMS 181 | } 182 | 183 | __vboxmanage_list_runningvms() { 184 | VMS="" 185 | if [ "$1" == "" ]; then 186 | SEPARATOR=" " 187 | else 188 | SEPARATOR=$1 189 | fi 190 | 191 | for VM in $(vboxmanage list runningvms | cut -d' ' -f1 | tr -d '"'); do 192 | [ "$VMS" != "" ] && VMS="${VMS}${SEPARATOR}" 193 | VMS="${VMS}${VM}" 194 | done 195 | 196 | echo $VMS 197 | 198 | } 199 | 200 | __vboxmanage_controlvm() { 201 | echo "pause resume reset poweroff savestate acpipowerbutton" 202 | echo "acpisleepbutton keyboardputscancode guestmemoryballoon" 203 | echo "gueststatisticsinterval usbattach usbdetach vrde vrdeport" 204 | echo "vrdeproperty vrdevideochannelquality setvideomodehint" 205 | echo "screenshotpng setcredentials teleport plugcpu unplugcpu" 206 | echo "cpuexecutioncap" 207 | 208 | # setlinkstate<1-N> 209 | activenics=$(__vboxmanage_showvminfo_active_nics $1) 210 | for nic in $(echo "${activenics}" | tr -d 'nic'); do 211 | echo "setlinkstate${nic}" 212 | done 213 | 214 | # nic<1-N> null|nat|bridged|intnet|hostonly|generic 215 | # [] | 216 | # nictrace<1-N> on|off 217 | # nictracefile<1-N> 218 | # nicproperty<1-N> name=[value] 219 | # natpf<1-N> [],tcp|udp,[], 220 | # ,[], 221 | # natpf<1-N> delete 222 | 223 | } 224 | 225 | __vboxmanage_modifyvm() { 226 | options=$(\ 227 | vboxmanage modifyvm | \ 228 | grep '\[--' | \ 229 | grep -v '\[--nic<' | \ 230 | sed 's/ *\[--\([a-z]*\).*/--\1/' \ 231 | ); 232 | # Exceptions 233 | for i in {1..8}; do 234 | options="$options --nic${i}" 235 | done 236 | echo $options 237 | } 238 | 239 | __vboxmanage_showvminfo_active_nics() { 240 | nics=$(vboxmanage showvminfo $1 --machinereadable | \ 241 | awk '/^nic/ && ! /none/' | \ 242 | awk '{ split($1, names, "="); print names[1] }' \ 243 | ); 244 | echo $nics 245 | } 246 | 247 | __vboxmanage_default() { 248 | realopts=$(_vboxmanage_realopts) 249 | opts=$realopts$(vboxmanage | grep -i vboxmanage | cut -d' ' -f2 | grep -v '\[' | sort | uniq) 250 | pruned="" 251 | 252 | # echo "" 253 | # echo "DEBUG: cur: $cur, prev: $prev" 254 | # echo "DEBUG: default: |$p1|$p2|$p3|$p4|" 255 | case ${cur} in 256 | -*) 257 | echo $opts 258 | # COMPREPLY=($(compgen -W "${opts}" -- ${cur})) 259 | return 0 260 | ;; 261 | esac; 262 | 263 | for WORD in $opts; do 264 | MATCH=0 265 | for OPT in ${COMP_WORDS[@]}; do 266 | # opts=$(echo ${opts} | grep -v $OPT); 267 | if [ "$OPT" == "$WORD" ]; then 268 | MATCH=1 269 | break; 270 | fi 271 | if [ "$OPT" == "-v" ] && [ "$WORD" == "--version" ]; then 272 | MATCH=1 273 | break; 274 | fi 275 | if [ "$OPT" == "--version" ] && [ "$WORD" == "-v" ]; then 276 | MATCH=1 277 | break; 278 | fi 279 | if [ "$OPT" == "-q" ] && [ "$WORD" == "--nologo" ]; then 280 | MATCH=1 281 | break; 282 | fi 283 | if [ "$OPT" == "--nologo" ] && [ "$WORD" == "-q" ]; then 284 | MATCH=1 285 | break; 286 | fi 287 | done 288 | (( $MATCH == 1 )) && continue; 289 | pruned="$pruned $WORD" 290 | 291 | done 292 | 293 | # COMPREPLY=($(compgen -W "${pruned}" -- ${cur})) 294 | echo $pruned 295 | return 0 296 | } 297 | 298 | --------------------------------------------------------------------------------