aboutsummaryrefslogtreecommitdiff
path: root/templates
diff options
context:
space:
mode:
Diffstat (limited to 'templates')
-rwxr-xr-xtemplates/.bin/_docker3014
-rwxr-xr-xtemplates/.bin/_docker-compose455
-rwxr-xr-xtemplates/.bin/_jq77
-rwxr-xr-xtemplates/.bin/alacritty-fullscreen11
-rwxr-xr-xtemplates/.bin/brightness.sh11
-rwxr-xr-xtemplates/.bin/extract38
-rwxr-xr-xtemplates/.bin/files4
-rwxr-xr-xtemplates/.bin/get_battery23
-rwxr-xr-xtemplates/.bin/get_cpu7
-rwxr-xr-xtemplates/.bin/get_date3
-rwxr-xr-xtemplates/.bin/get_disk4
-rwxr-xr-xtemplates/.bin/get_essid35
-rwxr-xr-xtemplates/.bin/get_iface66
-rwxr-xr-xtemplates/.bin/get_memory45
-rwxr-xr-xtemplates/.bin/get_public_ip3
-rwxr-xr-xtemplates/.bin/get_volume36
-rwxr-xr-xtemplates/.bin/headers8
-rwxr-xr-xtemplates/.bin/launch-chrome7
-rwxr-xr-xtemplates/.bin/lsproc3
-rwxr-xr-xtemplates/.bin/mailsync57
-rwxr-xr-xtemplates/.bin/metar29
-rwxr-xr-xtemplates/.bin/mkaerc3
-rwxr-xr-xtemplates/.bin/mutt-notmuch-py157
-rwxr-xr-xtemplates/.bin/mvi84
-rwxr-xr-xtemplates/.bin/psqlenv7
-rwxr-xr-xtemplates/.bin/pwrman20
-rwxr-xr-xtemplates/.bin/randombg3
-rwxr-xr-xtemplates/.bin/randword6
-rwxr-xr-xtemplates/.bin/rev_dns7
-rwxr-xr-xtemplates/.bin/rfc3
-rwxr-xr-xtemplates/.bin/rot1318
-rwxr-xr-xtemplates/.bin/setbg.sh3
-rwxr-xr-xtemplates/.bin/taf11
33 files changed, 4258 insertions, 0 deletions
diff --git a/templates/.bin/_docker b/templates/.bin/_docker
new file mode 100755
index 0000000..4b0c1e2
--- /dev/null
+++ b/templates/.bin/_docker
@@ -0,0 +1,3014 @@
+#compdef docker dockerd
+#
+# zsh completion for docker (http://docker.com)
+#
+# version: 0.3.0
+# github: https://github.com/felixr/docker-zsh-completion
+#
+# contributors:
+# - Felix Riedel
+# - Steve Durrheimer
+# - Vincent Bernat
+#
+# license:
+#
+# Copyright (c) 2013, Felix Riedel
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# * Neither the name of the <organization> nor the
+# names of its contributors may be used to endorse or promote products
+# derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+# Short-option stacking can be enabled with:
+# zstyle ':completion:*:*:docker:*' option-stacking yes
+# zstyle ':completion:*:*:docker-*:*' option-stacking yes
+__docker_arguments() {
+ if zstyle -t ":completion:${curcontext}:" option-stacking; then
+ print -- -s
+ fi
+}
+
+__docker_get_containers() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ local kind type line s
+ declare -a running stopped lines args names
+
+ kind=$1; shift
+ type=$1; shift
+ [[ $kind = (stopped|all) ]] && args=($args -a)
+
+ lines=(${(f)${:-"$(_call_program commands docker $docker_options ps --format 'table' --no-trunc $args)"$'\n'}})
+
+ # Parse header line to find columns
+ local i=1 j=1 k header=${lines[1]}
+ declare -A begin end
+ while (( j < ${#header} - 1 )); do
+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
+ begin[${header[$i,$((j-1))]}]=$i
+ end[${header[$i,$((j-1))]}]=$k
+ done
+ end[${header[$i,$((j-1))]}]=-1 # Last column, should go to the end of the line
+ lines=(${lines[2,-1]})
+
+ # Container ID
+ if [[ $type = (ids|all) ]]; then
+ for line in $lines; do
+ s="${${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}[0,12]}"
+ s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}"
+ s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}"
+ if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = (Exit*|Created*) ]]; then
+ stopped=($stopped $s)
+ else
+ running=($running $s)
+ fi
+ done
+ fi
+
+ # Names: we only display the one without slash. All other names
+ # are generated and may clutter the completion. However, with
+ # Swarm, all names may be prefixed by the swarm node name.
+ if [[ $type = (names|all) ]]; then
+ for line in $lines; do
+ names=(${(ps:,:)${${line[${begin[NAMES]},${end[NAMES]}]}%% *}})
+ # First step: find a common prefix and strip it (swarm node case)
+ (( ${#${(u)names%%/*}} == 1 )) && names=${names#${names[1]%%/*}/}
+ # Second step: only keep the first name without a /
+ s=${${names:#*/*}[1]}
+ # If no name, well give up.
+ (( $#s != 0 )) || continue
+ s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}"
+ s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}"
+ if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = (Exit*|Created*) ]]; then
+ stopped=($stopped $s)
+ else
+ running=($running $s)
+ fi
+ done
+ fi
+
+ [[ $kind = (running|all) ]] && _describe -t containers-running "running containers" running "$@" && ret=0
+ [[ $kind = (stopped|all) ]] && _describe -t containers-stopped "stopped containers" stopped "$@" && ret=0
+ return ret
+}
+
+__docker_complete_stopped_containers() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_get_containers stopped all "$@"
+}
+
+__docker_complete_running_containers() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_get_containers running all "$@"
+}
+
+__docker_complete_containers() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_get_containers all all "$@"
+}
+
+__docker_complete_containers_ids() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_get_containers all ids "$@"
+}
+
+__docker_complete_containers_names() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_get_containers all names "$@"
+}
+
+__docker_complete_info_plugins() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ emulate -L zsh
+ setopt extendedglob
+ local -a plugins
+ plugins=(${(ps: :)${(M)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Plugins:}%%$'\n'^ *}}:# $1: *}## $1: })
+ _describe -t plugins "$1 plugins" plugins && ret=0
+ return ret
+}
+
+__docker_complete_images() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ declare -a images
+ images=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/(#b)([^ ]##) ##([^ ]##) ##([^ ]##)*/${match[3]}:${(r:15:: :::)match[2]} in ${match[1]}})
+ _describe -t docker-images "images" images && ret=0
+ __docker_complete_repositories_with_tags && ret=0
+ return ret
+}
+
+__docker_complete_repositories() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ declare -a repos
+ repos=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}%% *}[2,-1]})
+ repos=(${repos#<none>})
+ _describe -t docker-repos "repositories" repos && ret=0
+ return ret
+}
+
+__docker_complete_repositories_with_tags() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ declare -a repos onlyrepos matched
+ declare m
+ repos=(${${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/ ##/:::}%% *})
+ repos=(${${repos%:::<none>}#<none>})
+ # Check if we have a prefix-match for the current prefix.
+ onlyrepos=(${repos%::*})
+ for m in $onlyrepos; do
+ [[ ${PREFIX##${~~m}} != ${PREFIX} ]] && {
+ # Yes, complete with tags
+ repos=(${${repos/:::/:}/:/\\:})
+ _describe -t docker-repos-with-tags "repositories with tags" repos && ret=0
+ return ret
+ }
+ done
+ # No, only complete repositories
+ onlyrepos=(${${repos%:::*}/:/\\:})
+ _describe -t docker-repos "repositories" onlyrepos -qS : && ret=0
+
+ return ret
+}
+
+__docker_search() {
+ [[ $PREFIX = -* ]] && return 1
+ local cache_policy
+ zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
+ if [[ -z "$cache_policy" ]]; then
+ zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy
+ fi
+
+ local searchterm cachename
+ searchterm="${words[$CURRENT]%/}"
+ cachename=_docker-search-$searchterm
+
+ local expl
+ local -a result
+ if ( [[ ${(P)+cachename} -eq 0 ]] || _cache_invalid ${cachename#_} ) \
+ && ! _retrieve_cache ${cachename#_}; then
+ _message "Searching for ${searchterm}..."
+ result=(${${${(f)${:-"$(_call_program commands docker $docker_options search $searchterm)"$'\n'}}%% *}[2,-1]})
+ _store_cache ${cachename#_} result
+ fi
+ _wanted dockersearch expl 'available images' compadd -a result
+}
+
+__docker_get_log_options() {
+ [[ $PREFIX = -* ]] && return 1
+
+ integer ret=1
+ local log_driver=${opt_args[--log-driver]:-"all"}
+ local -a common_options awslogs_options fluentd_options gelf_options journald_options json_file_options logentries_options syslog_options splunk_options
+
+ common_options=("max-buffer-size" "mode")
+ awslogs_options=($common_options "awslogs-region" "awslogs-group" "awslogs-stream" "awslogs-create-group")
+ fluentd_options=($common_options "env" "fluentd-address" "fluentd-async-connect" "fluentd-buffer-limit" "fluentd-retry-wait" "fluentd-max-retries" "labels" "tag")
+ gcplogs_options=($common_options "env" "gcp-log-cmd" "gcp-project" "labels")
+ gelf_options=($common_options "env" "gelf-address" "gelf-compression-level" "gelf-compression-type" "labels" "tag")
+ journald_options=($common_options "env" "labels" "tag")
+ json_file_options=($common_options "env" "labels" "max-file" "max-size")
+ logentries_options=($common_options "logentries-token")
+ syslog_options=($common_options "env" "labels" "syslog-address" "syslog-facility" "syslog-format" "syslog-tls-ca-cert" "syslog-tls-cert" "syslog-tls-key" "syslog-tls-skip-verify" "tag")
+ splunk_options=($common_options "env" "labels" "splunk-caname" "splunk-capath" "splunk-format" "splunk-gzip" "splunk-gzip-level" "splunk-index" "splunk-insecureskipverify" "splunk-source" "splunk-sourcetype" "splunk-token" "splunk-url" "splunk-verify-connection" "tag")
+
+ [[ $log_driver = (awslogs|all) ]] && _describe -t awslogs-options "awslogs options" awslogs_options "$@" && ret=0
+ [[ $log_driver = (fluentd|all) ]] && _describe -t fluentd-options "fluentd options" fluentd_options "$@" && ret=0
+ [[ $log_driver = (gcplogs|all) ]] && _describe -t gcplogs-options "gcplogs options" gcplogs_options "$@" && ret=0
+ [[ $log_driver = (gelf|all) ]] && _describe -t gelf-options "gelf options" gelf_options "$@" && ret=0
+ [[ $log_driver = (journald|all) ]] && _describe -t journald-options "journald options" journald_options "$@" && ret=0
+ [[ $log_driver = (json-file|all) ]] && _describe -t json-file-options "json-file options" json_file_options "$@" && ret=0
+ [[ $log_driver = (logentries|all) ]] && _describe -t logentries-options "logentries options" logentries_options "$@" && ret=0
+ [[ $log_driver = (syslog|all) ]] && _describe -t syslog-options "syslog options" syslog_options "$@" && ret=0
+ [[ $log_driver = (splunk|all) ]] && _describe -t splunk-options "splunk options" splunk_options "$@" && ret=0
+
+ return ret
+}
+
+__docker_complete_log_drivers() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ drivers=(awslogs etwlogs fluentd gcplogs gelf journald json-file none splunk syslog)
+ _describe -t log-drivers "log drivers" drivers && ret=0
+ return ret
+}
+
+__docker_complete_log_options() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ (syslog-format)
+ local opts=('rfc3164' 'rfc5424' 'rfc5424micro')
+ _describe -t syslog-format-opts "syslog format options" opts && ret=0
+ ;;
+ (mode)
+ local opts=('blocking' 'non-blocking')
+ _describe -t mode-opts "mode options" opts && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ __docker_get_log_options -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_complete_detach_keys() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+
+ compset -P "*,"
+ keys=(${:-{a-z}})
+ ctrl_keys=(${:-ctrl-{{a-z},{@,'[','\\','^',']',_}}})
+ _describe -t detach_keys "[a-z]" keys -qS "," && ret=0
+ _describe -t detach_keys-ctrl "'ctrl-' + 'a-z @ [ \\\\ ] ^ _'" ctrl_keys -qS "," && ret=0
+}
+
+__docker_complete_pid() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ local -a opts vopts
+
+ opts=('host')
+ vopts=('container')
+
+ if compset -P '*:'; then
+ case "${${words[-1]%:*}#*=}" in
+ (container)
+ __docker_complete_running_containers && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ _describe -t pid-value-opts "PID Options with value" vopts -qS ":" && ret=0
+ _describe -t pid-opts "PID Options" opts && ret=0
+ fi
+
+ return ret
+}
+
+__docker_complete_runtimes() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+
+ emulate -L zsh
+ setopt extendedglob
+ local -a runtimes_opts
+ runtimes_opts=(${(ps: :)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Runtimes: }%%$'\n'^ *}}})
+ _describe -t runtimes-opts "runtimes options" runtimes_opts && ret=0
+}
+
+__docker_complete_ps_filters() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ (ancestor)
+ __docker_complete_images && ret=0
+ ;;
+ (before|since)
+ __docker_complete_containers && ret=0
+ ;;
+ (health)
+ health_opts=('healthy' 'none' 'starting' 'unhealthy')
+ _describe -t health-filter-opts "health filter options" health_opts && ret=0
+ ;;
+ (id)
+ __docker_complete_containers_ids && ret=0
+ ;;
+ (is-task)
+ _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0
+ ;;
+ (name)
+ __docker_complete_containers_names && ret=0
+ ;;
+ (network)
+ __docker_complete_networks && ret=0
+ ;;
+ (status)
+ status_opts=('created' 'dead' 'exited' 'paused' 'restarting' 'running' 'removing')
+ _describe -t status-filter-opts "status filter options" status_opts && ret=0
+ ;;
+ (volume)
+ __docker_complete_volumes && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ opts=('ancestor' 'before' 'exited' 'expose' 'health' 'id' 'label' 'name' 'network' 'publish' 'since' 'status' 'volume')
+ _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_complete_search_filters() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ declare -a boolean_opts opts
+
+ boolean_opts=('true' 'false')
+ opts=('is-automated' 'is-official' 'stars')
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ (is-automated|is-official)
+ _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_complete_images_filters() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ declare -a boolean_opts opts
+
+ boolean_opts=('true' 'false')
+ opts=('before' 'dangling' 'label' 'reference' 'since')
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ (before|reference|since)
+ __docker_complete_images && ret=0
+ ;;
+ (dangling)
+ _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_complete_events_filter() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ declare -a opts
+
+ opts=('container' 'daemon' 'event' 'image' 'label' 'network' 'type' 'volume')
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ (container)
+ __docker_complete_containers && ret=0
+ ;;
+ (daemon)
+ emulate -L zsh
+ setopt extendedglob
+ local -a daemon_opts
+ daemon_opts=(
+ ${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Name: }%%$'\n'^ *}}
+ ${${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'ID: }%%$'\n'^ *}}//:/\\:}
+ )
+ _describe -t daemon-filter-opts "daemon filter options" daemon_opts && ret=0
+ ;;
+ (event)
+ local -a event_opts
+ event_opts=('attach' 'commit' 'connect' 'copy' 'create' 'delete' 'destroy' 'detach' 'die' 'disconnect' 'exec_create' 'exec_detach'
+ 'exec_start' 'export' 'health_status' 'import' 'kill' 'load' 'mount' 'oom' 'pause' 'pull' 'push' 'reload' 'rename' 'resize' 'restart' 'save' 'start'
+ 'stop' 'tag' 'top' 'unmount' 'unpause' 'untag' 'update')
+ _describe -t event-filter-opts "event filter options" event_opts && ret=0
+ ;;
+ (image)
+ __docker_complete_images && ret=0
+ ;;
+ (network)
+ __docker_complete_networks && ret=0
+ ;;
+ (type)
+ local -a type_opts
+ type_opts=('container' 'daemon' 'image' 'network' 'volume')
+ _describe -t type-filter-opts "type filter options" type_opts && ret=0
+ ;;
+ (volume)
+ __docker_complete_volumes && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_complete_prune_filters() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ declare -a opts
+
+ opts=('until')
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+# BO checkpoint
+
+__docker_checkpoint_commands() {
+ local -a _docker_checkpoint_subcommands
+ _docker_checkpoint_subcommands=(
+ "create:Create a checkpoint from a running container"
+ "ls:List checkpoints for a container"
+ "rm:Remove a checkpoint"
+ )
+ _describe -t docker-checkpoint-commands "docker checkpoint command" _docker_checkpoint_subcommands
+}
+
+__docker_checkpoint_subcommand() {
+ local -a _command_args opts_help
+ local expl help="--help"
+ integer ret=1
+
+ opts_help=("(: -)--help[Print usage]")
+
+ case "$words[1]" in
+ (create)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \
+ "($help)--leave-running[Leave the container running after checkpoint]" \
+ "($help -)1:container:__docker_complete_running_containers" \
+ "($help -)2:checkpoint: " && ret=0
+ ;;
+ (ls|list)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \
+ "($help -)1:container:__docker_complete_containers" && ret=0
+ ;;
+ (rm|remove)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \
+ "($help -)1:container:__docker_complete_containers" \
+ "($help -)2:checkpoint: " && ret=0
+ ;;
+ (help)
+ _arguments $(__docker_arguments) ":subcommand:__docker_checkpoint_commands" && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+# EO checkpoint
+
+# BO container
+
+__docker_container_commands() {
+ local -a _docker_container_subcommands
+ _docker_container_subcommands=(
+ "attach:Attach to a running container"
+ "commit:Create a new image from a container's changes"
+ "cp:Copy files/folders between a container and the local filesystem"
+ "create:Create a new container"
+ "diff:Inspect changes on a container's filesystem"
+ "exec:Run a command in a running container"
+ "export:Export a container's filesystem as a tar archive"
+ "inspect:Display detailed information on one or more containers"
+ "kill:Kill one or more running containers"
+ "logs:Fetch the logs of a container"
+ "ls:List containers"
+ "pause:Pause all processes within one or more containers"
+ "port:List port mappings or a specific mapping for the container"
+ "prune:Remove all stopped containers"
+ "rename:Rename a container"
+ "restart:Restart one or more containers"
+ "rm:Remove one or more containers"
+ "run:Run a command in a new container"
+ "start:Start one or more stopped containers"
+ "stats:Display a live stream of container(s) resource usage statistics"
+ "stop:Stop one or more running containers"
+ "top:Display the running processes of a container"
+ "unpause:Unpause all processes within one or more containers"
+ "update:Update configuration of one or more containers"
+ "wait:Block until one or more containers stop, then print their exit codes"
+ )
+ _describe -t docker-container-commands "docker container command" _docker_container_subcommands
+}
+
+__docker_container_subcommand() {
+ local -a _command_args opts_help opts_attach_exec_run_start opts_create_run opts_create_run_update
+ local expl help="--help"
+ integer ret=1
+
+ opts_attach_exec_run_start=(
+ "($help)--detach-keys=[Escape key sequence used to detach a container]:sequence:__docker_complete_detach_keys"
+ )
+ opts_create_run=(
+ "($help -a --attach)"{-a=,--attach=}"[Attach to stdin, stdout or stderr]:device:(STDIN STDOUT STDERR)"
+ "($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: "
+ "($help)*--blkio-weight-device=[Block IO (relative device weight)]:device:Block IO weight: "
+ "($help)*--cap-add=[Add Linux capabilities]:capability: "
+ "($help)*--cap-drop=[Drop Linux capabilities]:capability: "
+ "($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: "
+ "($help)--cidfile=[Write the container ID to the file]:CID file:_files"
+ "($help)--cpus=[Number of CPUs (default 0.000)]:cpus: "
+ "($help)*--device=[Add a host device to the container]:device:_files"
+ "($help)*--device-cgroup-rule=[Add a rule to the cgroup allowed devices list]:device:cgroup: "
+ "($help)*--device-read-bps=[Limit the read rate (bytes per second) from a device]:device:IO rate: "
+ "($help)*--device-read-iops=[Limit the read rate (IO per second) from a device]:device:IO rate: "
+ "($help)*--device-write-bps=[Limit the write rate (bytes per second) to a device]:device:IO rate: "
+ "($help)*--device-write-iops=[Limit the write rate (IO per second) to a device]:device:IO rate: "
+ "($help)--disable-content-trust[Skip image verification]"
+ "($help)*--dns=[Custom DNS servers]:DNS server: "
+ "($help)*--dns-option=[Custom DNS options]:DNS option: "
+ "($help)*--dns-search=[Custom DNS search domains]:DNS domains: "
+ "($help)*"{-e=,--env=}"[Environment variables]:environment variable: "
+ "($help)--entrypoint=[Overwrite the default entrypoint of the image]:entry point: "
+ "($help)*--env-file=[Read environment variables from a file]:environment file:_files"
+ "($help)*--expose=[Expose a port from the container without publishing it]: "
+ "($help)*--group=[Set one or more supplementary user groups for the container]:group:_groups"
+ "($help -h --hostname)"{-h=,--hostname=}"[Container host name]:hostname:_hosts"
+ "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]"
+ "($help)--init[Run an init inside the container that forwards signals and reaps processes]"
+ "($help)--ip=[IPv4 address]:IPv4: "
+ "($help)--ip6=[IPv6 address]:IPv6: "
+ "($help)--ipc=[IPC namespace to use]:IPC namespace: "
+ "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)"
+ "($help)*--link=[Add link to another container]:link:->link"
+ "($help)*--link-local-ip=[Container IPv4/IPv6 link-local addresses]:IPv4/IPv6: "
+ "($help)*"{-l=,--label=}"[Container metadata]:label: "
+ "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers"
+ "($help)*--log-opt=[Log driver specific options]:log driver options:__docker_complete_log_options"
+ "($help)--mac-address=[Container MAC address]:MAC address: "
+ "($help)*--mount=[Attach a filesystem mount to the container]:mount: "
+ "($help)--name=[Container name]:name: "
+ "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)"
+ "($help)*--network-alias=[Add network-scoped alias for the container]:alias: "
+ "($help)--oom-kill-disable[Disable OOM Killer]"
+ "($help)--oom-score-adj[Tune the host's OOM preferences for containers (accepts -1000 to 1000)]"
+ "($help)--pids-limit[Tune container pids limit (set -1 for unlimited)]"
+ "($help -P --publish-all)"{-P,--publish-all}"[Publish all exposed ports]"
+ "($help)*"{-p=,--publish=}"[Expose a container's port to the host]:port:_ports"
+ "($help)--pid=[PID namespace to use]:PID namespace:__docker_complete_pid"
+ "($help)--privileged[Give extended privileges to this container]"
+ "($help)--read-only[Mount the container's root filesystem as read only]"
+ "($help)*--security-opt=[Security options]:security option: "
+ "($help)*--shm-size=[Size of '/dev/shm' (format is '<number><unit>')]:shm size: "
+ "($help)--stop-signal=[Signal to kill a container]:signal:_signals"
+ "($help)--stop-timeout=[Timeout (in seconds) to stop a container]:time: "
+ "($help)*--sysctl=-[sysctl options]:sysctl: "
+ "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]"
+ "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users"
+ "($help)*--ulimit=[ulimit options]:ulimit: "
+ "($help)--userns=[Container user namespace]:user namespace:(host)"
+ "($help)--tmpfs[mount tmpfs]"
+ "($help)*-v[Bind mount a volume]:volume: "
+ "($help)--volume-driver=[Optional volume driver for the container]:volume driver:(local)"
+ "($help)*--volumes-from=[Mount volumes from the specified container]:volume: "
+ "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories"
+ )
+ opts_create_run_update=(
+ "($help)--blkio-weight=[Block IO (relative weight), between 10 and 1000]:Block IO weight:(10 100 500 1000)"
+ "($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)"
+ "($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: "
+ "($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: "
+ "($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: "
+ "($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: "
+ "($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: "
+ "($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: "
+ "($help)--kernel-memory=[Kernel memory limit in bytes]:Memory limit: "
+ "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: "
+ "($help)--memory-reservation=[Memory soft limit]:Memory limit: "
+ "($help)--memory-swap=[Total memory limit with swap]:Memory limit: "
+ "($help)--restart=[Restart policy]:restart policy:(no on-failure always unless-stopped)"
+ )
+ opts_help=("(: -)--help[Print usage]")
+
+ case "$words[1]" in
+ (attach)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ $opts_attach_exec_run_start \
+ "($help)--no-stdin[Do not attach stdin]" \
+ "($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \
+ "($help -):containers:__docker_complete_running_containers" && ret=0
+ ;;
+ (commit)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -a --author)"{-a=,--author=}"[Author]:author: " \
+ "($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \
+ "($help -m --message)"{-m=,--message=}"[Commit message]:message: " \
+ "($help -p --pause)"{-p,--pause}"[Pause container during commit]" \
+ "($help -):container:__docker_complete_containers" \
+ "($help -): :__docker_complete_repositories_with_tags" && ret=0
+ ;;
+ (cp)
+ local state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -L --follow-link)"{-L,--follow-link}"[Always follow symbol link]" \
+ "($help -)1:container:->container" \
+ "($help -)2:hostpath:_files" && ret=0
+ case $state in
+ (container)
+ if compset -P "*:"; then
+ _files && ret=0
+ else
+ __docker_complete_containers -qS ":" && ret=0
+ fi
+ ;;
+ esac
+ ;;
+ (create)
+ local state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ $opts_create_run \
+ $opts_create_run_update \
+ "($help -): :__docker_complete_images" \
+ "($help -):command: _command_names -e" \
+ "($help -)*::arguments: _normal" && ret=0
+ case $state in
+ (link)
+ if compset -P "*:"; then
+ _wanted alias expl "Alias" compadd -E "" && ret=0
+ else
+ __docker_complete_running_containers -qS ":" && ret=0
+ fi
+ ;;
+ esac
+ ;;
+ (diff)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)*:containers:__docker_complete_containers" && ret=0
+ ;;
+ (exec)
+ local state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ $opts_attach_exec_run_start \
+ "($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \
+ "($help)*"{-e=,--env=}"[Set environment variables]:environment variable: " \
+ "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]" \
+ "($help)--privileged[Give extended Linux capabilities to the command]" \
+ "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]" \
+ "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" \
+ "($help -):containers:__docker_complete_running_containers" \
+ "($help -)*::command:->anycommand" && ret=0
+ case $state in
+ (anycommand)
+ shift 1 words
+ (( CURRENT-- ))
+ _normal && ret=0
+ ;;
+ esac
+ ;;
+ (export)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -o --output)"{-o=,--output=}"[Write to a file, instead of stdout]:output file:_files" \
+ "($help -)*:containers:__docker_complete_containers" && ret=0
+ ;;
+ (inspect)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
+ "($help -s --size)"{-s,--size}"[Display total file sizes]" \
+ "($help -)*:containers:__docker_complete_containers" && ret=0
+ ;;
+ (kill)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -s --signal)"{-s=,--signal=}"[Signal to send]:signal:_signals" \
+ "($help -)*:containers:__docker_complete_running_containers" && ret=0
+ ;;
+ (logs)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--details[Show extra details provided to logs]" \
+ "($help -f --follow)"{-f,--follow}"[Follow log output]" \
+ "($help -s --since)"{-s=,--since=}"[Show logs since this timestamp]:timestamp: " \
+ "($help -t --timestamps)"{-t,--timestamps}"[Show timestamps]" \
+ "($help)--tail=[Output the last K lines]:lines:(1 10 20 50 all)" \
+ "($help -)*:containers:__docker_complete_containers" && ret=0
+ ;;
+ (ls|list)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -a --all)"{-a,--all}"[Show all containers]" \
+ "($help)--before=[Show only container created before...]:containers:__docker_complete_containers" \
+ "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_ps_filters" \
+ "($help)--format=[Pretty-print containers using a Go template]:template: " \
+ "($help -l --latest)"{-l,--latest}"[Show only the latest created container]" \
+ "($help -n --last)"{-n=,--last=}"[Show n last created containers (includes all states)]:n:(1 5 10 25 50)" \
+ "($help)--no-trunc[Do not truncate output]" \
+ "($help -q --quiet)"{-q,--quiet}"[Only show numeric IDs]" \
+ "($help -s --size)"{-s,--size}"[Display total file sizes]" \
+ "($help)--since=[Show only containers created since...]:containers:__docker_complete_containers" && ret=0
+ ;;
+ (pause|unpause)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)*:containers:__docker_complete_running_containers" && ret=0
+ ;;
+ (port)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)1:containers:__docker_complete_running_containers" \
+ "($help -)2:port:_ports" && ret=0
+ ;;
+ (prune)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
+ "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0
+ ;;
+ (rename)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -):old name:__docker_complete_containers" \
+ "($help -):new name: " && ret=0
+ ;;
+ (restart)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \
+ "($help -)*:containers:__docker_complete_containers_ids" && ret=0
+ ;;
+ (rm)
+ local state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --force)"{-f,--force}"[Force removal]" \
+ "($help -l --link)"{-l,--link}"[Remove the specified link and not the underlying container]" \
+ "($help -v --volumes)"{-v,--volumes}"[Remove the volumes associated to the container]" \
+ "($help -)*:containers:->values" && ret=0
+ case $state in
+ (values)
+ if [[ ${words[(r)-f]} == -f || ${words[(r)--force]} == --force ]]; then
+ __docker_complete_containers && ret=0
+ else
+ __docker_complete_stopped_containers && ret=0
+ fi
+ ;;
+ esac
+ ;;
+ (run)
+ local state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ $opts_create_run \
+ $opts_create_run_update \
+ $opts_attach_exec_run_start \
+ "($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \
+ "($help)--health-cmd=[Command to run to check health]:command: " \
+ "($help)--health-interval=[Time between running the check]:time: " \
+ "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" \
+ "($help)--health-timeout=[Maximum time to allow one check to run]:time: " \
+ "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" \
+ "($help)--rm[Remove intermediate containers when it exits]" \
+ "($help)--runtime=[Name of the runtime to be used for that container]:runtime:__docker_complete_runtimes" \
+ "($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \
+ "($help)--storage-opt=[Storage driver options for the container]:storage options:->storage-opt" \
+ "($help -): :__docker_complete_images" \
+ "($help -):command: _command_names -e" \
+ "($help -)*::arguments: _normal" && ret=0
+ case $state in
+ (link)
+ if compset -P "*:"; then
+ _wanted alias expl "Alias" compadd -E "" && ret=0
+ else
+ __docker_complete_running_containers -qS ":" && ret=0
+ fi
+ ;;
+ (storage-opt)
+ if compset -P "*="; then
+ _message "value" && ret=0
+ else
+ opts=('size')
+ _describe -t filter-opts "storage options" opts -qS "=" && ret=0
+ fi
+ ;;
+ esac
+ ;;
+ (start)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ $opts_attach_exec_run_start \
+ "($help -a --attach)"{-a,--attach}"[Attach container's stdout/stderr and forward all signals]" \
+ "($help -i --interactive)"{-i,--interactive}"[Attach container's stding]" \
+ "($help -)*:containers:__docker_complete_stopped_containers" && ret=0
+ ;;
+ (stats)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -a --all)"{-a,--all}"[Show all containers (default shows just running)]" \
+ "($help)--format=[Pretty-print images using a Go template]:template: " \
+ "($help)--no-stream[Disable streaming stats and only pull the first result]" \
+ "($help -)*:containers:__docker_complete_running_containers" && ret=0
+ ;;
+ (stop)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \
+ "($help -)*:containers:__docker_complete_running_containers" && ret=0
+ ;;
+ (top)
+ local state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)1:containers:__docker_complete_running_containers" \
+ "($help -)*:: :->ps-arguments" && ret=0
+ case $state in
+ (ps-arguments)
+ _ps && ret=0
+ ;;
+ esac
+ ;;
+ (update)
+ local state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ opts_create_run_update \
+ "($help -)*: :->values" && ret=0
+ case $state in
+ (values)
+ if [[ ${words[(r)--kernel-memory*]} = (--kernel-memory*) ]]; then
+ __docker_complete_stopped_containers && ret=0
+ else
+ __docker_complete_containers && ret=0
+ fi
+ ;;
+ esac
+ ;;
+ (wait)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)*:containers:__docker_complete_running_containers" && ret=0
+ ;;
+ (help)
+ _arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+# EO container
+
+# BO image
+
+__docker_image_commands() {
+ local -a _docker_image_subcommands
+ _docker_image_subcommands=(
+ "build:Build an image from a Dockerfile"
+ "history:Show the history of an image"
+ "import:Import the contents from a tarball to create a filesystem image"
+ "inspect:Display detailed information on one or more images"
+ "load:Load an image from a tar archive or STDIN"
+ "ls:List images"
+ "prune:Remove unused images"
+ "pull:Pull an image or a repository from a registry"
+ "push:Push an image or a repository to a registry"
+ "rm:Remove one or more images"
+ "save:Save one or more images to a tar archive (streamed to STDOUT by default)"
+ "tag:Tag an image into a repository"
+ )
+ _describe -t docker-image-commands "docker image command" _docker_image_subcommands
+}
+
+__docker_image_subcommand() {
+ local -a _command_args opts_help
+ local expl help="--help"
+ integer ret=1
+
+ opts_help=("(: -)--help[Print usage]")
+
+ case "$words[1]" in
+ (build)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: " \
+ "($help)*--build-arg=[Build-time variables]:<varname>=<value>: " \
+ "($help)*--cache-from=[Images to consider as cache sources]: :__docker_complete_repositories_with_tags" \
+ "($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)" \
+ "($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: " \
+ "($help)--compress[Compress the build context using gzip]" \
+ "($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: " \
+ "($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: " \
+ "($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: " \
+ "($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: " \
+ "($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: " \
+ "($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: " \
+ "($help)--disable-content-trust[Skip image verification]" \
+ "($help -f --file)"{-f=,--file=}"[Name of the Dockerfile]:Dockerfile:_files" \
+ "($help)--force-rm[Always remove intermediate containers]" \
+ "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)" \
+ "($help)*--label=[Set metadata for an image]:label=value: " \
+ "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: " \
+ "($help)--memory-swap=[Total memory limit with swap]:Memory limit: " \
+ "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" \
+ "($help)--no-cache[Do not use cache when building the image]" \
+ "($help)--pull[Attempt to pull a newer version of the image]" \
+ "($help -q --quiet)"{-q,--quiet}"[Suppress verbose build output]" \
+ "($help)--rm[Remove intermediate containers after a successful build]" \
+ "($help)*--shm-size=[Size of '/dev/shm' (format is '<number><unit>')]:shm size: " \
+ "($help)--squash[Squash newly built layers into a single new layer]" \
+ "($help -t --tag)*"{-t=,--tag=}"[Repository, name and tag for the image]: :__docker_complete_repositories_with_tags" \
+ "($help)*--ulimit=[ulimit options]:ulimit: " \
+ "($help)--userns=[Container user namespace]:user namespace:(host)" \
+ "($help -):path or URL:_directories" && ret=0
+ ;;
+ (history)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -H --human)"{-H,--human}"[Print sizes and dates in human readable format]" \
+ "($help)--no-trunc[Do not truncate output]" \
+ "($help -q --quiet)"{-q,--quiet}"[Only show numeric IDs]" \
+ "($help -)*: :__docker_complete_images" && ret=0
+ ;;
+ (import)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \
+ "($help -m --message)"{-m=,--message=}"[Commit message for imported image]:message: " \
+ "($help -):URL:(- http:// file://)" \
+ "($help -): :__docker_complete_repositories_with_tags" && ret=0
+ ;;
+ (inspect)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
+ "($help -)*:images:__docker_complete_images" && ret=0
+ ;;
+ (load)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -i --input)"{-i=,--input=}"[Read from tar archive file]:archive file:_files -g \"*.((tar|TAR)(.gz|.GZ|.Z|.bz2|.lzma|.xz|)|(tbz|tgz|txz))(-.)\"" \
+ "($help -q --quiet)"{-q,--quiet}"[Suppress the load output]" && ret=0
+ ;;
+ (ls|list)
+ local state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -a --all)"{-a,--all}"[Show all images]" \
+ "($help)--digests[Show digests]" \
+ "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_images_filters" \
+ "($help)--format=[Pretty-print images using a Go template]:template: " \
+ "($help)--no-trunc[Do not truncate output]" \
+ "($help -q --quiet)"{-q,--quiet}"[Only show numeric IDs]" \
+ "($help -): :__docker_complete_repositories" && ret=0
+ ;;
+ (prune)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -a --all)"{-a,--all}"[Remove all unused images, not just dangling ones]" \
+ "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
+ "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0
+ ;;
+ (pull)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -a --all-tags)"{-a,--all-tags}"[Download all tagged images]" \
+ "($help)--disable-content-trust[Skip image verification]" \
+ "($help -):name:__docker_search" && ret=0
+ ;;
+ (push)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--disable-content-trust[Skip image signing]" \
+ "($help -): :__docker_complete_images" && ret=0
+ ;;
+ (rm)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --force)"{-f,--force}"[Force removal]" \
+ "($help)--no-prune[Do not delete untagged parents]" \
+ "($help -)*: :__docker_complete_images" && ret=0
+ ;;
+ (save)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -o --output)"{-o=,--output=}"[Write to file]:file:_files" \
+ "($help -)*: :__docker_complete_images" && ret=0
+ ;;
+ (tag)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -):source:__docker_complete_images"\
+ "($help -):destination:__docker_complete_repositories_with_tags" && ret=0
+ ;;
+ (help)
+ _arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+# EO image
+
+# BO network
+
+__docker_network_complete_ls_filters() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ (driver)
+ __docker_complete_info_plugins Network && ret=0
+ ;;
+ (id)
+ __docker_complete_networks_ids && ret=0
+ ;;
+ (name)
+ __docker_complete_networks_names && ret=0
+ ;;
+ (scope)
+ opts=('global' 'local' 'swarm')
+ _describe -t scope-filter-opts "Scope filter options" opts && ret=0
+ ;;
+ (type)
+ opts=('builtin' 'custom')
+ _describe -t type-filter-opts "Type filter options" opts && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ opts=('driver' 'id' 'label' 'name' 'scope' 'type')
+ _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_get_networks() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ local line s
+ declare -a lines networks
+
+ type=$1; shift
+
+ lines=(${(f)${:-"$(_call_program commands docker $docker_options network ls)"$'\n'}})
+
+ # Parse header line to find columns
+ local i=1 j=1 k header=${lines[1]}
+ declare -A begin end
+ while (( j < ${#header} - 1 )); do
+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
+ begin[${header[$i,$((j-1))]}]=$i
+ end[${header[$i,$((j-1))]}]=$k
+ done
+ end[${header[$i,$((j-1))]}]=-1
+ lines=(${lines[2,-1]})
+
+ # Network ID
+ if [[ $type = (ids|all) ]]; then
+ for line in $lines; do
+ s="${line[${begin[NETWORK ID]},${end[NETWORK ID]}]%% ##}"
+ s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}"
+ s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}"
+ networks=($networks $s)
+ done
+ fi
+
+ # Names
+ if [[ $type = (names|all) ]]; then
+ for line in $lines; do
+ s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
+ s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}"
+ s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}"
+ networks=($networks $s)
+ done
+ fi
+
+ _describe -t networks-list "networks" networks "$@" && ret=0
+ return ret
+}
+
+__docker_complete_networks() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_get_networks all "$@"
+}
+
+__docker_complete_networks_ids() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_get_networks ids "$@"
+}
+
+__docker_complete_networks_names() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_get_networks names "$@"
+}
+
+__docker_network_commands() {
+ local -a _docker_network_subcommands
+ _docker_network_subcommands=(
+ "connect:Connect a container to a network"
+ "create:Creates a new network with a name specified by the user"
+ "disconnect:Disconnects a container from a network"
+ "inspect:Displays detailed information on a network"
+ "ls:Lists all the networks created by the user"
+ "prune:Remove all unused networks"
+ "rm:Deletes one or more networks"
+ )
+ _describe -t docker-network-commands "docker network command" _docker_network_subcommands
+}
+
+__docker_network_subcommand() {
+ local -a _command_args opts_help
+ local expl help="--help"
+ integer ret=1
+
+ opts_help=("(: -)--help[Print usage]")
+
+ case "$words[1]" in
+ (connect)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)*--alias=[Add network-scoped alias for the container]:alias: " \
+ "($help)--ip=[IPv4 address]:IPv4: " \
+ "($help)--ip6=[IPv6 address]:IPv6: " \
+ "($help)*--link=[Add a link to another container]:link:->link" \
+ "($help)*--link-local-ip=[Add a link-local address for the container]:IPv4/IPv6: " \
+ "($help -)1:network:__docker_complete_networks" \
+ "($help -)2:containers:__docker_complete_containers" && ret=0
+
+ case $state in
+ (link)
+ if compset -P "*:"; then
+ _wanted alias expl "Alias" compadd -E "" && ret=0
+ else
+ __docker_complete_running_containers -qS ":" && ret=0
+ fi
+ ;;
+ esac
+ ;;
+ (create)
+ _arguments $(__docker_arguments) -A '-*' \
+ $opts_help \
+ "($help)--attachable[Enable manual container attachment]" \
+ "($help)*--aux-address[Auxiliary IPv4 or IPv6 addresses used by network driver]:key=IP: " \
+ "($help -d --driver)"{-d=,--driver=}"[Driver to manage the Network]:driver:(null host bridge overlay)" \
+ "($help)*--gateway=[IPv4 or IPv6 Gateway for the master subnet]:IP: " \
+ "($help)--internal[Restricts external access to the network]" \
+ "($help)*--ip-range=[Allocate container ip from a sub-range]:IP/mask: " \
+ "($help)--ipam-driver=[IP Address Management Driver]:driver:(default)" \
+ "($help)*--ipam-opt=[Custom IPAM plugin options]:opt=value: " \
+ "($help)--ipv6[Enable IPv6 networking]" \
+ "($help)*--label=[Set metadata on a network]:label=value: " \
+ "($help)*"{-o=,--opt=}"[Driver specific options]:opt=value: " \
+ "($help)*--subnet=[Subnet in CIDR format that represents a network segment]:IP/mask: " \
+ "($help -)1:Network Name: " && ret=0
+ ;;
+ (disconnect)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)1:network:__docker_complete_networks" \
+ "($help -)2:containers:__docker_complete_containers" && ret=0
+ ;;
+ (inspect)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
+ "($help)--verbose[Show detailed information]" \
+ "($help -)*:network:__docker_complete_networks" && ret=0
+ ;;
+ (ls)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--no-trunc[Do not truncate the output]" \
+ "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_network_complete_ls_filters" \
+ "($help)--format=[Pretty-print networks using a Go template]:template: " \
+ "($help -q --quiet)"{-q,--quiet}"[Only display numeric IDs]" && ret=0
+ ;;
+ (prune)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
+ "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0
+ ;;
+ (rm)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)*:network:__docker_complete_networks" && ret=0
+ ;;
+ (help)
+ _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+# EO network
+
+# BO node
+
+__docker_node_complete_ls_filters() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ (id)
+ __docker_complete_nodes_ids && ret=0
+ ;;
+ (membership)
+ membership_opts=('accepted' 'pending' 'rejected')
+ _describe -t membership-opts "membership options" membership_opts && ret=0
+ ;;
+ (name)
+ __docker_complete_nodes_names && ret=0
+ ;;
+ (role)
+ role_opts=('manager' 'worker')
+ _describe -t role-opts "role options" role_opts && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ opts=('id' 'label' 'membership' 'name' 'role')
+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_node_complete_ps_filters() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ (desired-state)
+ state_opts=('accepted' 'running' 'shutdown')
+ _describe -t state-opts "desired state options" state_opts && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ opts=('desired-state' 'id' 'label' 'name')
+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_nodes() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ local line s
+ declare -a lines nodes args
+
+ type=$1; shift
+ filter=$1; shift
+ [[ $filter != "none" ]] && args=("-f $filter")
+
+ lines=(${(f)${:-"$(_call_program commands docker $docker_options node ls $args)"$'\n'}})
+ # Parse header line to find columns
+ local i=1 j=1 k header=${lines[1]}
+ declare -A begin end
+ while (( j < ${#header} - 1 )); do
+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
+ begin[${header[$i,$((j-1))]}]=$i
+ end[${header[$i,$((j-1))]}]=$k
+ done
+ end[${header[$i,$((j-1))]}]=-1
+ lines=(${lines[2,-1]})
+
+ # Node ID
+ if [[ $type = (ids|all) ]]; then
+ for line in $lines; do
+ s="${line[${begin[ID]},${end[ID]}]%% ##}"
+ nodes=($nodes $s)
+ done
+ fi
+
+ # Names
+ if [[ $type = (names|all) ]]; then
+ for line in $lines; do
+ s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
+ nodes=($nodes $s)
+ done
+ fi
+
+ _describe -t nodes-list "nodes" nodes "$@" && ret=0
+ return ret
+}
+
+__docker_complete_nodes() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_nodes all none "$@"
+}
+
+__docker_complete_nodes_ids() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_nodes ids none "$@"
+}
+
+__docker_complete_nodes_names() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_nodes names none "$@"
+}
+
+__docker_complete_pending_nodes() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_nodes all "membership=pending" "$@"
+}
+
+__docker_complete_manager_nodes() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_nodes all "role=manager" "$@"
+}
+
+__docker_complete_worker_nodes() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_nodes all "role=worker" "$@"
+}
+
+__docker_node_commands() {
+ local -a _docker_node_subcommands
+ _docker_node_subcommands=(
+ "demote:Demote a node as manager in the swarm"
+ "inspect:Display detailed information on one or more nodes"
+ "ls:List nodes in the swarm"
+ "promote:Promote a node as manager in the swarm"
+ "rm:Remove one or more nodes from the swarm"
+ "ps:List tasks running on one or more nodes, defaults to current node"
+ "update:Update a node"
+ )
+ _describe -t docker-node-commands "docker node command" _docker_node_subcommands
+}
+
+__docker_node_subcommand() {
+ local -a _command_args opts_help
+ local expl help="--help"
+ integer ret=1
+
+ opts_help=("(: -)--help[Print usage]")
+
+ case "$words[1]" in
+ (rm|remove)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --force)"{-f,--force}"[Force remove a node from the swarm]" \
+ "($help -)*:node:__docker_complete_pending_nodes" && ret=0
+ ;;
+ (demote)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)*:node:__docker_complete_manager_nodes" && ret=0
+ ;;
+ (inspect)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
+ "($help)--pretty[Print the information in a human friendly format]" \
+ "($help -)*:node:__docker_complete_nodes" && ret=0
+ ;;
+ (ls|list)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_node_complete_ls_filters" \
+ "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
+ ;;
+ (promote)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)*:node:__docker_complete_worker_nodes" && ret=0
+ ;;
+ (ps)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -a --all)"{-a,--all}"[Display all instances]" \
+ "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_node_complete_ps_filters" \
+ "($help)--format=[Format the output using the given go template]:template: " \
+ "($help)--no-resolve[Do not map IDs to Names]" \
+ "($help)--no-trunc[Do not truncate output]" \
+ "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \
+ "($help -)*:node:__docker_complete_nodes" && ret=0
+ ;;
+ (update)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--availability=[Availability of the node]:availability:(active pause drain)" \
+ "($help)*--label-add=[Add or update a node label]:key=value: " \
+ "($help)*--label-rm=[Remove a node label if exists]:label: " \
+ "($help)--role=[Role of the node]:role:(manager worker)" \
+ "($help -)1:node:__docker_complete_nodes" && ret=0
+ ;;
+ (help)
+ _arguments $(__docker_arguments) ":subcommand:__docker_node_commands" && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+# EO node
+
+# BO plugin
+
+__docker_plugin_complete_ls_filters() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ (capability)
+ opts=('authz' 'ipamdriver' 'networkdriver' 'volumedriver')
+ _describe -t capability-opts "capability options" opts && ret=0
+ ;;
+ (enabled)
+ opts=('false' 'true')
+ _describe -t enabled-opts "enabled options" opts && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ opts=('capability' 'enabled')
+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_plugins() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ local line s
+ declare -a lines plugins args
+
+ filter=$1; shift
+ [[ $filter != "none" ]] && args=("-f $filter")
+
+ lines=(${(f)${:-"$(_call_program commands docker $docker_options plugin ls $args)"$'\n'}})
+
+ # Parse header line to find columns
+ local i=1 j=1 k header=${lines[1]}
+ declare -A begin end
+ while (( j < ${#header} - 1 )); do
+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
+ begin[${header[$i,$((j-1))]}]=$i
+ end[${header[$i,$((j-1))]}]=$k
+ done
+ end[${header[$i,$((j-1))]}]=-1
+ lines=(${lines[2,-1]})
+
+ # Name
+ for line in $lines; do
+ s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
+ s="$s:${(l:7:: :::)${${line[${begin[TAG]},${end[TAG]}]}%% ##}}"
+ plugins=($plugins $s)
+ done
+
+ _describe -t plugins-list "plugins" plugins "$@" && ret=0
+ return ret
+}
+
+__docker_complete_plugins() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_plugins none "$@"
+}
+
+__docker_complete_enabled_plugins() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_plugins enabled=true "$@"
+}
+
+__docker_complete_disabled_plugins() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_plugins enabled=false "$@"
+}
+
+__docker_plugin_commands() {
+ local -a _docker_plugin_subcommands
+ _docker_plugin_subcommands=(
+ "disable:Disable a plugin"
+ "enable:Enable a plugin"
+ "inspect:Return low-level information about a plugin"
+ "install:Install a plugin"
+ "ls:List plugins"
+ "push:Push a plugin"
+ "rm:Remove a plugin"
+ "set:Change settings for a plugin"
+ "upgrade:Upgrade an existing plugin"
+ )
+ _describe -t docker-plugin-commands "docker plugin command" _docker_plugin_subcommands
+}
+
+__docker_plugin_subcommand() {
+ local -a _command_args opts_help
+ local expl help="--help"
+ integer ret=1
+
+ opts_help=("(: -)--help[Print usage]")
+
+ case "$words[1]" in
+ (disable)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --force)"{-f,--force}"[Force the disable of an active plugin]" \
+ "($help -)1:plugin:__docker_complete_enabled_plugins" && ret=0
+ ;;
+ (enable)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--timeout=[HTTP client timeout (in seconds)]:timeout: " \
+ "($help -)1:plugin:__docker_complete_disabled_plugins" && ret=0
+ ;;
+ (inspect)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \
+ "($help -)*:plugin:__docker_complete_plugins" && ret=0
+ ;;
+ (install)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--alias=[Local name for plugin]:alias: " \
+ "($help)--disable[Do not enable the plugin on install]" \
+ "($help)--disable-content-trust[Skip image verification (default true)]" \
+ "($help)--grant-all-permissions[Grant all permissions necessary to run the plugin]" \
+ "($help -)1:plugin:__docker_complete_plugins" \
+ "($help -)*:key=value: " && ret=0
+ ;;
+ (ls|list)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_plugin_complete_ls_filters" \
+ "($help --format)--format=[Format the output using the given Go template]:template: " \
+ "($help)--no-trunc[Don't truncate output]" \
+ "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
+ ;;
+ (push)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--disable-content-trust[Skip image verification (default true)]" \
+ "($help -)1:plugin:__docker_complete_plugins" && ret=0
+ ;;
+ (rm|remove)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --force)"{-f,--force}"[Force the removal of an active plugin]" \
+ "($help -)*:plugin:__docker_complete_plugins" && ret=0
+ ;;
+ (set)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)1:plugin:__docker_complete_plugins" \
+ "($help -)*:key=value: " && ret=0
+ ;;
+ (upgrade)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--disable-content-trust[Skip image verification (default true)]" \
+ "($help)--grant-all-permissions[Grant all permissions necessary to run the plugin]" \
+ "($help)--skip-remote-check[Do not check if specified remote plugin matches existing plugin image]" \
+ "($help -)1:plugin:__docker_complete_plugins" \
+ "($help -):remote: " && ret=0
+ ;;
+ (help)
+ _arguments $(__docker_arguments) ":subcommand:__docker_plugin_commands" && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+# EO plugin
+
+# BO secret
+
+__docker_secrets() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ local line s
+ declare -a lines secrets
+
+ type=$1; shift
+
+ lines=(${(f)${:-"$(_call_program commands docker $docker_options secret ls)"$'\n'}})
+
+ # Parse header line to find columns
+ local i=1 j=1 k header=${lines[1]}
+ declare -A begin end
+ while (( j < ${#header} - 1 )); do
+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
+ begin[${header[$i,$((j-1))]}]=$i
+ end[${header[$i,$((j-1))]}]=$k
+ done
+ end[${header[$i,$((j-1))]}]=-1
+ lines=(${lines[2,-1]})
+
+ # ID
+ if [[ $type = (ids|all) ]]; then
+ for line in $lines; do
+ s="${line[${begin[ID]},${end[ID]}]%% ##}"
+ secrets=($secrets $s)
+ done
+ fi
+
+ # Names
+ if [[ $type = (names|all) ]]; then
+ for line in $lines; do
+ s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
+ secrets=($secrets $s)
+ done
+ fi
+
+ _describe -t secrets-list "secrets" secrets "$@" && ret=0
+ return ret
+}
+
+__docker_complete_secrets() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_secrets all "$@"
+}
+
+__docker_secret_commands() {
+ local -a _docker_secret_subcommands
+ _docker_secret_subcommands=(
+ "create:Create a secret using stdin as content"
+ "inspect:Display detailed information on one or more secrets"
+ "ls:List secrets"
+ "rm:Remove one or more secrets"
+ )
+ _describe -t docker-secret-commands "docker secret command" _docker_secret_subcommands
+}
+
+__docker_secret_subcommand() {
+ local -a _command_args opts_help
+ local expl help="--help"
+ integer ret=1
+
+ opts_help=("(: -)--help[Print usage]")
+
+ case "$words[1]" in
+ (create)
+ _arguments $(__docker_arguments) -A '-*' \
+ $opts_help \
+ "($help)*"{-l=,--label=}"[Secret labels]:label: " \
+ "($help -):secret: " && ret=0
+ ;;
+ (inspect)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \
+ "($help -)*:secret:__docker_complete_secrets" && ret=0
+ ;;
+ (ls|list)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--format=[Format the output using the given go template]:template: " \
+ "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
+ ;;
+ (rm|remove)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)*:secret:__docker_complete_secrets" && ret=0
+ ;;
+ (help)
+ _arguments $(__docker_arguments) ":subcommand:__docker_secret_commands" && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+# EO secret
+
+# BO service
+
+__docker_service_complete_ls_filters() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ (id)
+ __docker_complete_services_ids && ret=0
+ ;;
+ (mode)
+ opts=('global' 'replicated')
+ _describe -t mode-opts "mode options" opts && ret=0
+ ;;
+ (name)
+ __docker_complete_services_names && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ opts=('id' 'label' 'mode' 'name')
+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_service_complete_ps_filters() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ (desired-state)
+ state_opts=('accepted' 'running' 'shutdown')
+ _describe -t state-opts "desired state options" state_opts && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ opts=('desired-state' 'id' 'label' 'name')
+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_service_complete_placement_pref() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ (spread)
+ opts=('engine.labels' 'node.labels')
+ _describe -t spread-opts "spread options" opts -qS "." && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ opts=('spread')
+ _describe -t pref-opts "placement pref options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_services() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ local line s
+ declare -a lines services
+
+ type=$1; shift
+
+ lines=(${(f)${:-"$(_call_program commands docker $docker_options service ls)"$'\n'}})
+
+ # Parse header line to find columns
+ local i=1 j=1 k header=${lines[1]}
+ declare -A begin end
+ while (( j < ${#header} - 1 )); do
+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
+ begin[${header[$i,$((j-1))]}]=$i
+ end[${header[$i,$((j-1))]}]=$k
+ done
+ end[${header[$i,$((j-1))]}]=-1
+ lines=(${lines[2,-1]})
+
+ # Service ID
+ if [[ $type = (ids|all) ]]; then
+ for line in $lines; do
+ s="${line[${begin[ID]},${end[ID]}]%% ##}"
+ s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}"
+ services=($services $s)
+ done
+ fi
+
+ # Names
+ if [[ $type = (names|all) ]]; then
+ for line in $lines; do
+ s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
+ s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}"
+ services=($services $s)
+ done
+ fi
+
+ _describe -t services-list "services" services "$@" && ret=0
+ return ret
+}
+
+__docker_complete_services() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_services all "$@"
+}
+
+__docker_complete_services_ids() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_services ids "$@"
+}
+
+__docker_complete_services_names() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_services names "$@"
+}
+
+__docker_service_commands() {
+ local -a _docker_service_subcommands
+ _docker_service_subcommands=(
+ "create:Create a new service"
+ "inspect:Display detailed information on one or more services"
+ "logs:Fetch the logs of a service or task"
+ "ls:List services"
+ "rm:Remove one or more services"
+ "scale:Scale one or multiple replicated services"
+ "ps:List the tasks of a service"
+ "update:Update a service"
+ )
+ _describe -t docker-service-commands "docker service command" _docker_service_subcommands
+}
+
+__docker_service_subcommand() {
+ local -a _command_args opts_help opts_create_update
+ local expl help="--help"
+ integer ret=1
+
+ opts_help=("(: -)--help[Print usage]")
+ opts_create_update=(
+ "($help)*--constraint=[Placement constraints]:constraint: "
+ "($help)--endpoint-mode=[Placement constraints]:mode:(dnsrr vip)"
+ "($help)*"{-e=,--env=}"[Set environment variables]:env: "
+ "($help)--health-cmd=[Command to run to check health]:command: "
+ "($help)--health-interval=[Time between running the check]:time: "
+ "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)"
+ "($help)--health-timeout=[Maximum time to allow one check to run]:time: "
+ "($help)--hostname=[Service container hostname]:hostname: " \
+ "($help)*--label=[Service labels]:label: "
+ "($help)--limit-cpu=[Limit CPUs]:value: "
+ "($help)--limit-memory=[Limit Memory]:value: "
+ "($help)--log-driver=[Logging driver for service]:logging driver:__docker_complete_log_drivers"
+ "($help)*--log-opt=[Logging driver options]:log driver options:__docker_complete_log_options"
+ "($help)*--mount=[Attach a filesystem mount to the service]:mount: "
+ "($help)*--network=[Network attachments]:network: "
+ "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]"
+ "($help)*"{-p=,--publish=}"[Publish a port as a node port]:port: "
+ "($help)--read-only[Mount the container's root filesystem as read only]"
+ "($help)--replicas=[Number of tasks]:replicas: "
+ "($help)--reserve-cpu=[Reserve CPUs]:value: "
+ "($help)--reserve-memory=[Reserve Memory]:value: "
+ "($help)--restart-condition=[Restart when condition is met]:mode:(any none on-failure)"
+ "($help)--restart-delay=[Delay between restart attempts]:delay: "
+ "($help)--restart-max-attempts=[Maximum number of restarts before giving up]:max-attempts: "
+ "($help)--restart-window=[Window used to evaluate the restart policy]:duration: "
+ "($help)--rollback-delay=[Delay between task rollbacks]:duration: "
+ "($help)--rollback-failure-action=[Action on rollback failure]:action:(continue pause)"
+ "($help)--rollback-max-failure-ratio=[Failure rate to tolerate during a rollback]:failure rate: "
+ "($help)--rollback-monitor=[Duration after each task rollback to monitor for failure]:duration: "
+ "($help)--rollback-parallelism=[Maximum number of tasks rolled back simultaneously]:number: "
+ "($help)*--secret=[Specify secrets to expose to the service]:secret:__docker_complete_secrets"
+ "($help)--stop-grace-period=[Time to wait before force killing a container]:grace period: "
+ "($help)--stop-signal=[Signal to stop the container]:signal:_signals"
+ "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-TTY]"
+ "($help)--update-delay=[Delay between updates]:delay: "
+ "($help)--update-failure-action=[Action on update failure]:mode:(continue pause rollback)"
+ "($help)--update-max-failure-ratio=[Failure rate to tolerate during an update]:fraction: "
+ "($help)--update-monitor=[Duration after each task update to monitor for failure]:window: "
+ "($help)--update-parallelism=[Maximum number of tasks updated simultaneously]:number: "
+ "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users"
+ "($help)--with-registry-auth[Send registry authentication details to swarm agents]"
+ "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories"
+ )
+
+ case "$words[1]" in
+ (create)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ $opts_create_update \
+ "($help)*--container-label=[Container labels]:label: " \
+ "($help)*--dns=[Set custom DNS servers]:DNS: " \
+ "($help)*--dns-option=[Set DNS options]:DNS option: " \
+ "($help)*--dns-search=[Set custom DNS search domains]:DNS search: " \
+ "($help)*--env-file=[Read environment variables from a file]:environment file:_files" \
+ "($help)--mode=[Service Mode]:mode:(global replicated)" \
+ "($help)--name=[Service name]:name: " \
+ "($help)*--placement-pref=[Add a placement preference]:pref:__docker_service_complete_placement_pref" \
+ "($help)*--publish=[Publish a port]:port: " \
+ "($help -): :__docker_complete_images" \
+ "($help -):command: _command_names -e" \
+ "($help -)*::arguments: _normal" && ret=0
+ ;;
+ (inspect)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
+ "($help)--pretty[Print the information in a human friendly format]" \
+ "($help -)*:service:__docker_complete_services" && ret=0
+ ;;
+ (logs)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --follow)"{-f,--follow}"[Follow log output]" \
+ "($help)--no-resolve[Do not map IDs to Names]" \
+ "($help)--no-task-ids[Do not include task IDs]" \
+ "($help)--no-trunc[Do not truncate output]" \
+ "($help)--since=[Show logs since timestamp]:timestamp: " \
+ "($help)--tail=[Number of lines to show from the end of the logs]:lines:(1 10 20 50 all)" \
+ "($help -t --timestamps)"{-t,--timestamps}"[Show timestamps]" \
+ "($help -)1:service:__docker_complete_services" && ret=0
+ ;;
+ (ls|list)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_service_complete_ls_filters" \
+ "($help)--format=[Pretty-print services using a Go template]:template: " \
+ "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
+ ;;
+ (rm|remove)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)*:service:__docker_complete_services" && ret=0
+ ;;
+ (scale)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)*:service:->values" && ret=0
+ case $state in
+ (values)
+ if compset -P '*='; then
+ _message 'replicas' && ret=0
+ else
+ __docker_complete_services -qS "="
+ fi
+ ;;
+ esac
+ ;;
+ (ps)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_service_complete_ps_filters" \
+ "($help)--format=[Format the output using the given go template]:template: " \
+ "($help)--no-resolve[Do not map IDs to Names]" \
+ "($help)--no-trunc[Do not truncate output]" \
+ "($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \
+ "($help -)*:service:__docker_complete_services" && ret=0
+ ;;
+ (update)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ $opts_create_update \
+ "($help)--arg=[Service command args]:arguments: _normal" \
+ "($help)*--container-label-add=[Add or update container labels]:label: " \
+ "($help)*--container-label-rm=[Remove a container label by its key]:label: " \
+ "($help)*--dns-add=[Add or update custom DNS servers]:DNS: " \
+ "($help)*--dns-rm=[Remove custom DNS servers]:DNS: " \
+ "($help)*--dns-option-add=[Add or update DNS options]:DNS option: " \
+ "($help)*--dns-option-rm=[Remove DNS options]:DNS option: " \
+ "($help)*--dns-search-add=[Add or update custom DNS search domains]:DNS search: " \
+ "($help)*--dns-search-rm=[Remove DNS search domains]:DNS search: " \
+ "($help)--force[Force update]" \
+ "($help)*--group-add=[Add additional supplementary user groups to the container]:group:_groups" \
+ "($help)*--group-rm=[Remove previously added supplementary user groups from the container]:group:_groups" \
+ "($help)--image=[Service image tag]:image:__docker_complete_repositories" \
+ "($help)*--placement-pref-add=[Add a placement preference]:pref:__docker_service_complete_placement_pref" \
+ "($help)*--placement-pref-rm=[Remove a placement preference]:pref:__docker_service_complete_placement_pref" \
+ "($help)*--publish-add=[Add or update a port]:port: " \
+ "($help)*--publish-rm=[Remove a port(target-port mandatory)]:port: " \
+ "($help)--rollback[Rollback to previous specification]" \
+ "($help -)1:service:__docker_complete_services" && ret=0
+ ;;
+ (help)
+ _arguments $(__docker_arguments) ":subcommand:__docker_service_commands" && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+# EO service
+
+# BO stack
+
+__docker_stack_complete_ps_filters() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ (desired-state)
+ state_opts=('accepted' 'running' 'shutdown')
+ _describe -t state-opts "desired state options" state_opts && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ opts=('desired-state' 'id' 'name')
+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_stack_complete_services_filters() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ opts=('id' 'label' 'name')
+ _describe -t filter-opts "filter options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_stacks() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ local line s
+ declare -a lines stacks
+
+ lines=(${(f)${:-"$(_call_program commands docker $docker_options stack ls)"$'\n'}})
+
+ # Parse header line to find columns
+ local i=1 j=1 k header=${lines[1]}
+ declare -A begin end
+ while (( j < ${#header} - 1 )); do
+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
+ begin[${header[$i,$((j-1))]}]=$i
+ end[${header[$i,$((j-1))]}]=$k
+ done
+ end[${header[$i,$((j-1))]}]=-1
+ lines=(${lines[2,-1]})
+
+ # Service ID
+ for line in $lines; do
+ s="${line[${begin[ID]},${end[ID]}]%% ##}"
+ stacks=($stacks $s)
+ done
+
+ _describe -t stacks-list "stacks" stacks "$@" && ret=0
+ return ret
+}
+
+__docker_complete_stacks() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker_stacks "$@"
+}
+
+__docker_stack_commands() {
+ local -a _docker_stack_subcommands
+ _docker_stack_subcommands=(
+ "deploy:Deploy a new stack or update an existing stack"
+ "ls:List stacks"
+ "ps:List the tasks in the stack"
+ "rm:Remove the stack"
+ "services:List the services in the stack"
+ )
+ _describe -t docker-stack-commands "docker stack command" _docker_stack_subcommands
+}
+
+__docker_stack_subcommand() {
+ local -a _command_args opts_help
+ local expl help="--help"
+ integer ret=1
+
+ opts_help=("(: -)--help[Print usage]")
+
+ case "$words[1]" in
+ (deploy|up)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--bundle-file=[Path to a Distributed Application Bundle file]:dab:_files -g \"*.dab\"" \
+ "($help -c --compose-file)"{-c=,--compose-file=}"[Path to a Compose file]:compose file:_files -g \"*.(yml|yaml)\"" \
+ "($help)--with-registry-auth[Send registry authentication details to Swarm agents]" \
+ "($help -):stack:__docker_complete_stacks" && ret=0
+ ;;
+ (ls|list)
+ _arguments $(__docker_arguments) \
+ $opts_help && ret=0
+ ;;
+ (ps)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -a --all)"{-a,--all}"[Display all tasks]" \
+ "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_ps_filters" \
+ "($help)--format=[Format the output using the given go template]:template: " \
+ "($help)--no-resolve[Do not map IDs to Names]" \
+ "($help)--no-trunc[Do not truncate output]" \
+ "($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \
+ "($help -):stack:__docker_complete_stacks" && ret=0
+ ;;
+ (rm|remove|down)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -):stack:__docker_complete_stacks" && ret=0
+ ;;
+ (services)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_services_filters" \
+ "($help)--format=[Pretty-print services using a Go template]:template: " \
+ "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \
+ "($help -):stack:__docker_complete_stacks" && ret=0
+ ;;
+ (help)
+ _arguments $(__docker_arguments) ":subcommand:__docker_stack_commands" && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+# EO stack
+
+# BO swarm
+
+__docker_swarm_commands() {
+ local -a _docker_swarm_subcommands
+ _docker_swarm_subcommands=(
+ "init:Initialize a swarm"
+ "join:Join a swarm as a node and/or manager"
+ "join-token:Manage join tokens"
+ "leave:Leave a swarm"
+ "unlock:Unlock swarm"
+ "unlock-key:Manage the unlock key"
+ "update:Update the swarm"
+ )
+ _describe -t docker-swarm-commands "docker swarm command" _docker_swarm_subcommands
+}
+
+__docker_swarm_subcommand() {
+ local -a _command_args opts_help
+ local expl help="--help"
+ integer ret=1
+
+ opts_help=("(: -)--help[Print usage]")
+
+ case "$words[1]" in
+ (init)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--advertise-addr=[Advertised address]:ip\:port: " \
+ "($help)--data-path-addr=[Data path IP or interface]:ip " \
+ "($help)--autolock[Enable manager autolocking]" \
+ "($help)--availability=[Availability of the node]:availability:(active drain pause)" \
+ "($help)--cert-expiry=[Validity period for node certificates]:duration: " \
+ "($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \
+ "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \
+ "($help)--force-new-cluster[Force create a new cluster from current state]" \
+ "($help)--listen-addr=[Listen address]:ip\:port: " \
+ "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \
+ "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \
+ "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0
+ ;;
+ (join)
+ _arguments $(__docker_arguments) -A '-*' \
+ $opts_help \
+ "($help)--advertise-addr=[Advertised address]:ip\:port: " \
+ "($help)--data-path-addr=[Data path IP or interface]:ip " \
+ "($help)--availability=[Availability of the node]:availability:(active drain pause)" \
+ "($help)--listen-addr=[Listen address]:ip\:port: " \
+ "($help)--token=[Token for entry into the swarm]:secret: " \
+ "($help -):host\:port: " && ret=0
+ ;;
+ (join-token)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -q --quiet)"{-q,--quiet}"[Only display token]" \
+ "($help)--rotate[Rotate join token]" \
+ "($help -):role:(manager worker)" && ret=0
+ ;;
+ (leave)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --force)"{-f,--force}"[Force this node to leave the swarm, ignoring warnings]" && ret=0
+ ;;
+ (unlock)
+ _arguments $(__docker_arguments) \
+ $opts_help && ret=0
+ ;;
+ (unlock-key)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -q --quiet)"{-q,--quiet}"[Only display token]" \
+ "($help)--rotate[Rotate unlock token]" && ret=0
+ ;;
+ (update)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--autolock[Enable manager autolocking]" \
+ "($help)--cert-expiry=[Validity period for node certificates]:duration: " \
+ "($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \
+ "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \
+ "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \
+ "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \
+ "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0
+ ;;
+ (help)
+ _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+# EO swarm
+
+# BO system
+
+__docker_system_commands() {
+ local -a _docker_system_subcommands
+ _docker_system_subcommands=(
+ "df:Show docker filesystem usage"
+ "events:Get real time events from the server"
+ "info:Display system-wide information"
+ "prune:Remove unused data"
+ )
+ _describe -t docker-system-commands "docker system command" _docker_system_subcommands
+}
+
+__docker_system_subcommand() {
+ local -a _command_args opts_help
+ local expl help="--help"
+ integer ret=1
+
+ opts_help=("(: -)--help[Print usage]")
+
+ case "$words[1]" in
+ (df)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -v --verbose)"{-v,--verbose}"[Show detailed information on space usage]" && ret=0
+ ;;
+ (events)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_events_filter" \
+ "($help)--since=[Events created since this timestamp]:timestamp: " \
+ "($help)--until=[Events created until this timestamp]:timestamp: " \
+ "($help)--format=[Format the output using the given go template]:template: " && ret=0
+ ;;
+ (info)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0
+ ;;
+ (prune)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -a --all)"{-a,--all}"[Remove all unused data, not just dangling ones]" \
+ "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
+ "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0
+ ;;
+ (help)
+ _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+# EO system
+
+# BO volume
+
+__docker_volume_complete_ls_filters() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+
+ if compset -P '*='; then
+ case "${${words[-1]%=*}#*=}" in
+ (dangling)
+ dangling_opts=('true' 'false')
+ _describe -t dangling-filter-opts "Dangling Filter Options" dangling_opts && ret=0
+ ;;
+ (driver)
+ __docker_complete_info_plugins Volume && ret=0
+ ;;
+ (name)
+ __docker_complete_volumes && ret=0
+ ;;
+ *)
+ _message 'value' && ret=0
+ ;;
+ esac
+ else
+ opts=('dangling' 'driver' 'label' 'name')
+ _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0
+ fi
+
+ return ret
+}
+
+__docker_complete_volumes() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ declare -a lines volumes
+
+ lines=(${(f)${:-"$(_call_program commands docker $docker_options volume ls)"$'\n'}})
+
+ # Parse header line to find columns
+ local i=1 j=1 k header=${lines[1]}
+ declare -A begin end
+ while (( j < ${#header} - 1 )); do
+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
+ begin[${header[$i,$((j-1))]}]=$i
+ end[${header[$i,$((j-1))]}]=$k
+ done
+ end[${header[$i,$((j-1))]}]=-1
+ lines=(${lines[2,-1]})
+
+ # Names
+ local line s
+ for line in $lines; do
+ s="${line[${begin[VOLUME NAME]},${end[VOLUME NAME]}]%% ##}"
+ s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}"
+ volumes=($volumes $s)
+ done
+
+ _describe -t volumes-list "volumes" volumes && ret=0
+ return ret
+}
+
+__docker_volume_commands() {
+ local -a _docker_volume_subcommands
+ _docker_volume_subcommands=(
+ "create:Create a volume"
+ "inspect:Display detailed information on one or more volumes"
+ "ls:List volumes"
+ "prune:Remove all unused volumes"
+ "rm:Remove one or more volumes"
+ )
+ _describe -t docker-volume-commands "docker volume command" _docker_volume_subcommands
+}
+
+__docker_volume_subcommand() {
+ local -a _command_args opts_help
+ local expl help="--help"
+ integer ret=1
+
+ opts_help=("(: -)--help[Print usage]")
+
+ case "$words[1]" in
+ (create)
+ _arguments $(__docker_arguments) -A '-*' \
+ $opts_help \
+ "($help -d --driver)"{-d=,--driver=}"[Volume driver name]:Driver name:(local)" \
+ "($help)*--label=[Set metadata for a volume]:label=value: " \
+ "($help)*"{-o=,--opt=}"[Driver specific options]:Driver option: " \
+ "($help -)1:Volume name: " && ret=0
+ ;;
+ (inspect)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
+ "($help -)1:volume:__docker_complete_volumes" && ret=0
+ ;;
+ (ls)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_volume_complete_ls_filters" \
+ "($help)--format=[Pretty-print volumes using a Go template]:template: " \
+ "($help -q --quiet)"{-q,--quiet}"[Only display volume names]" && ret=0
+ ;;
+ (prune)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0
+ ;;
+ (rm)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --force)"{-f,--force}"[Force the removal of one or more volumes]" \
+ "($help -):volume:__docker_complete_volumes" && ret=0
+ ;;
+ (help)
+ _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+# EO volume
+
+__docker_caching_policy() {
+ oldp=( "$1"(Nmh+1) ) # 1 hour
+ (( $#oldp ))
+}
+
+__docker_commands() {
+ local cache_policy
+ integer force_invalidation=0
+
+ zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
+ if [[ -z "$cache_policy" ]]; then
+ zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy
+ fi
+
+ if ( (( ! ${+_docker_hide_legacy_commands} )) || _cache_invalid docker_hide_legacy_commands ) \
+ && ! _retrieve_cache docker_hide_legacy_commands;
+ then
+ _docker_hide_legacy_commands="${DOCKER_HIDE_LEGACY_COMMANDS}"
+ _store_cache docker_hide_legacy_commands _docker_hide_legacy_commands
+ fi
+
+ if [[ "${_docker_hide_legacy_commands}" != "${DOCKER_HIDE_LEGACY_COMMANDS}" ]]; then
+ force_invalidation=1
+ _docker_hide_legacy_commands="${DOCKER_HIDE_LEGACY_COMMANDS}"
+ _store_cache docker_hide_legacy_commands _docker_hide_legacy_commands
+ fi
+
+ if ( [[ ${+_docker_subcommands} -eq 0 ]] || _cache_invalid docker_subcommands ) \
+ && ! _retrieve_cache docker_subcommands || [[ ${force_invalidation} -eq 1 ]];
+ then
+ local -a lines
+ lines=(${(f)"$(_call_program commands docker 2>&1)"})
+ _docker_subcommands=(${${${(M)${lines[$((${lines[(i)*Commands:]} + 1)),-1]}:# *}## #}/ ##/:})
+ _docker_subcommands=($_docker_subcommands 'daemon:Enable daemon mode' 'help:Show help for a command')
+ (( $#_docker_subcommands > 2 )) && _store_cache docker_subcommands _docker_subcommands
+ fi
+ _describe -t docker-commands "docker command" _docker_subcommands
+}
+
+__docker_subcommand() {
+ local -a _command_args opts_help
+ local expl help="--help"
+ integer ret=1
+
+ opts_help=("(: -)--help[Print usage]")
+
+ case "$words[1]" in
+ (attach|commit|cp|create|diff|exec|export|kill|logs|pause|unpause|port|rename|restart|rm|run|start|stats|stop|top|update|wait)
+ __docker_container_subcommand && ret=0
+ ;;
+ (build|history|import|load|pull|push|save|tag)
+ __docker_image_subcommand && ret=0
+ ;;
+ (checkpoint)
+ local curcontext="$curcontext" state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -): :->command" \
+ "($help -)*:: :->option-or-argument" && ret=0
+
+ case $state in
+ (command)
+ __docker_checkpoint_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
+ __docker_checkpoint_subcommand && ret=0
+ ;;
+ esac
+ ;;
+ (container)
+ local curcontext="$curcontext" state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -): :->command" \
+ "($help -)*:: :->option-or-argument" && ret=0
+
+ case $state in
+ (command)
+ __docker_container_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
+ __docker_container_subcommand && ret=0
+ ;;
+ esac
+ ;;
+ (daemon)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)*--add-runtime=[Register an additional OCI compatible runtime]:runtime:__docker_complete_runtimes" \
+ "($help)*--allow-nondistributable-artifacts=[Push nondistributable artifacts to specified registries]:registry: " \
+ "($help)--api-cors-header=[CORS headers in the Engine API]:CORS headers: " \
+ "($help)*--authorization-plugin=[Authorization plugins to load]" \
+ "($help -b --bridge)"{-b=,--bridge=}"[Attach containers to a network bridge]:bridge:_net_interfaces" \
+ "($help)--bip=[Network bridge IP]:IP address: " \
+ "($help)--cgroup-parent=[Parent cgroup for all containers]:cgroup: " \
+ "($help)--cluster-advertise=[Address or interface name to advertise]:Instance to advertise (host\:port): " \
+ "($help)--cluster-store=[URL of the distributed storage backend]:Cluster Store:->cluster-store" \
+ "($help)*--cluster-store-opt=[Cluster store options]:Cluster options:->cluster-store-options" \
+ "($help)--config-file=[Path to daemon configuration file]:Config File:_files" \
+ "($help)--containerd=[Path to containerd socket]:socket:_files -g \"*.sock\"" \
+ "($help)--data-root=[Root directory of persisted Docker data]:path:_directories" \
+ "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \
+ "($help)--default-gateway[Container default gateway IPv4 address]:IPv4 address: " \
+ "($help)--default-gateway-v6[Container default gateway IPv6 address]:IPv6 address: " \
+ "($help)--default-shm-size=[Default shm size for containers]:size:" \
+ "($help)*--default-ulimit=[Default ulimits for containers]:ulimit: " \
+ "($help)--disable-legacy-registry[Disable contacting legacy registries (default true)]" \
+ "($help)*--dns=[DNS server to use]:DNS: " \
+ "($help)*--dns-opt=[DNS options to use]:DNS option: " \
+ "($help)*--dns-search=[DNS search domains to use]:DNS search: " \
+ "($help)*--exec-opt=[Runtime execution options]:runtime execution options: " \
+ "($help)--exec-root=[Root directory for execution state files]:path:_directories" \
+ "($help)--experimental[Enable experimental features]" \
+ "($help)--fixed-cidr=[IPv4 subnet for fixed IPs]:IPv4 subnet: " \
+ "($help)--fixed-cidr-v6=[IPv6 subnet for fixed IPs]:IPv6 subnet: " \
+ "($help -G --group)"{-G=,--group=}"[Group for the unix socket]:group:_groups" \
+ "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \
+ "($help)--icc[Enable inter-container communication]" \
+ "($help)--init[Run an init inside containers to forward signals and reap processes]" \
+ "($help)--init-path=[Path to the docker-init binary]:docker-init binary:_files" \
+ "($help)*--insecure-registry=[Enable insecure registry communication]:registry: " \
+ "($help)--ip=[Default IP when binding container ports]" \
+ "($help)--ip-forward[Enable net.ipv4.ip_forward]" \
+ "($help)--ip-masq[Enable IP masquerading]" \
+ "($help)--iptables[Enable addition of iptables rules]" \
+ "($help)--ipv6[Enable IPv6 networking]" \
+ "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \
+ "($help)*--label=[Key=value labels]:label: " \
+ "($help)--live-restore[Enable live restore of docker when containers are still running]" \
+ "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" \
+ "($help)*--log-opt=[Default log driver options for containers]:log driver options:__docker_complete_log_options" \
+ "($help)--max-concurrent-downloads[Set the max concurrent downloads for each pull]" \
+ "($help)--max-concurrent-uploads[Set the max concurrent uploads for each push]" \
+ "($help)--mtu=[Network MTU]:mtu:(0 576 1420 1500 9000)" \
+ "($help)--oom-score-adjust=[Set the oom_score_adj for the daemon]:oom-score:(-500)" \
+ "($help -p --pidfile)"{-p=,--pidfile=}"[Path to use for daemon PID file]:PID file:_files" \
+ "($help)--raw-logs[Full timestamps without ANSI coloring]" \
+ "($help)*--registry-mirror=[Preferred Docker registry mirror]:registry mirror: " \
+ "($help)--seccomp-profile=[Path to seccomp profile]:path:_files -g \"*.json\"" \
+ "($help -s --storage-driver)"{-s=,--storage-driver=}"[Storage driver to use]:driver:(aufs btrfs devicemapper overlay overlay2 vfs zfs)" \
+ "($help)--selinux-enabled[Enable selinux support]" \
+ "($help)--shutdown-timeout=[Set the shutdown timeout value in seconds]:time: " \
+ "($help)*--storage-opt=[Storage driver options]:storage driver options: " \
+ "($help)--tls[Use TLS]" \
+ "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g \"*.(pem|crt)\"" \
+ "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g \"*.(pem|crt)\"" \
+ "($help)--tlskey=[Path to TLS key file]:Key file:_files -g \"*.(pem|key)\"" \
+ "($help)--tlsverify[Use TLS and verify the remote]" \
+ "($help)--userns-remap=[User/Group setting for user namespaces]:user\:group:->users-groups" \
+ "($help)--userland-proxy[Use userland proxy for loopback traffic]" \
+ "($help)--userland-proxy-path=[Path to the userland proxy binary]:binary:_files" && ret=0
+
+ case $state in
+ (cluster-store)
+ if compset -P '*://'; then
+ _message 'host:port' && ret=0
+ else
+ store=('consul' 'etcd' 'zk')
+ _describe -t cluster-store "Cluster Store" store -qS "://" && ret=0
+ fi
+ ;;
+ (cluster-store-options)
+ if compset -P '*='; then
+ _files && ret=0
+ else
+ opts=('discovery.heartbeat' 'discovery.ttl' 'kv.cacertfile' 'kv.certfile' 'kv.keyfile' 'kv.path')
+ _describe -t cluster-store-opts "Cluster Store Options" opts -qS "=" && ret=0
+ fi
+ ;;
+ (users-groups)
+ if compset -P '*:'; then
+ _groups && ret=0
+ else
+ _describe -t userns-default "default Docker user management" '(default)' && ret=0
+ _users && ret=0
+ fi
+ ;;
+ esac
+ ;;
+ (events|info)
+ __docker_system_subcommand && ret=0
+ ;;
+ (image)
+ local curcontext="$curcontext" state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -): :->command" \
+ "($help -)*:: :->option-or-argument" && ret=0
+
+ case $state in
+ (command)
+ __docker_image_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
+ __docker_image_subcommand && ret=0
+ ;;
+ esac
+ ;;
+ (images)
+ words[1]='ls'
+ __docker_image_subcommand && ret=0
+ ;;
+ (inspect)
+ local state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
+ "($help -s --size)"{-s,--size}"[Display total file sizes if the type is container]" \
+ "($help)--type=[Return JSON for specified type]:type:(container image network node plugin service volume)" \
+ "($help -)*: :->values" && ret=0
+
+ case $state in
+ (values)
+ if [[ ${words[(r)--type=container]} == --type=container ]]; then
+ __docker_complete_containers && ret=0
+ elif [[ ${words[(r)--type=image]} == --type=image ]]; then
+ __docker_complete_images && ret=0
+ elif [[ ${words[(r)--type=network]} == --type=network ]]; then
+ __docker_complete_networks && ret=0
+ elif [[ ${words[(r)--type=node]} == --type=node ]]; then
+ __docker_complete_nodes && ret=0
+ elif [[ ${words[(r)--type=plugin]} == --type=plugin ]]; then
+ __docker_complete_plugins && ret=0
+ elif [[ ${words[(r)--type=service]} == --type=secrets ]]; then
+ __docker_complete_secrets && ret=0
+ elif [[ ${words[(r)--type=service]} == --type=service ]]; then
+ __docker_complete_services && ret=0
+ elif [[ ${words[(r)--type=volume]} == --type=volume ]]; then
+ __docker_complete_volumes && ret=0
+ else
+ __docker_complete_containers
+ __docker_complete_images
+ __docker_complete_networks
+ __docker_complete_nodes
+ __docker_complete_plugins
+ __docker_complete_secrets
+ __docker_complete_services
+ __docker_complete_volumes && ret=0
+ fi
+ ;;
+ esac
+ ;;
+ (login)
+ _arguments $(__docker_arguments) -A '-*' \
+ $opts_help \
+ "($help -p --password)"{-p=,--password=}"[Password]:password: " \
+ "($help -u --user)"{-u=,--user=}"[Username]:username: " \
+ "($help -)1:server: " && ret=0
+ ;;
+ (logout)
+ _arguments $(__docker_arguments) -A '-*' \
+ $opts_help \
+ "($help -)1:server: " && ret=0
+ ;;
+ (network)
+ local curcontext="$curcontext" state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -): :->command" \
+ "($help -)*:: :->option-or-argument" && ret=0
+
+ case $state in
+ (command)
+ __docker_network_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
+ __docker_network_subcommand && ret=0
+ ;;
+ esac
+ ;;
+ (node)
+ local curcontext="$curcontext" state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -): :->command" \
+ "($help -)*:: :->option-or-argument" && ret=0
+
+ case $state in
+ (command)
+ __docker_node_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
+ __docker_node_subcommand && ret=0
+ ;;
+ esac
+ ;;
+ (plugin)
+ local curcontext="$curcontext" state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -): :->command" \
+ "($help -)*:: :->option-or-argument" && ret=0
+
+ case $state in
+ (command)
+ __docker_plugin_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
+ __docker_plugin_subcommand && ret=0
+ ;;
+ esac
+ ;;
+ (ps)
+ words[1]='ls'
+ __docker_container_subcommand && ret=0
+ ;;
+ (rmi)
+ words[1]='rm'
+ __docker_image_subcommand && ret=0
+ ;;
+ (search)
+ _arguments $(__docker_arguments) -A '-*' \
+ $opts_help \
+ "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_search_filters" \
+ "($help)--limit=[Maximum returned search results]:limit:(1 5 10 25 50)" \
+ "($help)--no-trunc[Do not truncate output]" \
+ "($help -):term: " && ret=0
+ ;;
+ (secret)
+ local curcontext="$curcontext" state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -): :->command" \
+ "($help -)*:: :->option-or-argument" && ret=0
+
+ case $state in
+ (command)
+ __docker_secret_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
+ __docker_secret_subcommand && ret=0
+ ;;
+ esac
+ ;;
+ (service)
+ local curcontext="$curcontext" state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -): :->command" \
+ "($help -)*:: :->option-or-argument" && ret=0
+
+ case $state in
+ (command)
+ __docker_service_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
+ __docker_service_subcommand && ret=0
+ ;;
+ esac
+ ;;
+ (stack)
+ local curcontext="$curcontext" state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -): :->command" \
+ "($help -)*:: :->option-or-argument" && ret=0
+
+ case $state in
+ (command)
+ __docker_stack_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
+ __docker_stack_subcommand && ret=0
+ ;;
+ esac
+ ;;
+ (swarm)
+ local curcontext="$curcontext" state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -): :->command" \
+ "($help -)*:: :->option-or-argument" && ret=0
+
+ case $state in
+ (command)
+ __docker_swarm_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
+ __docker_swarm_subcommand && ret=0
+ ;;
+ esac
+ ;;
+ (system)
+ local curcontext="$curcontext" state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -): :->command" \
+ "($help -)*:: :->option-or-argument" && ret=0
+
+ case $state in
+ (command)
+ __docker_system_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
+ __docker_system_subcommand && ret=0
+ ;;
+ esac
+ ;;
+ (version)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0
+ ;;
+ (volume)
+ local curcontext="$curcontext" state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -): :->command" \
+ "($help -)*:: :->option-or-argument" && ret=0
+
+ case $state in
+ (command)
+ __docker_volume_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
+ __docker_volume_subcommand && ret=0
+ ;;
+ esac
+ ;;
+ (help)
+ _arguments $(__docker_arguments) ":subcommand:__docker_commands" && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+_docker() {
+ # Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`.
+ # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`.
+ if [[ $service != docker ]]; then
+ _call_function - _$service
+ return
+ fi
+
+ local curcontext="$curcontext" state line help="-h --help"
+ integer ret=1
+ typeset -A opt_args
+
+ _arguments $(__docker_arguments) -C \
+ "(: -)"{-h,--help}"[Print usage]" \
+ "($help)--config[Location of client config files]:path:_directories" \
+ "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \
+ "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \
+ "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \
+ "($help)--tls[Use TLS]" \
+ "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g "*.(pem|crt)"" \
+ "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g "*.(pem|crt)"" \
+ "($help)--tlskey=[Path to TLS key file]:Key file:_files -g "*.(pem|key)"" \
+ "($help)--tlsverify[Use TLS and verify the remote]" \
+ "($help)--userland-proxy[Use userland proxy for loopback traffic]" \
+ "($help -v --version)"{-v,--version}"[Print version information and quit]" \
+ "($help -): :->command" \
+ "($help -)*:: :->option-or-argument" && ret=0
+
+ local host=${opt_args[-H]}${opt_args[--host]}
+ local config=${opt_args[--config]}
+ local docker_options="${host:+--host $host} ${config:+--config $config}"
+
+ case $state in
+ (command)
+ __docker_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-$words[1]:
+ __docker_subcommand && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+_dockerd() {
+ integer ret=1
+ words[1]='daemon'
+ __docker_subcommand && ret=0
+ return ret
+}
+
+_docker "$@"
+
+# Local Variables:
+# mode: Shell-Script
+# sh-indentation: 4
+# indent-tabs-mode: nil
+# sh-basic-offset: 4
+# End:
+# vim: ft=zsh sw=4 ts=4 et
diff --git a/templates/.bin/_docker-compose b/templates/.bin/_docker-compose
new file mode 100755
index 0000000..2947cef
--- /dev/null
+++ b/templates/.bin/_docker-compose
@@ -0,0 +1,455 @@
+#compdef docker-compose
+
+# Description
+# -----------
+# zsh completion for docker-compose
+# https://github.com/sdurrheimer/docker-compose-zsh-completion
+# -------------------------------------------------------------------------
+# Version
+# -------
+# 1.5.0
+# -------------------------------------------------------------------------
+# Authors
+# -------
+# * Steve Durrheimer <s.durrheimer@gmail.com>
+# -------------------------------------------------------------------------
+# Inspiration
+# -----------
+# * @albers docker-compose bash completion script
+# * @felixr docker zsh completion script : https://github.com/felixr/docker-zsh-completion
+# -------------------------------------------------------------------------
+
+__docker-compose_q() {
+ docker-compose 2>/dev/null $compose_options "$@"
+}
+
+# All services defined in docker-compose.yml
+__docker-compose_all_services_in_compose_file() {
+ local already_selected
+ local -a services
+ already_selected=$(echo $words | tr " " "|")
+ __docker-compose_q config --services \
+ | grep -Ev "^(${already_selected})$"
+}
+
+# All services, even those without an existing container
+__docker-compose_services_all() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ services=$(__docker-compose_all_services_in_compose_file)
+ _alternative "args:services:($services)" && ret=0
+
+ return ret
+}
+
+# All services that have an entry with the given key in their docker-compose.yml section
+__docker-compose_services_with_key() {
+ local already_selected
+ local -a buildable
+ already_selected=$(echo $words | tr " " "|")
+ # flatten sections to one line, then filter lines containing the key and return section name.
+ __docker-compose_q config \
+ | sed -n -e '/^services:/,/^[^ ]/p' \
+ | sed -n 's/^ //p' \
+ | awk '/^[a-zA-Z0-9]/{printf "\n"};{printf $0;next;}' \
+ | grep " \+$1:" \
+ | cut -d: -f1 \
+ | grep -Ev "^(${already_selected})$"
+}
+
+# All services that are defined by a Dockerfile reference
+__docker-compose_services_from_build() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ buildable=$(__docker-compose_services_with_key build)
+ _alternative "args:buildable services:($buildable)" && ret=0
+
+ return ret
+}
+
+# All services that are defined by an image
+__docker-compose_services_from_image() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ pullable=$(__docker-compose_services_with_key image)
+ _alternative "args:pullable services:($pullable)" && ret=0
+
+ return ret
+}
+
+__docker-compose_get_services() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ local kind
+ declare -a running paused stopped lines args services
+
+ docker_status=$(docker ps > /dev/null 2>&1)
+ if [ $? -ne 0 ]; then
+ _message "Error! Docker is not running."
+ return 1
+ fi
+
+ kind=$1
+ shift
+ [[ $kind =~ (stopped|all) ]] && args=($args -a)
+
+ lines=(${(f)"$(_call_program commands docker $docker_options ps $args)"})
+ services=(${(f)"$(_call_program commands docker-compose 2>/dev/null $compose_options ps -q)"})
+
+ # Parse header line to find columns
+ local i=1 j=1 k header=${lines[1]}
+ declare -A begin end
+ while (( j < ${#header} - 1 )); do
+ i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
+ j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
+ k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
+ begin[${header[$i,$((j-1))]}]=$i
+ end[${header[$i,$((j-1))]}]=$k
+ done
+ lines=(${lines[2,-1]})
+
+ # Container ID
+ local line s name
+ local -a names
+ for line in $lines; do
+ if [[ ${services[@]} == *"${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}"* ]]; then
+ names=(${(ps:,:)${${line[${begin[NAMES]},-1]}%% *}})
+ for name in $names; do
+ s="${${name%_*}#*_}:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}"
+ s="$s, ${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}"
+ s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}"
+ if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = Exit* ]]; then
+ stopped=($stopped $s)
+ else
+ if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = *\(Paused\)* ]]; then
+ paused=($paused $s)
+ fi
+ running=($running $s)
+ fi
+ done
+ fi
+ done
+
+ [[ $kind =~ (running|all) ]] && _describe -t services-running "running services" running "$@" && ret=0
+ [[ $kind =~ (paused|all) ]] && _describe -t services-paused "paused services" paused "$@" && ret=0
+ [[ $kind =~ (stopped|all) ]] && _describe -t services-stopped "stopped services" stopped "$@" && ret=0
+
+ return ret
+}
+
+__docker-compose_pausedservices() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker-compose_get_services paused "$@"
+}
+
+__docker-compose_stoppedservices() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker-compose_get_services stopped "$@"
+}
+
+__docker-compose_runningservices() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker-compose_get_services running "$@"
+}
+
+__docker-compose_services() {
+ [[ $PREFIX = -* ]] && return 1
+ __docker-compose_get_services all "$@"
+}
+
+__docker-compose_caching_policy() {
+ oldp=( "$1"(Nmh+1) ) # 1 hour
+ (( $#oldp ))
+}
+
+__docker-compose_commands() {
+ local cache_policy
+
+ zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
+ if [[ -z "$cache_policy" ]]; then
+ zstyle ":completion:${curcontext}:" cache-policy __docker-compose_caching_policy
+ fi
+
+ if ( [[ ${+_docker_compose_subcommands} -eq 0 ]] || _cache_invalid docker_compose_subcommands) \
+ && ! _retrieve_cache docker_compose_subcommands;
+ then
+ local -a lines
+ lines=(${(f)"$(_call_program commands docker-compose 2>&1)"})
+ _docker_compose_subcommands=(${${${lines[$((${lines[(i)Commands:]} + 1)),${lines[(I) *]}]}## #}/ ##/:})
+ (( $#_docker_compose_subcommands > 0 )) && _store_cache docker_compose_subcommands _docker_compose_subcommands
+ fi
+ _describe -t docker-compose-commands "docker-compose command" _docker_compose_subcommands
+}
+
+__docker-compose_subcommand() {
+ local opts_help opts_force_recreate opts_no_recreate opts_no_build opts_remove_orphans opts_timeout opts_no_color opts_no_deps
+
+ opts_help='(: -)--help[Print usage]'
+ opts_force_recreate="(--no-recreate)--force-recreate[Recreate containers even if their configuration and image haven't changed. Incompatible with --no-recreate.]"
+ opts_no_recreate="(--force-recreate)--no-recreate[If containers already exist, don't recreate them. Incompatible with --force-recreate.]"
+ opts_no_build="(--build)--no-build[Don't build an image, even if it's missing.]"
+ opts_remove_orphans="--remove-orphans[Remove containers for services not defined in the Compose file]"
+ opts_timeout=('(-t --timeout)'{-t,--timeout}"[Specify a shutdown timeout in seconds. (default: 10)]:seconds: ")
+ opts_no_color='--no-color[Produce monochrome output.]'
+ opts_no_deps="--no-deps[Don't start linked services.]"
+
+ integer ret=1
+
+ case "$words[1]" in
+ (build)
+ _arguments \
+ $opts_help \
+ '--force-rm[Always remove intermediate containers.]' \
+ '--no-cache[Do not use cache when building the image.]' \
+ '--pull[Always attempt to pull a newer version of the image.]' \
+ '*:services:__docker-compose_services_from_build' && ret=0
+ ;;
+ (bundle)
+ _arguments \
+ $opts_help \
+ '(--output -o)'{--output,-o}'[Path to write the bundle file to. Defaults to "<project name>.dab".]:file:_files' && ret=0
+ ;;
+ (config)
+ _arguments \
+ $opts_help \
+ '(--quiet -q)'{--quiet,-q}"[Only validate the configuration, don't print anything.]" \
+ '--services[Print the service names, one per line.]' && ret=0
+ ;;
+ (create)
+ _arguments \
+ $opts_help \
+ $opts_force_recreate \
+ $opts_no_recreate \
+ $opts_no_build \
+ "(--no-build)--build[Build images before creating containers.]" \
+ '*:services:__docker-compose_services_all' && ret=0
+ ;;
+ (down)
+ _arguments \
+ $opts_help \
+ "--rmi[Remove images. Type must be one of: 'all': Remove all images used by any service. 'local': Remove only images that don't have a custom tag set by the \`image\` field.]:type:(all local)" \
+ '(-v --volumes)'{-v,--volumes}"[Remove named volumes declared in the \`volumes\` section of the Compose file and anonymous volumes attached to containers.]" \
+ $opts_remove_orphans && ret=0
+ ;;
+ (events)
+ _arguments \
+ $opts_help \
+ '--json[Output events as a stream of json objects]' \
+ '*:services:__docker-compose_services_all' && ret=0
+ ;;
+ (exec)
+ _arguments \
+ $opts_help \
+ '-d[Detached mode: Run command in the background.]' \
+ '--privileged[Give extended privileges to the process.]' \
+ '--user=[Run the command as this user.]:username:_users' \
+ '-T[Disable pseudo-tty allocation. By default `docker-compose exec` allocates a TTY.]' \
+ '--index=[Index of the container if there are multiple instances of a service \[default: 1\]]:index: ' \
+ '(-):running services:__docker-compose_runningservices' \
+ '(-):command: _command_names -e' \
+ '*::arguments: _normal' && ret=0
+ ;;
+ (help)
+ _arguments ':subcommand:__docker-compose_commands' && ret=0
+ ;;
+ (kill)
+ _arguments \
+ $opts_help \
+ '-s[SIGNAL to send to the container. Default signal is SIGKILL.]:signal:_signals' \
+ '*:running services:__docker-compose_runningservices' && ret=0
+ ;;
+ (logs)
+ _arguments \
+ $opts_help \
+ '(-f --follow)'{-f,--follow}'[Follow log output]' \
+ $opts_no_color \
+ '--tail=[Number of lines to show from the end of the logs for each container.]:number of lines: ' \
+ '(-t --timestamps)'{-t,--timestamps}'[Show timestamps]' \
+ '*:services:__docker-compose_services_all' && ret=0
+ ;;
+ (pause)
+ _arguments \
+ $opts_help \
+ '*:running services:__docker-compose_runningservices' && ret=0
+ ;;
+ (port)
+ _arguments \
+ $opts_help \
+ '--protocol=[tcp or udp \[default: tcp\]]:protocol:(tcp udp)' \
+ '--index=[index of the container if there are multiple instances of a service \[default: 1\]]:index: ' \
+ '1:running services:__docker-compose_runningservices' \
+ '2:port:_ports' && ret=0
+ ;;
+ (ps)
+ _arguments \
+ $opts_help \
+ '-q[Only display IDs]' \
+ '*:services:__docker-compose_services_all' && ret=0
+ ;;
+ (pull)
+ _arguments \
+ $opts_help \
+ '--ignore-pull-failures[Pull what it can and ignores images with pull failures.]' \
+ '*:services:__docker-compose_services_from_image' && ret=0
+ ;;
+ (push)
+ _arguments \
+ $opts_help \
+ '--ignore-push-failures[Push what it can and ignores images with push failures.]' \
+ '*:services:__docker-compose_services' && ret=0
+ ;;
+ (rm)
+ _arguments \
+ $opts_help \
+ '(-f --force)'{-f,--force}"[Don't ask to confirm removal]" \
+ '-v[Remove any anonymous volumes attached to containers]' \
+ '*:stopped services:__docker-compose_stoppedservices' && ret=0
+ ;;
+ (run)
+ _arguments \
+ $opts_help \
+ '-d[Detached mode: Run container in the background, print new container name.]' \
+ '*-e[KEY=VAL Set an environment variable (can be used multiple times)]:environment variable KEY=VAL: ' \
+ '--entrypoint[Overwrite the entrypoint of the image.]:entry point: ' \
+ '--name=[Assign a name to the container]:name: ' \
+ $opts_no_deps \
+ '(-p --publish)'{-p,--publish=}"[Publish a container's port(s) to the host]" \
+ '--rm[Remove container after run. Ignored in detached mode.]' \
+ "--service-ports[Run command with the service's ports enabled and mapped to the host.]" \
+ '-T[Disable pseudo-tty allocation. By default `docker-compose run` allocates a TTY.]' \
+ '(-u --user)'{-u,--user=}'[Run as specified username or uid]:username or uid:_users' \
+ '(-w --workdir)'{-w,--workdir=}'[Working directory inside the container]:workdir: ' \
+ '(-):services:__docker-compose_services' \
+ '(-):command: _command_names -e' \
+ '*::arguments: _normal' && ret=0
+ ;;
+ (scale)
+ _arguments \
+ $opts_help \
+ $opts_timeout \
+ '*:running services:__docker-compose_runningservices' && ret=0
+ ;;
+ (start)
+ _arguments \
+ $opts_help \
+ '*:stopped services:__docker-compose_stoppedservices' && ret=0
+ ;;
+ (stop|restart)
+ _arguments \
+ $opts_help \
+ $opts_timeout \
+ '*:running services:__docker-compose_runningservices' && ret=0
+ ;;
+ (unpause)
+ _arguments \
+ $opts_help \
+ '*:paused services:__docker-compose_pausedservices' && ret=0
+ ;;
+ (up)
+ _arguments \
+ $opts_help \
+ '(--abort-on-container-exit)-d[Detached mode: Run containers in the background, print new container names. Incompatible with --abort-on-container-exit.]' \
+ $opts_no_color \
+ $opts_no_deps \
+ $opts_force_recreate \
+ $opts_no_recreate \
+ $opts_no_build \
+ "(--no-build)--build[Build images before starting containers.]" \
+ "(-d)--abort-on-container-exit[Stops all containers if any container was stopped. Incompatible with -d.]" \
+ '(-t --timeout)'{-t,--timeout}"[Use this timeout in seconds for container shutdown when attached or when containers are already running. (default: 10)]:seconds: " \
+ $opts_remove_orphans \
+ '*:services:__docker-compose_services_all' && ret=0
+ ;;
+ (version)
+ _arguments \
+ $opts_help \
+ "--short[Shows only Compose's version number.]" && ret=0
+ ;;
+ (*)
+ _message 'Unknown sub command' && ret=1
+ ;;
+ esac
+
+ return ret
+}
+
+_docker-compose() {
+ # Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`.
+ # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`.
+ if [[ $service != docker-compose ]]; then
+ _call_function - _$service
+ return
+ fi
+
+ local curcontext="$curcontext" state line
+ integer ret=1
+ typeset -A opt_args
+
+ _arguments -C \
+ '(- :)'{-h,--help}'[Get help]' \
+ '(-f --file)'{-f,--file}'[Specify an alternate docker-compose file (default: docker-compose.yml)]:file:_files -g "*.yml"' \
+ '(-p --project-name)'{-p,--project-name}'[Specify an alternate project name (default: directory name)]:project name:' \
+ '--verbose[Show more output]' \
+ '(- :)'{-v,--version}'[Print version and exit]' \
+ '(-H --host)'{-H,--host}'[Daemon socket to connect to]:host:' \
+ '--tls[Use TLS; implied by --tlsverify]' \
+ '--tlscacert=[Trust certs signed only by this CA]:ca path:' \
+ '--tlscert=[Path to TLS certificate file]:client cert path:' \
+ '--tlskey=[Path to TLS key file]:tls key path:' \
+ '--tlsverify[Use TLS and verify the remote]' \
+ "--skip-hostname-check[Don't check the daemon's hostname against the name specified in the client certificate (for example if your docker host is an IP address)]" \
+ '(-): :->command' \
+ '(-)*:: :->option-or-argument' && ret=0
+
+ local -a relevant_compose_flags relevant_docker_flags compose_options docker_options
+
+ relevant_compose_flags=(
+ "--file" "-f"
+ "--host" "-H"
+ "--project-name" "-p"
+ "--tls"
+ "--tlscacert"
+ "--tlscert"
+ "--tlskey"
+ "--tlsverify"
+ "--skip-hostname-check"
+ )
+
+ relevant_docker_flags=(
+ "--host" "-H"
+ "--tls"
+ "--tlscacert"
+ "--tlscert"
+ "--tlskey"
+ "--tlsverify"
+ )
+
+ for k in "${(@k)opt_args}"; do
+ if [[ -n "${relevant_docker_flags[(r)$k]}" ]]; then
+ docker_options+=$k
+ if [[ -n "$opt_args[$k]" ]]; then
+ docker_options+=$opt_args[$k]
+ fi
+ fi
+ if [[ -n "${relevant_compose_flags[(r)$k]}" ]]; then
+ compose_options+=$k
+ if [[ -n "$opt_args[$k]" ]]; then
+ compose_options+=$opt_args[$k]
+ fi
+ fi
+ done
+
+ case $state in
+ (command)
+ __docker-compose_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-compose-$words[1]:
+ __docker-compose_subcommand && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+_docker-compose "$@"
diff --git a/templates/.bin/_jq b/templates/.bin/_jq
new file mode 100755
index 0000000..efda3bd
--- /dev/null
+++ b/templates/.bin/_jq
@@ -0,0 +1,77 @@
+#compdef jq
+# ------------------------------------------------------------------------------
+# Copyright (c) 2011 Github zsh-users - http://github.com/zsh-users
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# * Neither the name of the zsh-users nor the
+# names of its contributors may be used to endorse or promote products
+# derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL ZSH-USERS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# ------------------------------------------------------------------------------
+# Description
+# -----------
+#
+# Completion script for jq (http://stedolan.github.io/jq/)
+#
+# ------------------------------------------------------------------------------
+# Authors
+# -------
+#
+# * Hideaki Miyake (https://github.com/mollifier)
+#
+# ------------------------------------------------------------------------------
+
+declare -a opts args
+args=(
+ '(-h --help)'{-h,--help}'[display help information]'
+ '(-V --version)'{-V,--version}'[display version information]'
+ '(-s --slurp)'{-s,--slurp}'[run the filter just once]'
+ '(-R --raw-input)'{-R,--raw-input}'[parse the input as not JSON but string]'
+ '(-n --null-input)'{-n,--null-input}'[run the filter using null as the input]'
+ '(-c --compact-output)'{-c,--compact-output}'[compact output]' \
+ '(-C --color-output)'{-C,--color-output}'[colorize the output even if writing to a pipe or a file]'
+ '(-M --monochrome-output)'{-M,--monochrome-output}'[not colorize the output]'
+ '(-a --ascii-output)'{-a,--ascii-output}'[output with pure ASCII character]'
+ '(-r --raw-output)'{-r,--raw-output}'[not format string result as a JSON string with quotes]'
+ '--arg[passes a value to the jq program, e.g. --arg foo bar]:jq variable: '
+ '1: :_guard "^-*" pattern'
+ '*:files:->file'
+)
+local curcontext=$curcontext state line ret=1
+declare -A opt_args
+
+_arguments -C $opts \
+ $args && ret=0
+
+case $state in
+ file)
+ _files && ret=0
+ ;;
+esac
+
+return $ret
+
+# Local Variables:
+# mode: Shell-Script
+# sh-indentation: 2
+# indent-tabs-mode: nil
+# sh-basic-offset: 2
+# End:
+# vim: ft=zsh sw=2 ts=2 et
diff --git a/templates/.bin/alacritty-fullscreen b/templates/.bin/alacritty-fullscreen
new file mode 100755
index 0000000..42f80e3
--- /dev/null
+++ b/templates/.bin/alacritty-fullscreen
@@ -0,0 +1,11 @@
+#!/usr/bin/osascript
+
+tell application "Alacritty"
+ tell application "System Events" to tell process "Alacritty"
+ if front window exists then
+ tell front window
+ set value of attribute "AXFullScreen" to true
+ end tell
+ end if
+ end tell
+end tell
diff --git a/templates/.bin/brightness.sh b/templates/.bin/brightness.sh
new file mode 100755
index 0000000..80e317e
--- /dev/null
+++ b/templates/.bin/brightness.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+basedir="/sys/class/backlight/"
+handler=$basedir$(ls $basedir)"/"
+old_brightness=$(cat $handler"brightness")
+max_brightness=$(cat $handler"max_brightness")
+old_brightness_p=$(( 100 * $old_brightness / $max_brightness ))
+new_brightness_p=$(( $old_brightness_p $1 ))
+new_brightness=$(( $max_brightness * $new_brightness_p / 100 ))
+echo $new_brightness > $handler"brightness"
+
diff --git a/templates/.bin/extract b/templates/.bin/extract
new file mode 100755
index 0000000..e6831e4
--- /dev/null
+++ b/templates/.bin/extract
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+# credit: http://nparikh.org/notes/zshrc.txt
+# Usage: extract <file>
+# Description: extracts archived files / mounts disk images
+# Note: .dmg/hdiutil is Mac OS X-specific.
+
+do_autodetect () {
+ if file "$1" | grep -q 'Zip archive' ; then
+ unzip "$1"
+ else
+ echo "'$1' is not a recognized format"
+ fi
+}
+
+# first use a simple extension-based approach
+if [ -f "$1" ]; then
+ case $1 in
+ *.tar.bz2) tar -jxvf "$1" ;;
+ *.tar.gz) tar -zxvf "$1" ;;
+ *.bz2) bunzip2 "$1" ;;
+ *.dmg) hdiutil mount "$1" ;;
+ *.gz) gunzip "$1" ;;
+ *.tar) tar -xvf "$1" ;;
+ *.tbz2) tar -jxvf "$1" ;;
+ *.tgz) tar -zxvf "$1" ;;
+ *.zip) unzip "$1" ;;
+ *.ZIP) unzip "$1" ;;
+ *.pax) pax -r < "$1" ;;
+ *.pax.Z) uncompress "$1" --stdout | pax -r ;;
+ *.Z) uncompress "$1" ;;
+
+ # if there is no recognized extension, try to auto-detect the file type
+ *) do_autodetect "$1" ;;
+ esac
+else
+ echo "'$1' is not a valid file"
+fi
diff --git a/templates/.bin/files b/templates/.bin/files
new file mode 100755
index 0000000..491a917
--- /dev/null
+++ b/templates/.bin/files
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+grep -ir '$1' $2 | cut -d':' -f1 | sort -u | less
+
diff --git a/templates/.bin/get_battery b/templates/.bin/get_battery
new file mode 100755
index 0000000..45c8b32
--- /dev/null
+++ b/templates/.bin/get_battery
@@ -0,0 +1,23 @@
+#!/usr/bin/env zsh
+
+remaining=$(acpi --battery | cut -d':' -f2 | cut -d',' -f2 | sed 's/[^0-9]//g')
+state=$(acpi --battery | cut -d':' -f2 | cut -d',' -f1)
+
+if [[ -z "$remaining" ]]; then
+ exit
+fi
+
+fa_lightning="<span font='FontAwesome'>\uf0e7</span>"
+fa_plug="<span font='FontAwesome'>\uf1e6</span>"
+fa_battery="<span font='FontAwesome'>\uf240</span>"
+fa_question="<span font='FontAwesome'>\uf128</span>"
+
+if [[ $(echo "$state" | grep "Discharging") ]]; then
+ echo "$fa_battery $remaining%"
+elif [[ $(echo "$state" | grep "Full") ]]; then
+ echo "$fa_plug"
+elif [[ $(echo "$state" | grep "Unknown") ]]; then
+ echo "$fa_question"
+else
+ echo "$fa_lightning $remaining%"
+fi
diff --git a/templates/.bin/get_cpu b/templates/.bin/get_cpu
new file mode 100755
index 0000000..4f66833
--- /dev/null
+++ b/templates/.bin/get_cpu
@@ -0,0 +1,7 @@
+#!/usr/bin/zsh
+
+idle=$(mpstat -o JSON 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle')
+used=$((100.0 - $idle))
+temp=$(acpi --thermal | cut -d':' -f2 | cut -d',' -f2 | sed 's/[^0-9\.]//g')
+
+printf "<span font='FontAwesome'></span> %d%% %d°C\n" $used $temp
diff --git a/templates/.bin/get_date b/templates/.bin/get_date
new file mode 100755
index 0000000..295f23b
--- /dev/null
+++ b/templates/.bin/get_date
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+echo "<span font='FontAwesome'></span> $(date +'%a %d %b %H:%M')"
diff --git a/templates/.bin/get_disk b/templates/.bin/get_disk
new file mode 100755
index 0000000..6113c41
--- /dev/null
+++ b/templates/.bin/get_disk
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+avail=$(df -h --output=avail / | tail -n1 | sed 's/ //g')
+echo "<span font='FontAwesome'></span> $avail"
diff --git a/templates/.bin/get_essid b/templates/.bin/get_essid
new file mode 100755
index 0000000..183c3f5
--- /dev/null
+++ b/templates/.bin/get_essid
@@ -0,0 +1,35 @@
+#!/bin/bash
+# Copyright (C) 2018 borgified <borgified@gmail.com>
+# Copyright (C) 2014 Alexander Keller <github@nycroth.com>
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+#------------------------------------------------------------------------
+
+INTERFACE="${INTERFACE:-wlan0}"
+
+#------------------------------------------------------------------------
+
+# As per #36 -- It is transparent: e.g. if the machine has no battery or wireless
+# connection (think desktop), the corresponding block should not be displayed.
+[[ ! -d /sys/class/net/${INTERFACE}/wireless ]] ||
+ [[ "$(cat /sys/class/net/$INTERFACE/operstate)" = 'down' ]] && exit
+
+#------------------------------------------------------------------------
+
+ESSID=$(/sbin/iwconfig $INTERFACE | perl -n -e'/ESSID:"(.*?)"/ && print $1')
+
+#------------------------------------------------------------------------
+
+echo "<span font='FontAwesome'></span> $ESSID"
diff --git a/templates/.bin/get_iface b/templates/.bin/get_iface
new file mode 100755
index 0000000..8a86cec
--- /dev/null
+++ b/templates/.bin/get_iface
@@ -0,0 +1,66 @@
+#!/bin/bash
+# Copyright (C) 2014 Julien Bonjean <julien@bonjean.info>
+# Copyright (C) 2014 Alexander Keller <github@nycroth.com>
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+#------------------------------------------------------------------------
+
+# Use the provided interface, otherwise the device used for the default route.
+IF="${IFACE:-$BLOCK_INSTANCE}"
+IF="${IF:-$(ip route | awk '/^default/ { print $5 ; exit }')}"
+
+# Exit if there is no default route
+[[ -z "$IF" ]] && exit
+
+#------------------------------------------------------------------------
+
+# As per #36 -- It is transparent: e.g. if the machine has no battery or wireless
+# connection (think desktop), the corresponding block should not be displayed.
+[[ ! -d /sys/class/net/${IF} ]] && exit
+
+#------------------------------------------------------------------------
+
+AF=${ADDRESS_FAMILY:-inet6?}
+LABEL="${LABEL:-}"
+
+for flag in "$1" "$2"; do
+ case "$flag" in
+ -4)
+ AF=inet ;;
+ -6)
+ AF=inet6 ;;
+ -L)
+ if [[ "$IF" = "" ]]; then
+ LABEL="iface "
+ else
+ LABEL="$IF: "
+ fi ;;
+ esac
+done
+
+if [[ "$IF" = "" ]] || [[ "$(cat /sys/class/net/$IF/operstate)" = 'down' ]]; then
+ echo "${LABEL}down" # full text
+ echo "${LABEL}down" # short text
+ echo \#FF0000 # color
+ exit
+fi
+
+# if no interface is found, use the first device with a global scope
+IPADDR=$(ip addr show $IF | perl -n -e "/$AF ([^ \/]+).* scope global/ && print \$1 and exit")
+
+#------------------------------------------------------------------------
+
+echo "$LABEL$IPADDR" # full text
+echo "$LABEL$IPADDR" # short text
diff --git a/templates/.bin/get_memory b/templates/.bin/get_memory
new file mode 100755
index 0000000..1c82944
--- /dev/null
+++ b/templates/.bin/get_memory
@@ -0,0 +1,45 @@
+#!/bin/sh
+# Copyright (C) 2014 Julien Bonjean <julien@bonjean.info>
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+pct_used=$(awk '
+/^MemTotal:/ {
+ mem_total=$2
+}
+/^MemFree:/ {
+ mem_free=$2
+}
+/^Buffers:/ {
+ mem_free+=$2
+}
+/^Cached:/ {
+ mem_free+=$2
+}
+END {
+ free=mem_free/1024/1024
+ used=(mem_total-mem_free)/1024/1024
+ total=mem_total/1024/1024
+
+ pct=0
+ if (total > 0) {
+ pct=used/total*100
+ }
+
+ # short text
+ printf("%.f\n", pct)
+}
+' /proc/meminfo)
+
+echo "<span font='FontAwesome'></span> $pct_used%"
diff --git a/templates/.bin/get_public_ip b/templates/.bin/get_public_ip
new file mode 100755
index 0000000..7625918
--- /dev/null
+++ b/templates/.bin/get_public_ip
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+wget -qO - icanhazip.com
diff --git a/templates/.bin/get_volume b/templates/.bin/get_volume
new file mode 100755
index 0000000..30516b0
--- /dev/null
+++ b/templates/.bin/get_volume
@@ -0,0 +1,36 @@
+#!/bin/bash
+# Displays the default device, volume, and mute status for i3blocks
+
+set -a
+
+AUDIO_MUTED_SYMBOL=
+AUDIO_SYMBOL=
+
+MIXER="default"
+if amixer -D pulse info >/dev/null 2>&1 ; then
+ MIXER="pulse"
+fi
+
+function print_block {
+ ACTIVE=$(pacmd list-sinks | grep "state\: RUNNING" -B4 -A7 | grep "index:\|name:\|volume: front\|muted:")
+ [ -z "$ACTIVE" ] && ACTIVE=$(pacmd list-sinks | grep "index:\|name:\|volume: front\|muted:" | grep -A3 '*')
+ for name in INDEX NAME VOL MUTED; do
+ read $name
+ done < <(echo "$ACTIVE")
+ INDEX=$(echo "$INDEX" | grep -o '[0-9]\+')
+ VOL=$(echo "$VOL" | grep -o "[0-9]*%" | head -1 )
+ VOL="${VOL%?}"
+
+ if [[ $MUTED =~ "no" ]] ; then
+ SYMB=$AUDIO_SYMBOL
+ else
+ SYMB=$AUDIO_MUTED_SYMBOL
+ fi
+
+ echo "<span font='FontAwesome'>${SYMB}</span> ${VOL}%"
+}
+
+print_block
+while read -r EVENT; do
+ print_block
+done < <(pactl subscribe | stdbuf -oL grep change)
diff --git a/templates/.bin/headers b/templates/.bin/headers
new file mode 100755
index 0000000..9dd1f72
--- /dev/null
+++ b/templates/.bin/headers
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# https://github.com/rtomayko/dotfiles/blob/rtomayko/bin/headers
+
+curl -sv "$@" 2>&1 >/dev/null |
+ grep -v "^\*" |
+ grep -v "^}" |
+ cut -c3- \ No newline at end of file
diff --git a/templates/.bin/launch-chrome b/templates/.bin/launch-chrome
new file mode 100755
index 0000000..7251869
--- /dev/null
+++ b/templates/.bin/launch-chrome
@@ -0,0 +1,7 @@
+#!/usr/bin/env zsh
+
+if [[ $(uname) == "FreeBSD" ]]; then
+ chrome
+elif [[ $(uname -a | grep Ubuntu) ]]; then
+ google-chrome
+fi
diff --git a/templates/.bin/lsproc b/templates/.bin/lsproc
new file mode 100755
index 0000000..eb96a12
--- /dev/null
+++ b/templates/.bin/lsproc
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+grep -v '#' Procfile | cut -d':' -f1 | sed '/^\s*$/d'
diff --git a/templates/.bin/mailsync b/templates/.bin/mailsync
new file mode 100755
index 0000000..9bb013f
--- /dev/null
+++ b/templates/.bin/mailsync
@@ -0,0 +1,57 @@
+#!/usr/bin/env bash
+
+BUNDLE=com.benburwell.mailsync
+PLIST="$HOME/Library/LaunchAgents/$BUNDLE.plist"
+
+monitor () {
+ local pid=$1 i=0
+ while ps "$pid" &>/dev/null; do
+ if (( i++ > 10 )); then
+ echo "Max checks reached. Sending SIGKILL to $pid..." >&2
+ kill -9 "$pid"; return 1
+ fi
+ sleep 10
+ done
+ return 0
+}
+
+if [[ "$1" == "install" ]]; then
+ SCRIPTPATH="$( cd "$(dirname "$0")" || exit 1; pwd -P )/$(basename "$0")"
+ cat > "$PLIST" <<EOF
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+ <dict>
+ <key>Label</key>
+ <string>$BUNDLE</string>
+
+ <key>ProgramArguments</key>
+ <array>
+ <string>$SCRIPTPATH</string>
+ </array>
+
+ <key>StartInterval</key>
+ <integer>180</integer>
+
+ <key>StandardErrorPath</key>
+ <string>/tmp/offlineimap.err.log</string>
+
+ <key>StandardOutPath</key>
+ <string>/tmp/offlineimap.log</string>
+ </dict>
+</plist>
+EOF
+ launchctl load "$PLIST"
+ exit 0
+elif [[ "$1" == "uninstall" ]]; then
+ launchctl unload "$PLIST"
+ rm -f "$PLIST"
+ exit $?
+elif [[ $# -gt 0 ]]; then
+ echo "Unrecognized options, did you mean 'install' or 'uninstall'?"
+ exit 1
+fi
+
+echo "STARTING $(date)"
+offlineimap -o & monitor $!
+echo "DONE $(date)"
diff --git a/templates/.bin/metar b/templates/.bin/metar
new file mode 100755
index 0000000..a9d7429
--- /dev/null
+++ b/templates/.bin/metar
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+say=0
+jq="/usr/bin/jq"
+if [[ ! -x "$jq" && -x "/usr/local/bin/jq" ]]; then
+ jq="/usr/local/bin/jq"
+fi
+
+while [ $# -gt 0 ]; do
+ case "$1" in
+ -s|--say)
+ say=1
+ ;;
+ -*)
+ echo "Unknown option flag: $1"
+ exit 1
+ ;;
+ *)
+ station=$(echo -n "$1" | tr "a-z" "A-Z")
+ ;;
+ esac
+ shift
+done
+json=$(curl -s "https://avwx.rest/api/metar/${station:-KBOS}?options=speech")
+if [ $say -gt 0 ]; then
+ echo "$json" | "$jq" --raw-output '.Speech' 2>&1 | say
+else
+ echo "$json" | "$jq" --raw-output '.["Raw-Report"]' 2>&1
+fi
diff --git a/templates/.bin/mkaerc b/templates/.bin/mkaerc
new file mode 100755
index 0000000..b74abae
--- /dev/null
+++ b/templates/.bin/mkaerc
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+cd ~/c/aerc && make clean all GOFLAGS=-tags=notmuch && sudo make install
diff --git a/templates/.bin/mutt-notmuch-py b/templates/.bin/mutt-notmuch-py
new file mode 100755
index 0000000..40c7a76
--- /dev/null
+++ b/templates/.bin/mutt-notmuch-py
@@ -0,0 +1,157 @@
+#!/usr/bin/env python
+"""
+mutt-notmuch-py
+
+This is a Gmail-only version of the original mutt-notmuch script.
+
+It will interactively ask you for a search query and then symlink the matching
+messages to $HOME/.cache/mutt_results.
+
+Add this to your muttrc.
+
+macro index / "<enter-command>unset wait_key<enter><shell-escape>mutt-notmuch-py<enter><change-folder-readonly>~/.cache/mutt_results<enter>" \
+ "search mail (using notmuch)"
+
+This script overrides the $HOME/.cache/mutt_results each time you run a query.
+
+Install this by adding this file somewhere on your PATH.
+
+Tested on OSX Lion, OSX El Capitan, Fedora 23, and Arch Linux.
+
+(c) 2012-2016 --- Honza Pokorny
+Licensed under BSD
+"""
+
+from __future__ import print_function
+import os
+import hashlib
+
+try:
+ from shlex import quote
+except ImportError:
+ from pipes import quote
+
+import sys
+
+from mailbox import Maildir
+from optparse import OptionParser
+from collections import defaultdict
+import readline
+
+VERSION = '1.3.0'
+
+try:
+ from commands import getoutput
+except ImportError:
+ from subprocess import getoutput
+
+try:
+ input = raw_input
+except NameError:
+ pass
+
+
+def digest(filename):
+ with open(filename, 'rb') as f:
+ return hashlib.sha1(f.read()).hexdigest()
+
+
+def pick_all_mail(messages):
+ for m in messages:
+ if 'All Mail' in m:
+ return m
+
+
+def empty_dir(directory):
+ box = Maildir(directory)
+ box.clear()
+
+
+def command(cmd):
+ return getoutput(cmd)
+
+
+def normalize(path):
+ if path:
+ # Use expanduser() so that os.symlink() won't get weirded out by
+ # tildes.
+ return os.path.expanduser(path).rstrip('/')
+
+
+def main(dest_box, options):
+ is_gmail = options.gmail
+ filter_path = options.base_path
+ history_path = normalize(options.history_path)
+ if history_path and os.path.exists(history_path):
+ readline.read_history_file(history_path)
+ query = input('Query: ')
+ if history_path:
+ readline.write_history_file(history_path)
+
+ command('mkdir -p %s/cur' % dest_box)
+ command('mkdir -p %s/new' % dest_box)
+
+ empty_dir(dest_box)
+
+ files = command('notmuch search --output=files {}'.format(quote(query))).split('\n')
+
+ data = defaultdict(list)
+ messages = []
+
+ for f in files:
+ if not f:
+ continue
+
+ if filter_path is not None and filter_path not in f:
+ continue
+
+ try:
+ sha = digest(f)
+ data[sha].append(f)
+ except IOError:
+ print('File %s does not exist' % f)
+
+ for sha in data:
+ if is_gmail and len(data[sha]) > 1:
+ messages.append(pick_all_mail(data[sha]))
+ else:
+ messages.append(data[sha][0])
+
+ for m in messages:
+ if not m:
+ continue
+
+ target = os.path.join(dest_box, 'cur', os.path.basename(m))
+ if not os.path.exists(target):
+ os.symlink(m, target)
+
+
+if __name__ == '__main__':
+ p = OptionParser("usage: %prog [OPTIONS] [RESULTDIR]")
+ p.add_option('-g', '--gmail', dest='gmail',
+ action='store_true', default=True,
+ help='gmail-specific behavior')
+ p.add_option('-G', '--not-gmail', dest='gmail',
+ action='store_false',
+ help='Normal, non-gmail-specific behavior')
+ p.add_option('-p', '--base-path', dest='base_path',
+ help='Only include messages in given base path')
+ p.add_option('--history-path', dest='history_path',
+ help='Save/restore query history to given path')
+ p.add_option('-v', '--version', dest='version', action='store_true',
+ help='Show version')
+ (options, args) = p.parse_args()
+
+ if args:
+ dest = args[0]
+ else:
+ dest = '~/.cache/mutt_results'
+
+ if options.version:
+ print(VERSION)
+ sys.exit(0)
+
+ try:
+ main(normalize(dest), options)
+ except KeyboardInterrupt:
+ pass
diff --git a/templates/.bin/mvi b/templates/.bin/mvi
new file mode 100755
index 0000000..b2e333f
--- /dev/null
+++ b/templates/.bin/mvi
@@ -0,0 +1,84 @@
+#!/bin/sh
+#
+# This shell script passes all its arguments to the binary inside the
+# MacVim.app application bundle. If you make links to this script as view,
+# gvim, etc., then it will peek at the name used to call it and set options
+# appropriately.
+#
+# Based on a script by Wout Mertens and suggestions from Laurent Bihanic. This
+# version is the fault of Benji Fisher, 16 May 2005 (with modifications by Nico
+# Weber and Bjorn Winckler, Aug 13 2007).
+# First, check "All the Usual Suspects" for the location of the Vim.app bundle.
+# You can short-circuit this by setting the VIM_APP_DIR environment variable
+# or by un-commenting and editing the following line:
+# VIM_APP_DIR=/Applications
+
+if [ -z "$VIM_APP_DIR" ]
+then
+ myDir="`dirname "$0"`"
+ myAppDir="$myDir/../Applications"
+ suspects=(
+ /Applications
+ ~/Applications
+ /Applications/vim
+ ~/Applications/vim
+ $myDir
+ $myDir/vim
+ $myAppDir
+ $myAppDir/vim
+ /Applications/Utilities
+ /Applications/Utilities/vim
+ )
+ for i in ${suspects[@]}; do
+ if [ -x "$i/MacVim.app" ]; then
+ VIM_APP_DIR="$i"
+ break
+ fi
+ done
+fi
+if [ -z "$VIM_APP_DIR" ]
+then
+ echo "Sorry, cannot find MacVim.app. Try setting the VIM_APP_DIR environment variable to the directory containing MacVim.app."
+ exit 1
+fi
+binary="$VIM_APP_DIR/MacVim.app/Contents/MacOS/Vim"
+
+# Next, peek at the name used to invoke this script, and set options
+# accordingly.
+
+name="`basename "$0"`"
+gui=
+opts=
+
+# GUI mode, implies forking
+case "$name" in m*|g*|rm*|rg*) gui=true ;; esac
+
+# Restricted mode
+case "$name" in r*) opts="$opts -Z";; esac
+
+# vimdiff, view, and ex mode
+case "$name" in
+ *vimdiff)
+ opts="$opts -dO"
+ ;;
+ *view)
+ opts="$opts -R"
+ ;;
+ *ex)
+ opts="$opts -e"
+ ;;
+esac
+
+# Last step: fire up vim.
+# The program should fork by default when started in GUI mode, but it does
+# not; we work around this when this script is invoked as "gvim" or "rgview"
+# etc., but not when it is invoked as "vim -g".
+if [ "$gui" ]; then
+ # Note: this isn't perfect, because any error output goes to the
+ # terminal instead of the console log.
+ # But if you use open instead, you will need to fully qualify the
+ # path names for any filenames you specify, which is hard.
+ exec "$binary" -g $opts ${1:+"$@"}
+else
+ exec "$binary" $opts ${1:+"$@"}
+fi
diff --git a/templates/.bin/psqlenv b/templates/.bin/psqlenv
new file mode 100755
index 0000000..61fd843
--- /dev/null
+++ b/templates/.bin/psqlenv
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+dbname="DATABASE_URL"
+if [ $# -ne 0 ]; then
+ dbname=$1
+fi
+psql `grep "^$dbname=" -m 1 < .env | cut -d'=' -f2 | sed 's/"//g'`
diff --git a/templates/.bin/pwrman b/templates/.bin/pwrman
new file mode 100755
index 0000000..ef0823b
--- /dev/null
+++ b/templates/.bin/pwrman
@@ -0,0 +1,20 @@
+#!/usr/bin/env zsh
+
+dmenu_fn=Roboto
+dmenu_nb="#0e2133"
+dmenu_nf="#e6e0cf"
+dmenu_sb="#7390bf"
+dmenu_sf="#0e2133"
+
+menu() {
+ dmenu -fn "$dmenu_fn" -nf "$dmenu_nf" -nb "$dmenu_nb" -sb "$dmenu_sb" -sf "$dmenu_sf" -p "$1"
+}
+
+action=$(echo "lock screen\nreboot\nshutdown" | menu "Action:")
+if [[ "$action" == "lock screen" ]]; then
+ i3lock-fancy -- scrot -z
+elif [[ "$action" == "reboot" ]]; then
+ i3-nagbar -t warning -m "Are you sure you want to reboot?" -B "Reboot" "reboot"
+elif [[ "$action" == "shutdown" ]]; then
+ i3-nagbar -t warning -m "Are you sure you want to shut down?" -B "Shut Down" "sudo shutdown -h now"
+fi
diff --git a/templates/.bin/randombg b/templates/.bin/randombg
new file mode 100755
index 0000000..ebcb2ae
--- /dev/null
+++ b/templates/.bin/randombg
@@ -0,0 +1,3 @@
+#!/usr/bin/env zsh
+
+feh --randomize --bg-fill $HOME/.wallpaper/*
diff --git a/templates/.bin/randword b/templates/.bin/randword
new file mode 100755
index 0000000..3bf5bd8
--- /dev/null
+++ b/templates/.bin/randword
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+wf=/usr/share/dict/words
+total_words=`wc -l $wf | tr -d ' ' | cut -d'/' -f1`
+ln=`python3 -c "import secrets; print(secrets.randbelow($total_words))"`
+tail -n $ln $wf | head -n 1
diff --git a/templates/.bin/rev_dns b/templates/.bin/rev_dns
new file mode 100755
index 0000000..604774c
--- /dev/null
+++ b/templates/.bin/rev_dns
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+if [[ "$#" != "1" ]]; then
+ echo "usage: $0 <hostname>"
+else
+ dig +short "$1" | awk '/^([0-9]{1,3}\.){3}[0-9]{1,3}$/{print $0}' | xargs -I _ dig +short -x _
+fi
diff --git a/templates/.bin/rfc b/templates/.bin/rfc
new file mode 100755
index 0000000..293dc56
--- /dev/null
+++ b/templates/.bin/rfc
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+nvim +":RFC $@"
diff --git a/templates/.bin/rot13 b/templates/.bin/rot13
new file mode 100755
index 0000000..c72f41e
--- /dev/null
+++ b/templates/.bin/rot13
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+offset=${1:-13}
+
+if [ "$offset" -lt 1 ]; then
+ echo "offset must be greater than zero" >&2
+ exit 1
+elif [ "$offset" -gt 25 ]; then
+ echo "offset must be less than 26" >&2
+ exit 1
+fi
+
+alphabet=aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
+sub1=$(echo "$alphabet" | cut -c $((offset * 2 + 1))-)
+sub2=$(echo "$alphabet" | cut -c 1-$((offset * 2)))
+sub=$sub1$sub2
+
+tr "$alphabet" "$sub"
diff --git a/templates/.bin/setbg.sh b/templates/.bin/setbg.sh
new file mode 100755
index 0000000..14abb30
--- /dev/null
+++ b/templates/.bin/setbg.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+feh --bg-fill "$1"
diff --git a/templates/.bin/taf b/templates/.bin/taf
new file mode 100755
index 0000000..9564b95
--- /dev/null
+++ b/templates/.bin/taf
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+jq="/usr/bin/jq"
+if [[ ! -x "$jq" && -x "/usr/local/bin/jq" ]]; then
+ jq="/usr/local/bin/jq"
+fi
+
+station=$(echo -n "$1" | tr "a-z" "A-Z")
+json=$(curl -s "https://avwx.rest/api/taf/${station:-KBOS}")
+echo "$json" | "$jq" --raw-output '.["Raw-Report"]' 2>&1
+