about summary refs log tree commit diff
path: root/Completion/Base/Core/_dispatch
blob: 124aea112d206c438871d8a9e3f1073b7c4c005f (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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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