summaryrefslogtreecommitdiffstats
path: root/Completion/Base/Core/_dispatch
diff options
context:
space:
mode:
authorSven Wischnowsky <wischnow@users.sourceforge.net>2002-03-04 08:53:41 +0000
committerSven Wischnowsky <wischnow@users.sourceforge.net>2002-03-04 08:53:41 +0000
commitf56ba813bb92b1d61be91cb39df620b37a5a0588 (patch)
tree6b7432b8e437bfbd92b7859e0c9e38dd11277f1d /Completion/Base/Core/_dispatch
parentadd $redirections array to completion system parameters, containing informati... (diff)
downloadzsh-f56ba813bb92b1d61be91cb39df620b37a5a0588.tar
zsh-f56ba813bb92b1d61be91cb39df620b37a5a0588.tar.gz
zsh-f56ba813bb92b1d61be91cb39df620b37a5a0588.tar.bz2
zsh-f56ba813bb92b1d61be91cb39df620b37a5a0588.tar.lz
zsh-f56ba813bb92b1d61be91cb39df620b37a5a0588.tar.xz
zsh-f56ba813bb92b1d61be91cb39df620b37a5a0588.tar.zst
zsh-f56ba813bb92b1d61be91cb39df620b37a5a0588.zip
allow different sets of completion definitions selected with option -T to compdef; use this for parameter values and redirections (16755)
Diffstat (limited to 'Completion/Base/Core/_dispatch')
-rw-r--r--Completion/Base/Core/_dispatch98
1 files changed, 98 insertions, 0 deletions
diff --git a/Completion/Base/Core/_dispatch b/Completion/Base/Core/_dispatch
new file mode 100644
index 000000000..124aea112
--- /dev/null
+++ b/Completion/Base/Core/_dispatch
@@ -0,0 +1,98 @@
+#autoload
+
+local comp pat val name i ret=1 _compskip="$_compskip"
+local curcontext="$curcontext" service str comptype noskip def
+local __comps __patcomps __postpatcomps __services
+
+# If we get the option `-s', we don't reset `_compskip'.
+
+while [[ "$1" = -[sd] ]]; do
+ if [[ "$1" = -s ]]; then
+ noskip=yes
+ else
+ def=yes
+ fi
+ shift
+done
+
+[[ -z "$noskip" ]] && _compskip=
+
+comptype=$1
+
+__comps=_$1
+
+(( ${(P)+__comps} )) || return 1
+
+__patcomps=_pat$1
+__postpatcomps=_postpat$1
+__services=_service$1
+
+shift
+
+# See if there are any matching pattern completions.
+
+if [[ "$_compskip" != (all|*patterns*) ]]; then
+
+ for str in "$@"; do
+ [[ -n "$str" ]] || continue
+ service="${${(e):-\$${__services}[\$str]}:-$str}"
+ for i in "${(@e):-\$${__patcomps}[(K)\$str]}"; do
+ "$i" && ret=0
+ if [[ "$_compskip" = *patterns* ]]; then
+ break
+ elif [[ "$_compskip" = all ]]; then
+ _compskip=''
+ return ret
+ fi
+ done
+ done
+fi
+
+# Now look up the names in the normal completion array.
+
+ret=1
+for str in "$@"; do
+ [[ -n "$str" ]] || continue
+ name="$str"
+ comp="${(e):-\$${__comps}[\$str]}"
+ service="${${(e):-\$${__services}[\$str]}:-$str}"
+
+ [[ -z "$comp" ]] || break
+done
+
+# And generate the matches, probably using default completion.
+
+if [[ -n "$comp" ]]; then
+ _compskip=patterns
+ eval "$comp" && ret=0
+ [[ "$_compskip" = (all|*patterns*) ]] && return ret
+elif [[ "$_compskip" != *default* ]]; then
+ name=-default-
+ comp="${(e):-\$${__comps}[-default-]}"
+fi
+
+if [[ "$_compskip" != (all|*patterns*) ]]; then
+ for str; do
+ [[ -n "$str" ]] || continue
+ service="${${(e):-\$${__services}[\$str]}:-$str}"
+ for i in "${(@e):-\$${__postpatcomps}[(K)\$str]}"; do
+ _compskip=default
+ "$i" && ret=0
+ if [[ "$_compskip" = *patterns* ]]; then
+ break
+ elif [[ "$_compskip" = all ]]; then
+ _compskip=''
+ return ret
+ fi
+ done
+ done
+fi
+
+[[ "$name" = -default- && -n "$comp" &&
+ "$_compskip" != (all|*default*) ]] &&
+ service="${${(e):-\$${__services}[-default-]}:--default-}" &&
+ eval "$comp" && ret=0
+
+_compskip=''
+
+return ret