about summary refs log tree commit diff
path: root/Completion/Base
diff options
context:
space:
mode:
authorSven Wischnowsky <wischnow@users.sourceforge.net>2001-06-13 11:08:54 +0000
committerSven Wischnowsky <wischnow@users.sourceforge.net>2001-06-13 11:08:54 +0000
commitd8144700423a6a9b390718fa51c4c93f01e4ae2f (patch)
treecc81d55f75a961c815c8a3a882db118b1a0183b6 /Completion/Base
parent874a12ae7aa286a7e09ea6e975cfa16e18103b97 (diff)
downloadzsh-d8144700423a6a9b390718fa51c4c93f01e4ae2f.tar.gz
zsh-d8144700423a6a9b390718fa51c4c93f01e4ae2f.tar.xz
zsh-d8144700423a6a9b390718fa51c4c93f01e4ae2f.zip
*** empty log message ***
Diffstat (limited to 'Completion/Base')
-rw-r--r--Completion/Base/Utility/_values158
1 files changed, 158 insertions, 0 deletions
diff --git a/Completion/Base/Utility/_values b/Completion/Base/Utility/_values
new file mode 100644
index 000000000..bb0337911
--- /dev/null
+++ b/Completion/Base/Utility/_values
@@ -0,0 +1,158 @@
+#autoload
+
+local subopts opt usecc garbage
+
+subopts=()
+zparseopts -D -E -a garbage C=usecc O:=subopts M: J: V: 1 2 n F: X:
+
+(( $#subopts )) && subopts=( "${(@P)subopts[2]}" )
+
+if compvalues -i "$@"; then
+
+  local noargs args opts descr action expl sep argsep subc test='*'
+  local oldcontext="$curcontext"
+
+  compvalues -S argsep
+  compvalues -s sep && [[ -n "$sep" ]] && test="[^${(q)sep}]#"
+
+  if ! compvalues -D descr action; then
+
+    _tags values || return 1
+
+    curcontext="${oldcontext%:*}:values"
+
+    compvalues -V noargs args opts
+
+    if [[ -n "$argsep" && "$PREFIX" = *${argsep}${~test} ]]; then
+      local name
+
+      name="${PREFIX%%${argsep}*}"
+      if compvalues -L "$name" descr action; then
+        IPREFIX="${IPREFIX}${name}${argsep}"
+        PREFIX="${PREFIX#*${argsep}}"
+      else
+        local prefix suffix
+
+	prefix="${PREFIX#*${argsep}}"
+	suffix="$SUFFIX"
+	PREFIX="$name"
+	SUFFIX=''
+	args=( "$args[@]" "$opts[@]" )
+	compadd -M 'r:|[_-]=* r:|=*' -D args - "${(@)args[@]%%:*}"
+
+	[[ $#args -ne 1 ]] && return 1
+
+        PREFIX="$prefix"
+	SUFFIX="$suffix"
+        IPREFIX="${IPREFIX}${args[1]%%:*}${argsep}"
+	compvalues -L "${args[1]%%:*}" descr action subc
+	curcontext="${oldcontext%:*}:$subc"
+      fi
+    else
+      compvalues -d descr
+      if [[ ${#noargs}+${#args}+${#opts} -ne 1 ]] && compvalues -s sep; then
+        sep=( "-qQS" "$sep" )
+      else
+        sep=()
+      fi
+
+      _describe "$descr" \
+        noargs "$sep[@]" -M 'r:|[_-]=* r:|=*' -- \
+        args -S "${argsep}" -M 'r:|[_-]=* r:|=*' -- \
+        opts -qS "${argsep}" -M 'r:|[_-]=* r:|=*'
+
+      curcontext="$oldcontext"
+
+      return
+    fi
+  else
+    compvalues -C subc
+    curcontext="${oldcontext%:*}:$subc"
+  fi
+
+  if ! _tags arguments; then
+    curcontext="$oldcontext"
+    return 1
+  fi
+
+  _description arguments expl "$descr"
+
+  # We add the separator character as a autoremovable suffix unless
+  # we have only one possible value left.
+
+  sep=()
+  [[ ${#snames}+${#names}+${#onames} -ne 1 ]] && compvalues -s sep &&
+      expl=( "-qS$sep" "$expl[@]" ) sep=( "-qS$sep" )
+
+  if [[ "$action" = -\>* ]]; then
+    compvalues -v val_args
+    state="${${action[3,-1]##[ 	]#}%%[ 	]#}"
+    if [[ -n "$usecc" ]]; then
+      curcontext="${oldcontext%:*}:$subc"
+    else
+      context="$subc"
+    fi
+    compstate[restore]=''
+    return 1
+  else
+    typeset -A val_args
+
+    compvalues -v val_args
+
+    if [[ "$action" = \ # ]]; then
+
+      # An empty action means that we should just display a message.
+
+      _message "$descr"
+      return 1
+
+    elif [[ "$action" = \(\(*\)\) ]]; then
+      local ws
+
+      # ((...)) contains literal strings with descriptions.
+
+      eval ws\=\( "${action[3,-3]}" \)
+
+      _describe "$descr" ws -M 'r:|[_-]=* r:|=*' "$subopts[@]" "$sep[@]"
+
+    elif [[ "$action" = \(*\) ]]; then
+
+      # Anything inside `(...)' is added directly.
+
+      eval ws\=\( "${action[2,-2]}" \)
+
+      _all_labels arguments expl "$descr" compadd "$subopts[@]" "$sep[@]" -a - ws
+    elif [[ "$action" = \{*\} ]]; then
+
+      # A string in braces is evaluated.
+
+      while _next_label arguments expl "$descr"; do
+        eval "$action[2,-2]"
+      done
+    elif [[ "$action" = \ * ]]; then
+
+      # If the action starts with a space, we just call it.
+
+      eval "action=( $action )"
+      while _next_label arguments expl "$descr"; do
+        "$action[@]"
+      done
+    else
+
+      # Otherwise we call it with the description-arguments built above.
+
+      eval "action=( $action )"
+      while _next_label arguments expl "$descr"; do
+        "$action[1]" "$subopts[@]" "$expl[@]" "${(@)action[2,-1]}"
+      done
+    fi
+  fi
+
+  curcontext="$oldcontext"
+
+  [[ nm -ne "$compstate[nmatches]" ]]
+else
+  curcontext="$oldcontext"
+
+  return 1;
+fi