summary refs log tree commit diff
diff options
context:
space:
mode:
authorMarko Myllynen <myllynen@redhat.com>2016-07-17 12:24:08 +0200
committerOliver Kiddle <opk@zsh.org>2016-07-17 12:24:08 +0200
commitccb45b320124d17f4a2594e85c80c970bb0259ef (patch)
tree920b821f2fa9e51b5fe64bb6e26b59e3201049cd
parentc32bb6a11c460faeaa9fafdb7b1f9cf3d6d10325 (diff)
downloadzsh-ccb45b320124d17f4a2594e85c80c970bb0259ef.tar.gz
zsh-ccb45b320124d17f4a2594e85c80c970bb0259ef.tar.xz
zsh-ccb45b320124d17f4a2594e85c80c970bb0259ef.zip
38837 (tweaked c.f. 38826): new virsh completion
-rw-r--r--ChangeLog3
-rw-r--r--Completion/Unix/Command/_libvirt55
2 files changed, 58 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index be387302c..4677025f6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2016-07-17  Oliver Kiddle  <opk@zsh.org>
 
+	* Marko Myllynen: 38837 (tweaked c.f. 38826):
+	Completion/Unix/Command/_libvirt: new virsh completion
+
 	* 38845: Src/Zle/zle_main.c, Doc/Zsh/zle.yo: reset region_active
 	before entering zle - it was on exit but before zle-line-finish
 	Also reword documentation on region to better cover vi mode
diff --git a/Completion/Unix/Command/_libvirt b/Completion/Unix/Command/_libvirt
new file mode 100644
index 000000000..a9249b31e
--- /dev/null
+++ b/Completion/Unix/Command/_libvirt
@@ -0,0 +1,55 @@
+#compdef virsh
+
+local curcontext="$curcontext" state line expl ret=1
+
+case $service in
+  virsh)
+    if (( ! $+_cache_virsh_cmds )); then
+      _cache_virsh_cmds=( ${${${${(f):-"$(_call_program options virsh help)"}:#*:}/# ##}/ *} )
+    fi
+    if (( ! $+_cache_virsh_cmdopts )); then
+      typeset -gA _cache_virsh_cmdopts
+    fi
+    _arguments -A "-*" -C -S -s -w \
+      '(- *)'{-h,--help}'[print help information and exit]' \
+      '(- *)'{-v,--version=short}'[print short version information and exit]' \
+      '(- *)'{-V,--version=long}'[print long version information and exit]' \
+      '(-c --connect)'{-c+,--connect}'[specify connection URI]:URI:_hosts' \
+      '(-d --debug)'{-d+,--debug}'[set debug level]:level:(0 1 2 3 4)' \
+      '(-e --escape)'{-e+,--escape}'[set escape sequence for console]:sequence' \
+      '(-k --keepalive-interval)'{-k+,--keepalive-interval}'[set keepalive interval]:interval' \
+      '(-K --keepalive-count)'{-K+,--keepalive-count}'[set keepalive count]:count' \
+      '(-l --log)'{-l+,--log}'[specify log file]:file:_files' \
+      '(-q --quiet)'{-q,--quiet}'[quiet mode]' \
+      '(-r --readonly)'{-r,--readonly}'[connect readonly]' \
+      '(-t --timing)'{-t,--timing}'[print timing information]' \
+      '1:command:->virsh_cmds' \
+      '*:cmdopt:->virsh_cmdopts' && return
+      # We accept only virsh command options after the first non-option argument
+      # (i.e., the virsh command itself), this makes it so with the -A "-*" above
+      [[ -z $state ]] && state=virsh_cmdopts
+  ;;
+esac
+
+case $state in
+  virsh_cmds)
+    _wanted commands expl 'virsh command' compadd -a _cache_virsh_cmds && ret=0
+  ;;
+  virsh_cmdopts)
+    local cmd
+    if [[ $words[-1] == /* || $words[-1] == ./* ]]; then
+      _default
+      return
+    fi
+    for (( i = 2; i <= $#words; i++ )); do
+      [[ -n "${_cache_virsh_cmds[(r)$words[$i]]}" ]] && cmd=$words[$i] && break
+    done
+    [[ -z $cmd ]] && return 1
+    if [[ -z $_cache_virsh_cmdopts[$cmd] ]]; then
+      _cache_virsh_cmdopts[$cmd]=${(M)${${${${=${(f)"$(_call_program virsh virsh help $cmd 2>&1)"}}/\[}/\]}/\;}:#-[-0-9A-Za-z]*}
+    fi
+    _values -w options ${=_cache_virsh_cmdopts[$cmd]} && ret=0
+  ;;
+esac
+
+return ret