summary refs log tree commit diff
path: root/Completion/Base/_argument_sets
blob: ad59effdc5a15f5f377e4b7278c8bd6976a40f90 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#autoload

local all ret=1 end xor has_args had_args ostate ocontext oopt_args r
local opre="$PREFIX" oipre="$IPREFIX" ocur="$CURRENT"
local osuf="$SUFFIX" oisuf="$ISUFFIX" owords

owords="$words[@]"

end=$argv[(i)-]
[[ end -gt $# ]] && return 1

all=( "${(@)argv[1,end]}" )

shift end

xor=()
ostate=()
ocontext=()

while true; do
  end=$argv[(i)-]

  _arguments -M xor "$1" "$all[@]" "${(@)argv[2,end-1]}"
  r=$?

  oopt_args=( "$oopt_args[@]" "${(kv)opt_args}" )
  if [[ r -eq 300 ]]; then
    ret=300
    ostate=( "$ostate[@]" "$state[@]" )
    ocontext=( "$ocontext[@]" "$context[@]" )
    PREFIX="$opre"   SUFFIX="$osuf"
    IPREFIX="$oipre" ISUFFIX="$oisuf"
    CURRENT="$ocur"  words=( "$owords[@]" )
  elif [[ "$r$ret" = 01 ]]; then
    ret=0
  fi
  
  [[ end -gt $# ]] && break

  shift end
done

opt_args=( "$oopt_args[@]" )

if [[ ret -eq 300 ]]; then
  state=( "$ostate[@]" )
  context=( "$ocontext[@]" )
elif [[ -z "$has_args" ]]; then
  if [[ -n "$had_args" ]]; then
    _message "no more arguments"
  else
    _message "no arguments"
  fi
fi

return ret