summaryrefslogtreecommitdiff
path: root/Completion
diff options
context:
space:
mode:
Diffstat (limited to 'Completion')
-rw-r--r--Completion/Base/Core/_main_complete3
-rw-r--r--Completion/Base/Utility/.distfiles2
-rw-r--r--Completion/Base/Utility/_arguments2
-rw-r--r--Completion/Base/Utility/_remote_files77
-rw-r--r--Completion/Base/Utility/_values1
-rw-r--r--Completion/Debian/Command/_update-alternatives38
-rw-r--r--Completion/Linux/Command/_modutils268
-rwxr-xr-xCompletion/Unix/Command/_getent5
-rw-r--r--Completion/Unix/Command/_git37
-rw-r--r--Completion/Unix/Command/_rlogin29
-rw-r--r--Completion/Unix/Command/_rsync28
-rw-r--r--Completion/Unix/Command/_ssh377
-rw-r--r--Completion/Unix/Command/_subversion2
-rw-r--r--Completion/Unix/Command/_tar2
-rw-r--r--Completion/X/Command/_x_utils33
-rw-r--r--Completion/X/Type/_x_font2
-rw-r--r--Completion/Zsh/Command/_zle2
-rw-r--r--Completion/Zsh/Type/_globquals16
-rw-r--r--Completion/compinit1
19 files changed, 549 insertions, 376 deletions
diff --git a/Completion/Base/Core/_main_complete b/Completion/Base/Core/_main_complete
index c50ff9db4..9bc5611de 100644
--- a/Completion/Base/Core/_main_complete
+++ b/Completion/Base/Core/_main_complete
@@ -23,7 +23,8 @@ eval "$_comp_setup"
local func funcs ret=1 tmp _compskip format nm call match min max i num\
_completers _completer _completer_num curtag _comp_force_list \
_matchers _matcher _c_matcher _matcher_num _comp_tags _comp_mesg \
- mesg str context state line opt_args val_args curcontext="$curcontext" \
+ mesg str context state state_descr line opt_args val_args \
+ curcontext="$curcontext" \
_last_nmatches=-1 _last_menu_style _def_menu_style _menu_style sel \
_tags_level=0 \
_saved_exact="${compstate[exact]}" \
diff --git a/Completion/Base/Utility/.distfiles b/Completion/Base/Utility/.distfiles
index 97d86bdbf..d5e359ae7 100644
--- a/Completion/Base/Utility/.distfiles
+++ b/Completion/Base/Utility/.distfiles
@@ -5,5 +5,5 @@ _arg_compile _combination _regex_arguments _values
_arguments _set_command _retrieve_cache _guard
_cache_invalid _describe _sep_parts _pick_variant
_call_function _multi_parts _store_cache _regex_words
-_complete_help_generic
+_complete_help_generic _remote_files
'
diff --git a/Completion/Base/Utility/_arguments b/Completion/Base/Utility/_arguments
index 126d9c315..d70c44259 100644
--- a/Completion/Base/Utility/_arguments
+++ b/Completion/Base/Utility/_arguments
@@ -344,6 +344,7 @@ if (( $# )) && comparguments -i "$autod" "$singopt[@]" "$@"; then
context=()
state=()
+ state_descr=()
while true; do
while _tags; do
@@ -376,6 +377,7 @@ if (( $# )) && comparguments -i "$autod" "$singopt[@]" "$@"; then
if (( ! $state[(I)$action] )); then
comparguments -W line opt_args
state+=( "$action" )
+ state_descr+=( "$descr" )
if [[ -n "$usecc" ]]; then
curcontext="${oldcontext%:*}:$subc"
else
diff --git a/Completion/Base/Utility/_remote_files b/Completion/Base/Utility/_remote_files
new file mode 100644
index 000000000..c35e3d3fa
--- /dev/null
+++ b/Completion/Base/Utility/_remote_files
@@ -0,0 +1,77 @@
+#autoload
+
+# Complete files on remote systems using SSH (and other programs). Needs
+# key-based authentication with no passwords or a running ssh-agent to work.
+#
+# Usage:
+# _remote_files [--no-files] [--no-dirs] -- <cmd> [<cmd options>]
+#
+# Options:
+# - --no-files: don't complete remote files
+# - --no-dirs: don't complete remote directories
+#
+# Commands:
+# - ssh: Additional options for non-interactive use are automatically added
+# (see below).
+# - All other commands are used unaltered.
+#
+# Examples:
+# - _remote_files -- ssh
+# Use ssh to retrieve the remote paths. The "--" is not optional!
+# - _remote_files --no-files -- ssh -2 -p 42
+# Use ssh with the option -2 and -p 42 to retrieve the remote paths and
+# complete only directories.
+# - _remote_files -- rsh
+# Use rsh to retrieve the remote paths.
+
+
+# There should be coloring based on all the different ls -F classifiers.
+local expl rempat remfiles remdispf remdispd args cmd cmd_args suf ret=1
+
+if zstyle -T ":completion:${curcontext}:files" remote-access; then
+
+ # Parse options to _remote_files. Stops at the first "--".
+ zparseopts -D -E -a args -no-files -no-dirs
+ shift
+
+ # Command to run on the remote system.
+ cmd="$1"
+ shift
+
+ # Handle arguments to ssh.
+ if [[ $cmd == ssh ]]; then
+ zparseopts -D -E -a cmd_args p: 1 2 4 6 F:
+ cmd_args="-o BatchMode=yes $cmd_args -a -x"
+ else
+ cmd_args="$@"
+ fi
+
+ if [[ -z $QIPREFIX ]]
+ then rempat="${PREFIX%%[^./][^/]#}\*"
+ else rempat="${(q)PREFIX%%[^./][^/]#}\*"
+ fi
+
+ remfiles=(${(M)${(f)"$(_call_program files $cmd $cmd_args ${IPREFIX%:} ls -d1FL -- "$rempat" 2>/dev/null)"}%%[^/]#(|/)})
+
+ compset -P '*/'
+ compset -S '/*' || suf='remote file'
+
+ remdispf=(${remfiles:#*/})
+ remdispd=(${(M)remfiles:#*/})
+
+ _tags files
+ while _tags; do
+ while _next_label files expl ${suf:-remote directory}; do
+ [[ ${args[(I)--no-files]} -eq 0 ]] && \
+ [[ -n $suf ]] && compadd "$@" "$expl[@]" -d remdispf \
+ ${(q)remdispf%[*=@|]} && ret=0
+ [[ ${args[(I)--no-dirs]} -eq 0 ]] && \
+ compadd ${suf:+-S/} "$@" "$expl[@]" -d remdispd \
+ ${(q)remdispd%/} && ret=0
+ done
+ (( ret )) || return 0
+ done
+ return ret
+else
+ _message -e remote-files 'remote file'
+fi
diff --git a/Completion/Base/Utility/_values b/Completion/Base/Utility/_values
index c2ae26465..ab0e46a9c 100644
--- a/Completion/Base/Utility/_values
+++ b/Completion/Base/Utility/_values
@@ -87,6 +87,7 @@ if compvalues -i "$@"; then
if [[ "$action" = -\>* ]]; then
compvalues -v val_args
state="${${action[3,-1]##[ ]#}%%[ ]#}"
+ state_descr="$descr"
if [[ -n "$usecc" ]]; then
curcontext="${oldcontext%:*}:$subc"
else
diff --git a/Completion/Debian/Command/_update-alternatives b/Completion/Debian/Command/_update-alternatives
index dd1d4fce3..ccf5084bf 100644
--- a/Completion/Debian/Command/_update-alternatives
+++ b/Completion/Debian/Command/_update-alternatives
@@ -16,11 +16,21 @@ _arguments -C \
'--version' \
'--altdir:altdir:_files -/' \
'--admindir:admindir:_files -/' \
+ '--log:log file:_files -/' \
+ '--force' \
+ '--skip-auto' \
'--install:*::alt:= ->install' \
'--remove:*::alt:= ->remove' \
- '--auto:name:_files -W $alterdir' \
- '--display:name:_files -W $alterdir' \
- '--config:name:_files -W $alterdir' && return
+ '--remove-all:name:_files -W "$alterdir"' \
+ '--auto:name:_files -W "$alterdir"' \
+ '--display:name:_files -W "$alterdir"' \
+ '--query:name:_files -W "$alterdir"' \
+ '--list:name:_files -W "$alterdir"' \
+ '--get-selections' \
+ '--set-selections' \
+ '--config:name:_files -W "$alterdir"' \
+ '--set:name:_files -W "$alterdir":path:_files -/' \
+ '--all' && return
while true; do
case "$state" in
@@ -28,29 +38,29 @@ while true; do
_call_function ret _update_alternatives_$state && return ret
state=
_arguments -C \
- '1:link:_files' \
- '2:name:_files -W $alterdir' \
- '3:path:_files' \
- '--slave:*::more:= ->islave' && return
+ '1:link:_files' \
+ '2:name:_files -W "$alterdir"' \
+ '3:path:_files' \
+ '--slave:*::more:= ->islave' && return
[[ -z $state ]] && return 1
;;
install)
_call_function ret _update_alternatives_$state && return ret
_arguments -C \
- '1:link:_files' \
- '2:name:_files -W $alterdir' \
- '3:path:_files' \
- '4:priority:' \
- '--slave:*::slave:= ->islave' && return
+ '1:link:_files' \
+ '2:name:_files -W "$alterdir"' \
+ '3:path:_files' \
+ '4:priority:' \
+ '--slave:*::slave:= ->islave' && return
[[ -z $state ]] && return 1
;;
remove)
_call_function ret _update_alternatives_$state && return ret
_arguments \
- '1:name:_files -W $alterdir' \
- '2:path:_files'
+ '1:name:_files -W "$alterdir"' \
+ '2:path:_files'
return
;;
diff --git a/Completion/Linux/Command/_modutils b/Completion/Linux/Command/_modutils
index e2671f2a7..48aeee973 100644
--- a/Completion/Linux/Command/_modutils
+++ b/Completion/Linux/Command/_modutils
@@ -2,143 +2,145 @@
_modules_caching_policy()
{
- # Rebuild every week, or if $modules_dir is newer than the cache
- local -a oldp
+ # Rebuild if $modules_dir is newer than the cache, or every week.
+ local -a oldp
- oldp=( "$1"(Nmw+1) )
- (( $#oldp )) || [[ $modules_dir -nt $1 ]]
+ oldp=( "$1"(Nmw+0) )
+ (( $#oldp )) || [[ $modules_dir -nt $1 ]]
}
-local curcontext="$curcontext" expl state line modules ign args ret=1
-local -r modules_dir=/lib/modules
-
-local update_policy
-zstyle -s ":completion:*:*:$service:*" cache-policy update_policy
-if [[ -z "$update_policy" ]]; then
- zstyle ":completion:*:*:$service:*" cache-policy _modules_caching_policy
-fi
-
-args=(
- '(-)'{-V,--version}'[print version]'
- '(-)'{-h,--help}'[print help text]'
-)
-
-case "$service" in
- lsmod) _arguments -s "$args[@]" && return ;;
-
- modinfo)
- _arguments -s -C "$args[@]" \
- '(-)'{-a,--author}"[display the module's author]" \
- '(-)'{-d,--description}"[display the module's description]" \
- '(-)'{-l,--license}"[display the module's license]" \
- '(-)'{-n,--filename}"[display the module's filename]" \
- '(-)'{-p,--parameters}'[display the typed parameters that a module may support]' \
- '(-)'{-F,--field}"[display only selected module's information]:module_field:(
- alias author depends description filename license parm)" \
- '(-)-k[use modules from a different kernel version]:kernel_version:(
- $(echo $modules_dir/*(/\:t)))' \
- '1:module file:->all_modules' && ret=0
- ;;
-
- modprobe)
- ign='-h --help -V --version -c --showconfig'
- _arguments -s -C "$args[@]" \
- "(-a --all $ign)"{-a,--all}'[load all matching modules]' \
- '(-)'{-c,--showconfig}'[show current configuration]' \
- "(-d --debug $ign)"{-d,--debug}'[print debug info]' \
- "(-k --autoclean $ign)"{-k,--autoclean}'[set autoclean]' \
- "(-n --show $ign)"{-n,--show}"[don't actually perform action]" \
- "(-q --quiet $ign)"{-q,--quiet}"[don't complain about insmod failures]" \
- "(-s --syslog $ign)"{-s,--syslog}'[report via syslog instead of stderr]' \
- "(* -t --type $ign)"{-t,--type}'[module type]:module type' \
- "(-v --verbose $ign)"{-v,--verbose}'[print all commands as executed]' \
- '(-C --config)'{-C,--config}'[specify config file]:config file:_files' \
- "(-r --remove -l --list -t --type -a --all $ign)"{-r,--remove}'[remove module (stacks)]' \
- "(-l --list -t --type -a --all $ign)"{'-i[ignore install/remove commands in config file]','--ignore-install[ignore install commands in config file]','--ignore-remove[ignore remove commands in config file]'} \
- "(* -l --list -r --remove $ign)"{-l,--list}'[list matching modules]' \
- "(-c $ign)1:modules:->loadable_modules" \
- "(-c -l --list -t --type $ign)*:params:->params" && ret=0
-
- [[ -n $state ]] && (( $+opt_args[-r] )) && state=loaded_modules
- ;;
-
- rmmod)
- _arguments -s -C "$args[@]" \
- '(-a --all)'{-a,--all}'[remove all unused autocleanable modules]' \
- '(-e --persist)'{-e,--persist}'[save persistent data]' \
- '(-r --stacks)'{-r,--stacks}'[remove a module stack]' \
- '(-s --syslog)'{-s,--syslog}'[output to syslog]' \
- '(-v --verbose)'{-v,--verbose}'[be verbose]' \
- '*:loaded module:->loaded_modules' && ret=0
- ;;
-
- insmod)
- _arguments \
- '1:module file:_files' \
- '*:module parameters:' && ret=0
- ;;
-esac
-
-case "$state" in
- loaded_modules|loadable_modules)
- if [[ -r /proc/modules ]]; then
- loaded_modules=(${${(f)"$(</proc/modules)"}%% *})
- elif [[ -x /sbin/lsmod ]]; then
- loaded_modules=(${${(f)"$(/sbin/lsmod)"}[2,-1]%% *})
- else
- return 1
- fi
+_modutils() {
+ local curcontext="$curcontext" expl state line modules ign args ret=1
+ local -r modules_dir=/lib/modules
- if [[ $state = loaded_modules ]]; then
- _wanted modules expl 'loaded module' compadd -a loaded_modules && return
- return ret
- fi
- ;&
-
- all_modules)
- local kver
- integer kver_idx
- if (( kver_idx=${words[(I)-k]} )); then
- kver=${words[kver_idx+1]}
- else
- kver=$(uname -r)
- fi
- if [[ -z $modules ]] && ! _cache_invalid modules-$kver && \
- ! _retrieve_cache modules-$kver;
- then
- # 2011-01-02 gi1242: Do we need .o files? Or is .ko enough?
- modules=( $modules_dir/$kver/(*~(source|build))/**/*.(o|ko|ko.gz)(.:t:r:r) )
- _store_cache modules-$kver modules
+ local update_policy
+ zstyle -s ":completion:*:*:$service:*" cache-policy update_policy
+ if [[ -z "$update_policy" ]]; then
+ zstyle ":completion:*:*:$service:*" cache-policy _modules_caching_policy
fi
- if [[ $state = loadable_modules ]]; then
- modules=( ${modules:#(${(j:|:)~${=loaded_modules//_/-}})} )
- fi
-
- _tags files modules
- while _tags; do
- _requested files expl "module file" _files -g '*.ko' && ret=0
- _requested modules expl module compadd -a modules && ret=0
- done
- ;;
-
- params)
- if compset -P '*='; then
- _message -e value 'parameter value'
- else
- local params
- params=( ${${(M)${(f)"$(_call_program module_parameter modinfo "$words[2]" 2>/dev/null)"}:#parm:*}##parm:[[:space:]]##} )
- if [[ $#params -eq 0 ]]; then
- _message -e parameter "This modules doesn't have parameters"
- else
- typeset -A val_args
-
- _values -S = -C -w 'module parameter' \
- ${${${(M)params:#*(:bool|\(bool\))}/:/[}/(bool| \(bool\))/]} \
- ${^${params:#*(:bool|\(bool\))}/:/[}"]:auto added argument: " && ret=0
- fi
- fi
- ;;
-esac
+ args=(
+ '(-)'{-V,--version}'[print version]'
+ '(-)'{-h,--help}'[print help text]'
+ )
+
+ case "$service" in
+ lsmod) _arguments -s "$args[@]" && return ;;
+
+ modinfo)
+ _arguments -s -C "$args[@]" \
+ '(-)'{-a,--author}"[display the module's author]" \
+ '(-)'{-d,--description}"[display the module's description]" \
+ '(-)'{-l,--license}"[display the module's license]" \
+ '(-)'{-n,--filename}"[display the module's filename]" \
+ '(-)'{-p,--parameters}'[display the typed parameters that a module may support]' \
+ '(-)'{-F,--field}"[display only selected module's information]:module_field:(alias author depends description filename license parm)" \
+ '(-)-k[use modules from a different kernel version]:kernel_version:($(echo $modules_dir/*(/\:t)))' \
+ '1:module file:->all_modules' && ret=0
+ ;;
+
+ modprobe)
+ ign='-h --help -V --version -c --showconfig'
+ _arguments -s -C "$args[@]" \
+ "(-a --all $ign)"{-a,--all}'[load all matching modules]' \
+ '(-)'{-c,--showconfig}'[show current configuration]' \
+ "(-d --debug $ign)"{-d,--debug}'[print debug info]' \
+ "(-k --autoclean $ign)"{-k,--autoclean}'[set autoclean]' \
+ "(-n --show $ign)"{-n,--show}"[don't actually perform action]" \
+ "(-q --quiet $ign)"{-q,--quiet}"[don't complain about insmod failures]" \
+ "(-s --syslog $ign)"{-s,--syslog}'[report via syslog instead of stderr]' \
+ "(* -t --type $ign)"{-t,--type}'[module type]:module type' \
+ "(-v --verbose $ign)"{-v,--verbose}'[print all commands as executed]' \
+ '(-C --config)'{-C,--config}'[specify config file]:config file:_files' \
+ "(-r --remove -l --list -t --type -a --all $ign)"{-r,--remove}'[remove module (stacks)]' \
+ "(-l --list -t --type -a --all $ign)"{'-i[ignore install/remove commands in config file]','--ignore-install[ignore install commands in config file]','--ignore-remove[ignore remove commands in config file]'} \
+ "(* -l --list -r --remove $ign)"{-l,--list}'[list matching modules]' \
+ "(-c $ign)1:modules:->loadable_modules" \
+ "(-c -l --list -t --type $ign)*:params:->params" && ret=0
+
+ [[ -n $state ]] && (( $+opt_args[-r] )) && state=loaded_modules
+ ;;
+
+ rmmod)
+ _arguments -s -C "$args[@]" \
+ '(-a --all)'{-a,--all}'[remove all unused autocleanable modules]' \
+ '(-e --persist)'{-e,--persist}'[save persistent data]' \
+ '(-r --stacks)'{-r,--stacks}'[remove a module stack]' \
+ '(-s --syslog)'{-s,--syslog}'[output to syslog]' \
+ '(-v --verbose)'{-v,--verbose}'[be verbose]' \
+ '*:loaded module:->loaded_modules' && ret=0
+ ;;
+
+ insmod)
+ _arguments \
+ '1:module file:_files' \
+ '*:module parameters:' && ret=0
+ ;;
+ esac
+
+ case "$state" in
+ loaded_modules|loadable_modules)
+ if [[ -r /proc/modules ]]; then
+ loaded_modules=(${${(f)"$(</proc/modules)"}%% *})
+ elif [[ -x /sbin/lsmod ]]; then
+ loaded_modules=(${${(f)"$(/sbin/lsmod)"}[2,-1]%% *})
+ else
+ return 1
+ fi
+
+ if [[ $state = loaded_modules ]]; then
+ _wanted modules expl 'loaded module' compadd -a loaded_modules \
+ && return
+ return ret
+ fi
+ ;&
+
+ all_modules)
+ local kver
+ integer kver_idx
+ if (( kver_idx=${words[(I)-k]} )); then
+ kver=${words[kver_idx+1]}
+ else
+ kver=$(uname -r)
+ fi
+
+ if _cache_invalid modules-$kver || ! _retrieve_cache modules-$kver;
+ then
+ # 2011-01-02 gi1242: Do we need .o files? Or is .ko enough?
+ modules=( $modules_dir/$kver/(*~(source|build))/**/*.(o|ko|ko.gz)(.:t:r:r) )
+ _store_cache modules-$kver modules
+ fi
+
+ if [[ $state = loadable_modules ]]; then
+ modules=( ${modules:#(${(j:|:)~${=loaded_modules//_/-}})} )
+ fi
+
+ _tags files modules
+ while _tags; do
+ _requested files expl "module file" _files -g '*.ko' && ret=0
+ _requested modules expl module compadd -a modules && ret=0
+ done
+ ;;
+
+ params)
+ if compset -P '*='; then
+ _message -e value 'parameter value'
+ else
+ local params
+ params=( ${${(M)${(f)"$(_call_program module_parameter modinfo "$words[2]" 2>/dev/null)"}:#parm:*}##parm:[[:space:]]##} )
+ if [[ $#params -eq 0 ]]; then
+ _message -e parameter "This modules doesn't have parameters"
+ else
+ typeset -A val_args
+
+ _values -S = -C -w 'module parameter' \
+ ${${${(M)params:#*(:bool|\(bool\))}/:/[}/(bool| \(bool\))/]} ${^${params:#*(:bool|\(bool\))}/:/[}"]:auto added argument: " && ret=0
+ fi
+ fi
+ ;;
+ esac
+
+ return ret
+}
-return ret
+_modutils "$@"
diff --git a/Completion/Unix/Command/_getent b/Completion/Unix/Command/_getent
index 57d2ec256..9644fa35b 100755
--- a/Completion/Unix/Command/_getent
+++ b/Completion/Unix/Command/_getent
@@ -25,8 +25,9 @@ case $state in
;;
databases)
if [[ $is_gnu = gnu ]]; then
- databases=( ${=${${(f)"$(_call_program databases $words[1] --help \
- 2>/dev/null)"}[(r)Supported*,-1]}[2,-1]} )
+ databases=( "${(@)${(@f)$(_call_program databases $words[1] --help \
+ 2>/dev/null)}[(r)Supported*,-1]}" )
+ databases=( "${=${(@)databases[2,${(@)databases[(i)]}-1]}}" )
else
databases=( passwd group hosts ipnodes services protocols ethers networks netmasks )
fi
diff --git a/Completion/Unix/Command/_git b/Completion/Unix/Command/_git
index 4a830f281..8a48c04b7 100644
--- a/Completion/Unix/Command/_git
+++ b/Completion/Unix/Command/_git
@@ -2619,7 +2619,7 @@ _git-pack-refs () {
_git-prune () {
_arguments -S \
'(-n --dry-run)'{-n,--dry-run}'[do not remove anything; just report what would be removed]' \
- '(-v --verbose)'{-v,--rerbose}'[report all removed objects]' \
+ '(-v --verbose)'{-v,--verbose}'[report all removed objects]' \
'--expire[only expire loose objects older than given date]: :__git_datetimes' \
'*:: :__git_heads'
}
@@ -5444,39 +5444,6 @@ __git_tree_files () {
# Repository Argument Types
-# _remote_files
-_remote_files_git () {
- # FIXME: these should be imported from _ssh
- # TODO: this should take -/ to only get directories
- # There should be coloring based on all the different ls -F classifiers.
- local expl rempat remfiles remdispf remdispd args suf ret=1
-
- if zstyle -T ":completion:${curcontext}:files" remote-access; then
- zparseopts -D -E -a args p: 1 2 4 6 F:
- if [[ -z $QIPREFIX ]]
- then rempat="${PREFIX%%[^./][^/]#}\*"
- else rempat="${(q)PREFIX%%[^./][^/]#}\*"
- fi
- remfiles=(${(M)${(f)"$(_call_program files ssh $args -a -x ${IPREFIX%:} ls -d1FL "$rempat" 2>/dev/null)"}%%[^/]#(|/)})
- compset -P '*/'
- compset -S '/*' || suf='remote file'
-
- remdispd=(${(M)remfiles:#*/})
-
- _tags files
- while _tags; do
- while _next_label files expl ${suf:-remote directory}; do
- compadd ${suf:+-S/} "$@" "$expl[@]" -d remdispd \
- ${(q)remdispd%/} && ret=0
- done
- (( ret )) || return 0
- done
- return ret
- else
- _message -e remote-files 'remote file'
- fi
-}
-
(( $+functions[__git_remote_repositories] )) ||
__git_remote_repositories () {
local service
@@ -5484,7 +5451,7 @@ __git_remote_repositories () {
service= _ssh
if compset -P '*:'; then
- _remote_files_git
+ _remote_files --no-files -- ssh
else
_ssh_hosts -S:
fi
diff --git a/Completion/Unix/Command/_rlogin b/Completion/Unix/Command/_rlogin
index 0d8355bfb..a04c6d068 100644
--- a/Completion/Unix/Command/_rlogin
+++ b/Completion/Unix/Command/_rlogin
@@ -1,32 +1,5 @@
#compdef rlogin rsh remsh=rsh rcp
-_rcp_remote_files () {
- # There should be coloring based on all the different ls -F classifiers.
- local expl remfiles remdispf remdispd suf ret=1
-
- if zstyle -T ":completion:${curcontext}:" remote-access; then
- remfiles=(${(M)${(f)"$(rsh ${IPREFIX%:} ls -d1F ${(Q)PREFIX%%[^./][^/]#}\* 2>/dev/null)"}%%[^/]#(|/)})
- compset -P '*/'
- compset -S '/*' || suf='remote file'
-
- remdispf=(${remfiles:#*/})
- remdispd=(${(M)remfiles:#*/})
-
- _tags files
- while _tags; do
- while _next_label files expl ${suf:-remote directory}; do
- [[ -n $suf ]] && compadd "$@" "$expl[@]" -d remdispf \
- ${(q)remdispf%[*=@|]} && ret=0
- compadd ${suf:+-S/} "$@" "$expl[@]" -d remdispd \
- ${(q)remdispd%/} && ret=0
- done
- (( ret )) || return 0
- done
- else
- _message -e remote-files 'remote file'
- fi
-}
-
_rlogin () {
case "$service" in
rlogin)
@@ -65,7 +38,7 @@ _rlogin () {
if [[ -n "$state" ]]; then
if compset -P '*:'; then
- _rcp_remote_files && ret=0
+ _remote_files -- rsh && ret=0
elif compset -P '*@'; then
_wanted hosts expl host _rlogin_hosts -S: && ret=0
else
diff --git a/Completion/Unix/Command/_rsync b/Completion/Unix/Command/_rsync
index b999c1bbd..f24a06e47 100644
--- a/Completion/Unix/Command/_rsync
+++ b/Completion/Unix/Command/_rsync
@@ -59,33 +59,7 @@ elif compset -P 1 '*::' || compset -P 1 'rsync://*/'; then
elif compset -P 'rsync://'; then
_rsync_user_or_host / "$@"
elif compset -P 1 '*:'; then
-
- if zstyle -T ":completion:${curcontext}:files" remote-access; then
- if [[ -z $QIPREFIX ]]
- then rempat="${PREFIX%%[^./][^/]#}\*"
- else rempat="${(q)PREFIX%%[^./][^/]#}\*"
- fi
- remfiles=(${(M)${(f)"$(_call_program files ssh -a -x ${IPREFIX%:} ls -d1FL "$rempat" 2>/dev/null)"}%%[^/]#(|/)})
- compset -P '*/'
- compset -S '/*' || suf='remote file'
-
- remdispf=(${remfiles:#*/})
- remdispd=(${(M)remfiles:#*/})
-
- _tags files
- while _tags; do
- while _next_label files expl ${suf:-remote directory}; do
- [[ -n $suf ]] && compadd "$@" "$expl[@]" -d remdispf \
- ${(q)remdispf%[*=@|]} && ret=0
- compadd ${suf:+-S/} "$@" "$expl[@]" -d remdispd \
- ${(q)remdispd%/} && ret=0
- done
- (( ret )) || return 0
- done
- else
- _message -e remote-files 'remote file'
- fi
-
+ _remote_files -- ssh
else
_rsync_user_or_host : "$@"
fi
diff --git a/Completion/Unix/Command/_ssh b/Completion/Unix/Command/_ssh
index 0ec9c84a0..8f1fb74aa 100644
--- a/Completion/Unix/Command/_ssh
+++ b/Completion/Unix/Command/_ssh
@@ -5,40 +5,6 @@
# TODO: update ssh-keygen (not based on 5.9)
# TODO: sshd, ssh-keyscan, ssh-keysign
-
-_remote_files () {
- # There should be coloring based on all the different ls -F classifiers.
- local expl rempat remfiles remdispf remdispd args suf ret=1
-
- if zstyle -T ":completion:${curcontext}:files" remote-access; then
- zparseopts -D -E -a args p: 1 2 4 6 F:
- if [[ -z $QIPREFIX ]]
- then rempat="${PREFIX%%[^./][^/]#}\*"
- else rempat="${(q)PREFIX%%[^./][^/]#}\*"
- fi
- remfiles=(${(M)${(f)"$(_call_program files ssh -o BatchMode=yes $args -a -x ${IPREFIX%:} ls -d1FL -- "$rempat" 2>/dev/null)"}%%[^/]#(|/)})
- compset -P '*/'
- compset -S '/*' || suf='remote file'
-
- remdispf=(${remfiles:#*/})
- remdispd=(${(M)remfiles:#*/})
-
- _tags files
- while _tags; do
- while _next_label files expl ${suf:-remote directory}; do
- [[ -n $suf ]] && compadd "$@" "$expl[@]" -d remdispf \
- ${(q)remdispf%[*=@|]} && ret=0
- compadd ${suf:+-S/} "$@" "$expl[@]" -d remdispd \
- ${(q)remdispd%/} && ret=0
- done
- (( ret )) || return 0
- done
- return ret
- else
- _message -e remote-files 'remote file'
- fi
-}
-
_ssh () {
local curcontext="$curcontext" state line expl common tmp cmds suf ret=1
typeset -A opt_args
@@ -49,6 +15,7 @@ _ssh () {
'(-6)-4[forces ssh to use IPv4 addresses only]'
'(-4)-6[forces ssh to use IPv6 addresses only]'
'-C[compress data]'
+ # for protocol version 2, this can be a comma-separated list
'-c+[select encryption cipher]:encryption cipher:(idea des 3des blowfish arcfour tss none)'
'-F+[specify alternate config file]:config file:_files'
'-i+[select identity file]:SSH identity file:_files'
@@ -70,25 +37,20 @@ _ssh () {
'(-a)-A[enables forwarding of the authentication agent connection]' \
'(-A)-a[disable forwarding of authentication agent connection]' \
'(-P)-b+[specify interface to transmit on]:bind address:_bind_addresses' \
- '-D+[specify a dynamic port forwarding]:[bind-address]\:port' \
- '-e+[set escape character]:escape character (or `none'"'"'):' \
+ '-D+[specify a dynamic port forwarding]:dynamic port forwarding:->dynforward' \
+ '-e+[set escape character]:escape character (or `none'\''):' \
'(-n)-f[go to background]' \
'-g[allow remote hosts to connect to local forwarded ports]' \
- '-I+[specify the PKCS#11 shared library to use]' \
+ '-I+[specify smartcard device]:device:_files' \
'-K[enable GSSAPI-based authentication and forwarding]' \
'-k[disable forwarding of GSSAPI credentials]' \
'*-L[specify local port forwarding]:local port forwarding:->forward' \
'-l+[specify login name]:login name:_ssh_users' \
'-M[master mode for connection sharing]' \
- '(-1)-m+[specify mac algorithms]:mac spec' \
+ '(-1)-m+[specify mac algorithms]:mac spec:->macs' \
'(-1)-N[do not execute a remote command (protocol version 2 only)]' \
'-n[redirect stdin from /dev/null]' \
- '-O[control active connection multiplexing master process]:multiplex control command:((
- check\:"check that the master process is running"
- forward\:"request forwardings without command execution"
- cancel\:"cancel forwardings"
- exit\:"request the master to exit"
- stop\:"request the master to stop accepting further multiplexing requests"))' \
+ '-O:multiplex control command:((check\:"check master process is running" exit\:"request the master to exit" forward\:"request forward without command execution" stop\:"request the master to stop accepting further multiplexing requests"))' \
'-P[use non privileged port]' \
'-p+[specify port on remote host]:port number on remote host' \
'(-v)*-q[quiet operation]' \
@@ -99,19 +61,19 @@ _ssh () {
'(-T)-t[force pseudo-tty allocation]' \
'-V[show version number]' \
'(-q)*-v[verbose mode]' \
- '(-N)-W[forward standard input/output over host:port (protocol version 2 only)]:host\:port' \
- '-w[request tunnel device forwarding with the specified tun devices]:local_tun[\:remote_tun]' \
+ '-W[forward standard input and output to host]:stdinout forward:->hostport' \
+ '-w[request tunnel device forwarding]:local_tun[\:remote_tun] (integer or "any"):' \
'(-x -Y)-X[enable (untrusted) X11 forwarding]' \
'(-X -Y)-x[disable X11 forwarding]' \
'(-x -X)-Y[enable trusted X11 forwarding]' \
- '-y[send log information using the syslog module]' \
+ '-y[send log info via syslog instead of stderr]' \
':remote host name:->userhost' \
'*::args:->command' "$common[@]" && ret=0
;;
scp)
_arguments -C -s \
'-3[copy through local host, not directly between the remote hosts]' \
- '-B[batch mode (don'"'"'t ask for passphrases)]' \
+ '-B[batch mode (don'\''t ask for passphrases)]' \
'*:file:->file' "$common[@]" "$common_transfer[@]" && ret=0
;;
ssh-add)
@@ -146,7 +108,7 @@ _ssh () {
_arguments \
'-q[silence ssh-keygen]' \
"($cmds -P)-b[specify number of bits in key]:bits in key" \
- "($cmds -P)-t[specify the type of the key to create]:key type:(rsa1 rsa dsa)" \
+ "($cmds -P)-t[specify the type of the key to create]:key type:(rsa1 rsa dsa ecdsa)" \
"(${cmds#-p })-N[provide new passphrase]:new passphrase" \
"($cmds -b -t)-C[provide new comment]:new comment" \
'(-D)-f[key file]:key file:_files' \
@@ -179,83 +141,209 @@ _ssh () {
case "$lstate" in
option)
- if compset -P '*[= ]'; then
+ if compset -P '*='; then
case "$IPREFIX" in
- *(#i)(afstokenpassing|batchmode|compression|fallbacktorsh|forward(agent|x11)|keepalive|passwordauthentication|rhosts(|rsa)authentication|rsaauthentication|usersh|kerberos(authetication|tgtparsing)|useprivileged)*)
- _wanted values expl 'truth value' compadd yes no && ret=0
+ *(#i)(afstokenpassing|batchmode|challengeresponseauthentication|checkhostip|clearallforwardings|compression|enablesshkeysign|exitonforwardfailure|fallbacktorsh|forward(agent|x11)|forwardx11trusted|gatewayports|gssapiauthentication|gssapidelegatecredentials|gssapitrustdns|hashknownhosts|hostbasedauthentication|identitiesonly|kbdinteractiveauthentication|(tcp|)keepalive|nohostauthenticationforlocalhost|passwordauthentication|permitlocalcommand|pubkeyauthentication|rhosts(|rsa)authentication|rsaauthentication|usersh|kerberos(authentication|tgtpassing)|useprivilegedport|visualhostkey)=*)
+ _wanted values expl 'truth value' compadd yes no && ret=0
+ ;;
+ *(#i)addressfamily=*)
+ _wanted values expl 'address family' compadd any inet inet6 && ret=0
;;
- *(#i)ciphers*)
+ *(#i)bindaddress=*)
+ _wanted bind-addresses expl 'bind address' _bind_addresses && ret=0
+ ;;
+ *(#i)ciphers=*)
_values -s , 'encryption cipher' \
- '3des-cbc' \
- 'aes128-cbc' \
- 'aes192-cbc' \
- 'aes256-cbc' \
- 'aes128-ctr' \
- 'aes192-ctr' \
- 'aes256-ctr' \
- 'arcfour128' \
- 'arcfour256' \
- 'arcfour' \
- 'blowfish-cbc' \
- 'cast128-cbc' \
- \
- 'rijndael128-cbc' \
- 'rijndael192-cbc' \
- 'rijndael256-cbc' \
- 'rijndael-cbc@lysator.liu.se' \
- && ret=0
- ;;
- *(#i)cipher*)
- _wanted values expl 'encryption cipher (protocol version 1)' \
+ '3des-cbc' \
+ 'aes128-cbc' \
+ 'aes192-cbc' \
+ 'aes256-cbc' \
+ 'aes128-ctr' \
+ 'aes192-ctr' \
+ 'aes256-ctr' \
+ 'arcfour128' \
+ 'arcfour256' \
+ 'arcfour' \
+ 'blowfish-cbc' \
+ 'cast128-cbc' \
+ \
+ 'rijndael128-cbc' \
+ 'rijndael192-cbc' \
+ 'rijndael256-cbc' \
+ 'rijndael-cbc@lysator.liu.se' \
+ && ret=0
+ ;;
+ *(#i)cipher=*)
+ _wanted values expl 'encryption cipher (protocol version 1)' \
compadd blowfish 3des des idea arcfour tss none && ret=0
;;
- *(#i)controlmaster*)
- _wanted values expl 'truthish value' compadd yes no auto autoask && ret=0
- ;;
- *(#i)controlpath*)
+ *(#i)compressionlevel=*)
+ _values 'compression level' {1..9} && ret=0
+ ;;
+ *(#i)connectionattempts=*)
+ _message -e 'connection attempts' && ret=0
+ ;;
+ *(#i)connecttimeout=*)
+ _message -e 'connection timeout' && ret=0
+ ;;
+ *(#i)controlmaster=*)
+ _wanted values expl 'truthish value' compadd yes no auto autoask && ret=0
+ ;;
+ *(#i)controlpath=*)
_description files expl 'path to control socket'
_files "$expl[@]" && ret=0
- ;;
- *(#i)globalknownhostsfile*)
+ ;;
+ *(#i)controlpersist=*)
+ _message -e 'timeout'
+ ret=0
+ _wanted values expl 'truth value' compadd yes no && ret=0
+ ;;
+ *(#i)escapechar=*)
+ _message -e 'escape character (or `none'\'')'
+ ret=0
+ ;;
+ *(#i)forwardx11timeout=*)
+ _message -e 'timeout'
+ ret=0
+ ;;
+ *(#i)globalknownhostsfile=*)
_description files expl 'global file with known hosts'
_files "$expl[@]" && ret=0
;;
- *(#i)hostname*)
- _wanted hosts expl 'real host name to log into' _ssh_hosts && ret=0
+ *(#i)hostname=*)
+ _wanted hosts expl 'real host name to log into' _ssh_hosts && ret=0
;;
- *(#i)identityfile*)
+ *(#i)hostkeyalgorithms=*)
+ _values -s , 'host key algorithms' \
+ 'ecdsa-sha2-nistp256-cert-v01@openssh.com' \
+ 'ecdsa-sha2-nistp384-cert-v01@openssh.com' \
+ 'ecdsa-sha2-nistp521-cert-v01@openssh.com' \
+ 'ssh-rsa-cert-v01@openssh.com' \
+ 'ssh-dss-cert-v01@openssh.com' \
+ 'ssh-rsa-cert-v00@openssh.com' \
+ 'ssh-dss-cert-v00@openssh.com' \
+ 'ecdsa-sha2-nistp256' \
+ 'ecdsa-sha2-nistp384' \
+ 'ecdsa-sha2-nistp521' \
+ 'ssh-rsa' \
+ 'ssh-dss' && ret=0
+ ;;
+ *(#i)identityfile=*)
_description files expl 'SSH identity file'
_files "$expl[@]" && ret=0
;;
- *(#i)(local|remote)forward*)
+ *(#i)ipqos=*)
+ local descr
+ if [[ $PREFIX = *\ *\ * ]]; then return 1; fi
+ if compset -P '* '; then
+ descr='QoS for non-interactive sessions'
+ else
+ descr='QoS [for interactive sessions if second value given, separated by white space]'
+ fi
+ _values $descr 'af11' 'af12' 'af13' 'af14' 'af22' \
+ 'af23' 'af31' 'af32' 'af33' 'af41' 'af42' 'af43' \
+ 'cs0' 'cs1' 'cs2' 'cs3' 'cs4' 'cs5' 'cs6' 'cs7' 'ef' \
+ 'lowdelay' 'throughput' 'reliability' && ret=0
+ ;;
+ *(#i)(local|remote)forward=*)
state=forward
;;
- *(#i)preferredauthentications*)
+ *(#i)dynamicforward=*)
+ state=dynforward
+ ;;
+ *(#i)kbdinteractivedevices=*)
+ _values -s , 'keyboard-interactive authentication methods' \
+ 'bsdauth' 'pam' 'skey' && ret=0
+ ;;
+ *(#i)kexalgorithms=*)
+ _values -s , 'KEX algorithms' \
+ ecdh-sha2-nistp256 ecdh-sha2-nistp384 ecdh-sha2-nistp521 \
+ diffie-hellman-group-exchange-sha256 \
+ diffie-hellman-group-exchange-sha1 \
+ diffie-hellman-group14-sha1 diffie-hellman-group1-sha1 && ret=0
+ ;;
+ *(#i)localcommand=*)
+ _description commands expl 'run command locally after connecting'
+ _command_names && ret=0
+ ;;
+ *(#i)loglevel=*)
+ _values 'log level' QUIET FATAL ERROR INFO VERBOSE\
+ DEBUG DEBUG1 DEBUG2 DEBUG3 && ret=0
+ ;;
+ *(#i)macs=*)
+ state=macs
+ ;;
+ *(#i)numberofpasswordprompts=*)
+ _message -e 'number of password prompts'
+ ret=0
+ ;;
+ *(#i)pkcs11provider=*)
+ _description files expl 'PKCS#11 shared library'
+ _files -g '*.so' "$expl[@]" && ret=0
+ ;;
+ *(#i)port=*)
+ _message -e 'port number on remote host'
+ ret=0
+ ;;
+ *(#i)preferredauthentications=*)
_values -s , 'authentication method' gssapi-with-mic \
hostbased publickey keyboard-interactive password && ret=0
;;
- *(#i)protocol*)
+ *(#i)protocol=*)
_values -s , 'protocol version' \
- '1' \
- '2' && ret=0
- ;;
- *(#i)proxycommand*)
+ '1' \
+ '2' && ret=0
+ ;;
+ *(#i)proxycommand=*)
compset -q
shift 1 words
(( CURRENT-- ))
_normal && ret=0
;;
- *(#i)stricthostkeychecking*)
+ *(#i)rekeylimit=*)
+ _message -e 'maximum number of bytes transmitted before renegotiating session key'
+ ret=0
+ ;;
+ *(#i)requesttty=*)
+ _values 'request a pseudo-tty' \
+ 'no[never request a TTY]' \
+ 'yes[always request a TTY when stdin is a TTY]' \
+ 'force[always request a TTY]' \
+ 'auto[request a TTY when opening a login session]' && ret=0
+ ;;
+ *(#i)sendenv=*)
+ _wanted envs expl 'environment variable' _parameters -g 'scalar*export*' && ret=0
+ ;;
+ *(#i)serveralivecountmax=*)
+ _message -e 'number of alive messages without replies before disconnecting'
+ ret=0
+ ;;
+ *(#i)serveraliveinterval=*)
+ _message -e 'timeout in seconds since last data was received to send alive message'
+ ret=0
+ ;;
+ *(#i)(stricthostkeychecking|verifyhostkeydns)=*)
_wanted values expl 'checking type' compadd yes no ask && ret=0
;;
- *(#i)userknownhostsfile*)
+ *(#i)tunnel=*)
+ _values 'request device forwarding' \
+ 'yes' \
+ 'point-to-point' \
+ 'ethernet' \
+ 'no' && ret=0
+ ;;
+ *(#i)tunneldevice=*)
+ _message -e 'local_tun[:remote_tun] (integer or "any")'
+ ret=0
+ ;;
+ *(#i)userknownhostsfile=*)
_description files expl 'user file with known hosts'
_files "$expl[@]" && ret=0
;;
- *(#i)user*)
- _wanted users expl 'user to log in as' _ssh_users && ret=0
+ *(#i)user=*)
+ _wanted users expl 'user to log in as' _ssh_users && ret=0
;;
- *(#i)xauthlocation*)
+ *(#i)xauthlocation=*)
_description files expl 'xauth program'
_files "$expl[@]" -g '*(-*)' && ret=0
;;
@@ -263,7 +351,7 @@ _ssh () {
else
# old options are after the empty "\"-line
_wanted values expl 'configure file option' \
- compadd -M 'm:{a-z}={A-Z}' -qS '=' - \
+ compadd -M 'm:{a-z}={A-Z}' -S '=' - \
AddressFamily \
BatchMode \
BindAddress \
@@ -291,6 +379,7 @@ _ssh () {
GlobalKnownHostsFile \
GSSAPIAuthentication \
GSSAPIDelegateCredentials \
+ GSSAPITrustDns \
HashKnownHosts \
Host \
HostbasedAuthentication \
@@ -351,16 +440,56 @@ _ssh () {
fi
;;
forward)
+ local port=false host=false listen=false bind=false
if compset -P 1 '*:'; then
- if compset -P '*:'; then
- _message -e port-numbers 'port number'
+ if [[ $IPREFIX != (*=|)<-65535>: ]]; then
+ if compset -P 1 '*:'; then
+ if compset -P '*:'; then
+ port=true
+ else
+ host=true
+ fi
+ else
+ listen=true
+ ret=0
+ fi
else
- _wanted hosts expl host _ssh_hosts -qS:
+ if compset -P '*:'; then
+ port=true
+ else
+ host=true
+ fi
fi
else
- _message -e port-numbers 'listen-port number'
+ listen=true
+ bind=true
fi
- return
+ $port && { _message -e port-numbers 'port number'; ret=0 }
+ $listen && { _message -e port-numbers 'listen-port number'; ret=0 }
+ $host && { _wanted hosts expl host _ssh_hosts -S: && ret=0 }
+ $bind && { _wanted bind-addresses expl bind-address _bind_addresses -S: && ret=0 }
+ return ret
+ ;;
+ dynforward)
+ _message -e port-numbers 'listen-port number'
+ if ! compset -P '*:'; then
+ _wanted bind-addresses expl bind-address _bind_addresses -qS:
+ fi
+ return 0
+ ;;
+ hostport)
+ if compset -P '*:'; then
+ _message -e port-numbers 'port number'
+ ret=0
+ else
+ _wanted hosts expl host _ssh_hosts -S: && ret=0
+ fi
+ return ret
+ ;;
+ macs)
+ _values -s , 'MAC algorithms' hmac-md5 hmac-sha1 umac-64@openssh.com \
+ hmac-ripemd160 hmac-sha1-96 hmac-md5-96 hmac-sha2-256 \
+ hmac-sha2-256-96 hmac-sha2-512 hmac-sha2-512-96 && ret=0
;;
command)
shift 1 words
@@ -370,47 +499,49 @@ _ssh () {
;;
userhost)
if compset -P '*@'; then
- _wanted hosts expl 'remote host name' _ssh_hosts && ret=0
+ _wanted hosts expl 'remote host name' _ssh_hosts && ret=0
elif compset -S '@*'; then
_wanted users expl 'login name' _ssh_users -S '' && ret=0
else
if (( $+opt_args[-l] )); then
- tmp=()
- else
- tmp=( 'users:login name:_ssh_users -qS@' )
- fi
- _alternative \
- 'hosts:remote host name:_ssh_hosts' \
- "$tmp[@]" && ret=0
+ tmp=()
+ else
+ tmp=( 'users:login name:_ssh_users -qS@' )
+ fi
+ _alternative \
+ 'hosts:remote host name:_ssh_hosts' \
+ "$tmp[@]" && ret=0
fi
;;
file)
if compset -P '*:'; then
- _remote_files ${(kv)~opt_args[(I)-[FP1246]]/-P/-p} && ret=0
+ _remote_files -- ssh ${(kv)~opt_args[(I)-[FP1246]]/-P/-p} && ret=0
elif compset -P '*@'; then
suf=( -S '' )
compset -S ':*' || suf=( -r: -S: )
_wanted hosts expl 'remote host name' _ssh_hosts $suf && ret=0
else
_alternative \
- 'files:: _files' \
- 'hosts:remote host name:_ssh_hosts -r: -S:' \
- 'users:user:_ssh_users -qS@' && ret=0
+ 'files:: _files' \
+ 'hosts:remote host name:_ssh_hosts -r: -S:' \
+ 'users:user:_ssh_users -qS@' && ret=0
fi
;;
rfile)
if compset -P '*:'; then
- _remote_files && ret=0
+ _remote_files -- ssh && ret=0
elif compset -P '*@'; then
_wanted hosts expl host _ssh_hosts -r: -S: && ret=0
else
_alternative \
- 'hosts:remote host name:_ssh_hosts -r: -S:' \
- 'users:user:_ssh_users -qS@' && ret=0
+ 'hosts:remote host name:_ssh_hosts -r: -S:' \
+ 'users:user:_ssh_users -qS@' && ret=0
fi
;;
esac
done
+
+ return ret
}
_ssh_users () {
@@ -438,17 +569,17 @@ _ssh_hosts () {
local IFS=$'\t ' key hosts host
while read key hosts; do
if [[ "$key" == (#i)host ]]; then
- for host in ${(z)hosts}; do
- case $host in
- (*[*?]*) ;;
- (*) config_hosts+=("$host") ;;
- esac
- done
+ for host in ${(z)hosts}; do
+ case $host in
+ (*[*?]*) ;;
+ (*) config_hosts+=("$host") ;;
+ esac
+ done
fi
done < "$config"
if (( ${#config_hosts} )); then
_wanted hosts expl 'remote host name' \
- compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' "$@" $config_hosts
+ compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' "$@" $config_hosts
fi
fi
}
diff --git a/Completion/Unix/Command/_subversion b/Completion/Unix/Command/_subversion
index 88142d805..21d809dd1 100644
--- a/Completion/Unix/Command/_subversion
+++ b/Completion/Unix/Command/_subversion
@@ -48,7 +48,7 @@ _svn () {
! _retrieve_cache svn-${cmd}-args;
then
args=(
- ${=${${${(M)${(f)"$(LC_ALL=C _call_program options svn help $cmd)"#(*Valid options:|(#e))}:#* :*}%% #:*}/ (arg|ARG)/:arg:}/(#b)-([[:alpha:]]) \[--([a-z-]##)\](:arg:)#/(--$match[2])-$match[1]$match[3] (-$match[1])--$match[2]$match[3]}
+ ${=${${${(M)${(f)"$(LC_ALL=C _call_program options svn help $cmd)"#(*Valid options:|(#e))}:#* :*}%% #:*}/ (arg|ARG)/:arg:}/(#b)(-##)([[:alpha:]]##) \[--([a-z-]##)\](:arg:)#/(--$match[3])$match[1]$match[2]$match[4] ($match[1]$match[2])--$match[3]$match[4]}
)
_store_cache svn-${cmd}-args args
fi
diff --git a/Completion/Unix/Command/_tar b/Completion/Unix/Command/_tar
index 4f3247291..ce5852453 100644
--- a/Completion/Unix/Command/_tar
+++ b/Completion/Unix/Command/_tar
@@ -177,7 +177,7 @@ else
fi
fi
if (( index )); then
- index="$~words[index+1]"
+ index=${~${(Q)words[index+1]}}
[[ $index = (.|..|)/* ]] || index=~+/$index
_files -W $index
else
diff --git a/Completion/X/Command/_x_utils b/Completion/X/Command/_x_utils
index 2e672fdc0..0ff0cf268 100644
--- a/Completion/X/Command/_x_utils
+++ b/Completion/X/Command/_x_utils
@@ -1,4 +1,6 @@
-#compdef xdpyinfo xwininfo xkill xfontsel xfd xev xhost xon xsetroot xwd xwud xrdb
+#compdef xdpyinfo xwininfo xkill xfontsel xfd xev xhost xon xsetroot xwd xwud xrdb xprop xlsatoms
+
+local ret=1 oret expl
case "$service" in
xdpyinfo)
@@ -13,6 +15,27 @@ xwininfo)
'(-id -root)-name:name: _x_window -n' \
'(-name -root)-id:id: _x_window'
;;
+xprop)
+ _x_arguments \
+ -{help,frame,notype,spy} \
+ '-grammar[show grammar for command line options]' \
+ '(-id -name)-root[use the root window as the target window]' \
+ '(-id -root)-name[specify target window by name]:name: _x_window -n' \
+ '(-name -root)-id[specify target window by window id]:id: _x_window' \
+ '-font[display the properties of a font]:font: _x_font' \
+ '-len[show at most n bytes of any property]:n' \
+ '*-fs[read more property formats from file]:file: _files' \
+ '*-remove[specify an atom to remove from the target window]:atoms:->atoms' \
+ '*-set[specify an atom and a value to set on the target window]:atoms:->atoms:value' \
+ '*-f:atoms:->atoms:format: ::dformat' \
+ '*:atoms:->atoms' && ret=0
+ ;;
+xlsatoms)
+ _x_arguments \
+ '*-format[printf-style format to use]:format' \
+ '*-range[atom values to list]:[num]-[num]' \
+ '*-name[name of single atom to print]:atom:->atoms'
+ ;;
xkill)
_x_arguments \
-frame \
@@ -163,3 +186,11 @@ xrdb)
'*:defaults file:_files'
;;
esac
+
+oret=$?
+if [[ $state == atoms ]]; then
+ _wanted atoms expl atoms compadd ${${(f)"$(_call_program atoms xlsatoms 2> /dev/null)"}#*$'\t'} && ret=0
+else
+ ret=$oret
+fi
+return ret
diff --git a/Completion/X/Type/_x_font b/Completion/X/Type/_x_font
index 134cfdf1c..a363b2775 100644
--- a/Completion/X/Type/_x_font
+++ b/Completion/X/Type/_x_font
@@ -9,7 +9,7 @@ _tags fonts || return 1
if (( ! $+_font_cache )); then
typeset -gU _font_cache
- _font_cache=( "${(@)^${(@f)$(_call_program fonts xlsfonts)}%%--*}--" )
+ _font_cache=( "${(@)^${(@f)$(_call_program fonts xlsfonts 2> /dev/null)}%%--*}--" )
fi
_wanted fonts expl font \
diff --git a/Completion/Zsh/Command/_zle b/Completion/Zsh/Command/_zle
index 80f217711..2bfc708e5 100644
--- a/Completion/Zsh/Command/_zle
+++ b/Completion/Zsh/Command/_zle
@@ -44,7 +44,7 @@ case "$state[1]" in
'(-)*:widget arguments: ' && ret=0
;;
(widget*)
- _wanted -C "$context[1]" widgets expl widget compadd -k widgets && ret=0
+ _wanted -C "$context[1]" widgets expl "${state_descr[1]:-widget}" compadd -k widgets && ret=0
;&
(function)
[[ $state[1] != *function ]] || # Handle fall-through
diff --git a/Completion/Zsh/Type/_globquals b/Completion/Zsh/Type/_globquals
index 778dfa822..9de7742ff 100644
--- a/Completion/Zsh/Type/_globquals
+++ b/Completion/Zsh/Type/_globquals
@@ -1,7 +1,8 @@
#autoload
-local state=qual expl char delim
+local state=qual expl char delim timespec
local -a alts
+local -A specmap
while [[ -n $PREFIX ]]; do
char=$PREFIX[1]
@@ -111,18 +112,19 @@ while [[ -n $PREFIX ]]; do
;;
([amc])
- if ! compset -P '([Mwhms]|)([-+]|)<->'; then
+ if ! compset -P '([Mwhmsd]|)([-+]|)<->'; then
# complete/skip relative time spec
alts=()
- if ! compset -P '[Mwhms]' && [[ -z $PREFIX ]]; then
- alts+=(
- "time-specifiers:time specifier:\
-((M\:months w\:weeks h\:hours m:\minutes s\:seconds))")
+ timespec=$PREFIX[1]
+ if ! compset -P '[Mwhmsd]' && [[ -z $PREFIX ]]; then
+ alts+=("time-specifiers:time specifier:\
+((M\:months w\:weeks h\:hours m:\minutes s\:seconds d\:days))")
fi
if ! compset -P '[-+]' && [[ -z $PREFIX ]]; then
alts+=("senses:sense:((-\:less\ than +\:more\ than))")
fi
- alts+=('digits:digit: ')
+ specmap=( M months w weeks h hours m minutes s seconds '(|+|-|d)' days)
+ alts+=('digits:digit ('${${specmap[(K)$timespec]}:-invalid time specifier}'):' )
_alternative $alts
return
fi
diff --git a/Completion/compinit b/Completion/compinit
index d25642e5d..489d662c3 100644
--- a/Completion/compinit
+++ b/Completion/compinit
@@ -144,6 +144,7 @@ _comp_options=(
NO_globsubst
NO_histsubstpattern
NO_ignorebraces
+ NO_ignoreclosebraces
NO_kshglob
NO_ksharrays
NO_kshtypeset