about summary refs log tree commit diff
path: root/Functions/Completion/__main_complete
blob: 48f2338dee87fb1683799fe04f98fd684070c3af (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
#helper

# The main loop of the completion code. This is what is called when 
# completion is attempted from the command line.
# The completion code gives us the special variables and the arguments
# from the command line are given as positional parameters.

local comp name

setopt localoptions nullglob rcexpandparam globdots
unsetopt markdirs globsubst shwordsplit nounset

# An entry for `--first--' is the replacement for `compctl -T'
# The `|| return 1' is used throughout: if a function producing matches
# returns non-zero this is interpreted as `do not try to produce more matches'
# (this is the replacement for `compctl -t').

comp="$comps[--first--]"
[[ -z "$comp" ]] || callcomplete comps --first-- "$@" || return 1

# For arguments we use the `__normal' function called via the convenience
# alias `compsub'.

if [[ $CONTEXT == argument || $CONTEXT == command ]]; then
  compsub
else
  # Let's see if we have a special completion definition for the other
  # possible contexts.

  comp=''

  case $CONTEXT in
  redirect)  name=--redirect--;;
  math)      name=--math--;;
  subscript) name=--subscript--;;
  value)     name=--value--;;
  condition) name=--condition--;;
  esac

  # If not, we use default completion, if any.

  comp="$comps[$name]"
  if [[ -z "$comp" ]]; then
     name=--default--
     comp="$comps[--default--]"
  fi
  [[ -z "$comp" ]] || callcomplete comps "$name" "$@" || return 1
fi