summaryrefslogtreecommitdiff
path: root/Completion/Base/_subscript
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Base/_subscript')
-rw-r--r--Completion/Base/_subscript58
1 files changed, 55 insertions, 3 deletions
diff --git a/Completion/Base/_subscript b/Completion/Base/_subscript
index 2b827a117..60d45370b 100644
--- a/Completion/Base/_subscript
+++ b/Completion/Base/_subscript
@@ -1,4 +1,56 @@
-#defcomp -subscript-
+#compdef -subscript-
-_compalso -math- "$@"
-[[ ${(Pt)${COMMAND}} = assoc* ]] && complist -k "( ${(kP)${COMMAND}} )"
+local expl
+
+if [[ "$PREFIX" = :* ]]; then
+ _wanted characters expl 'character class' \
+ compadd -p: -S ':]' alnum alpha blank cntrl digit graph \
+ lower print punct space upper xdigit
+elif [[ ${(Pt)${compstate[parameter]}} = assoc* ]]; then
+ local suf
+
+ [[ "$RBUFFER" != \]* ]] && suf=']'
+
+ _wanted association-keys expl 'association key' \
+ compadd -S "$suf" - "${(@kP)${compstate[parameter]}}"
+elif [[ ${(Pt)${compstate[parameter]}} = array* ]]; then
+ local list i j ret=1 disp
+
+ _tags indexes parameters
+
+ while _tags; do
+ if _requested indexes; then
+ ind=( {1..${#${(P)${compstate[parameter]}}}} )
+ if zstyle -T ":completion:${curcontext}:indexes" verbose; then
+ list=()
+ for i in "$ind[@]"; do
+ if [[ "$i" = ${PREFIX}*${SUFFIX} ]]; then
+ list=( "$list[@]"
+ "${i}:$(print -D ${(P)${compstate[parameter]}[$i]})" )
+ else
+ list=( "$list[@]" '' )
+ fi
+ done
+ zformat -a list ' -- ' "$list[@]"
+ disp=( -d list)
+ else
+ disp=()
+ fi
+
+ if [[ "$RBUFFER" = \]* ]]; then
+ _all_labels -V indexes expl 'array index' \
+ compadd -S '' "$disp[@]" - "$ind[@]" && ret=0
+ else
+ _all_labels -V indexes expl 'array index' \
+ compadd -S ']' "$disp[@]" - "$ind[@]" && ret=0
+ fi
+ fi
+ _requested parameters && _parameters && ret=0
+
+ (( ret )) || return 0
+ done
+
+ return 1
+else
+ _compalso -math-
+fi