diff --git a/src/_vagrant b/src/_vagrant index e81688d..95fd6e5 100644 --- a/src/_vagrant +++ b/src/_vagrant @@ -16,26 +16,33 @@ # # ------------------------------------------------------------------------------ +# vagrant zsh completion local -a _1st_arguments _1st_arguments=( 'box:Box commands' + 'connect:Connects to a shared, remote Vagrant environment' 'destroy:Destroys the vagrant environment' - 'global-status:Shows the status of the global Vagrant environment.' + 'docker-logs:Shows Docker logs' + 'docker-run:Run one-off commands against a Docker container' + 'global-status:Reports the status of all active Vagrant environments on the system' 'halt:Halts the currently running vagrant environment' 'help:[TASK] Describe available tasks or one specific task' 'init:[box_name] [box_url] Initializes current folder for Vagrant usage' + 'login:Authenticates against a Vagrant Cloud server to access protected boxes' 'package:Packages a vagrant environment for distribution' 'plugin:Manage plugins' 'provision:Run the provisioner' 'reload:Reload the vagrant environment' 'resume:Resumes a suspend vagrant environment' + 'share:Shares the Vagrant environment and allows remote access' 'ssh:SSH into the currently running environment' - 'ssh-config:outputs .ssh/config valid syntax for connecting to this environment via ssh.' - 'status:Shows the status of the current Vagrant environment.' + 'ssh-config:outputs .ssh/config valid syntax for connecting to this environment via ssh' + 'status:Shows the status of the current Vagrant environment' 'suspend:Suspends the currently running vagrant environment' 'up:Creates the vagrant environment' - 'version:Prints the Vagrant version information' + 'version:Prints the currently installed Vagrant version and checks for new updates' + '--version:Prints the Vagrant version information' ) local -a _box_arguments @@ -59,32 +66,79 @@ _plugin_arguments=( __task_list () { local expl - local -a tasks + declare -a tasks - tasks=(box destroy global-status halt init package plugin provision reload resume ssh ssh_config status suspend up version) + tasks=(box destroy global-status halt init package plugin provision \ + reload resume ssh ssh_config status suspend up version) _wanted tasks expl 'help' compadd $tasks } __box_list () { - _wanted application expl 'command' compadd $(command ls -1 ${VAGRANT_HOME:-$HOME/.vagrant.d}/boxes 2>/dev/null| sed -e 's/ /\\ /g') + _wanted application expl 'command' compadd $(command vagrant box list | \ + awk '{print $1}' | \ + sed -e 's/ /\\ /g') } __plugin_list () { - _wanted application expl 'command' compadd $(command vagrant plugin list 2>/dev/null| cut -d' ' -f1) + _wanted application expl 'command' compadd $(command vagrant plugin list \ + 2>/dev/null| cut -d' ' -f1) +} + +_vagrant_caching_policy() +{ + local reg_time comp_time check_file + + case "${1##*/}" in + VAGRANT_VMS) + if [[ -z $VAGRANT_CWD ]]; then + check_file=./Vagrantfile + else + check_file=$VAGRANT_CWD/Vagrantfile + fi + ;; + *) + echo "unknown type: $1" + return -1 + ;; + esac + + case $(uname -s) in + Darwin) STATCMD="stat -f '%c'" ;; + *) STATCMD="stat -c '%Z'" ;; + esac + reg_time=${$(${(z)STATCMD} $check_file):Q} + comp_time=${$(${(z)STATCMD} $1):Q} + + return $(( reg_time < comp_time )) } __vm_list () { - _wanted application expl 'command' compadd $(command grep Vagrantfile -oe '^[^#]*\.vm\.define * ['\''":]\?\([a-zA-Z0-9\-_]\+\)['\''"]\?' 2>/dev/null | awk '{print $NF}' | sed 's/'\''//g'|sed 's/\"//g'|sed 's/^://' ) + local cache_policy + zstyle -s ":completion:${curcontext}:" cache-policy cache_policy + zstyle ":completion:${curcontext}:" cache-policy \ + ${cache_policy:-_vagrant_caching_policy} + + # Cache the list of VMs available + if ( [[ ${+_vagrant_vms} -eq 0 ]] || _cache_invalid VAGRANT_VMS ) && + ! _retrieve_cache VAGRANT_VMS; + then + _vagrant_vms=( $(_call_program path-all "vagrant status | \ + awk '{print \$1}' | \ + egrep -v '^$|^(Current|This|above|VM,)$'" ) ) + _store_cache VAGRANT_VMS _vagrant_vms + fi + + _wanted application expl 'command' compadd $_vagrant_vms } __vagrant-box () { local curcontext="$curcontext" state line - local -A opt_args + typeset -A opt_args _arguments -C \ ':command:->command' \ @@ -163,8 +217,8 @@ case $state in (plugin) __vagrant-plugin ;; - (up|provision|package|destroy|reload|ssh|halt|resume|status) - _arguments ':feature:__vm_list' + (up|provision|package|destroy|reload|ssh|halt|resume|status|suspend) + _arguments ':feature:__vm_list' esac ;; esac