about summary refs log tree commit diff
path: root/Completion/Core/_main_complete
blob: c303153959219944cf8a3dfa0caeb51963729157 (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
99
100
101
#autoload

# The main loop of the completion code. This is what is called when 
# completion is attempted from the command line.
#
# Configuration keys used:
#
#  completer
#    This should be set to the names of the functions to generate the
#    matches separated by colons. E.g. with
#
#      compconf completer=_complete:_correct:_approximate
#
#    the code will first try normal completion. If that doesn't yield
#    any matches, correction is tried and if that doesn't yield
#    anything either, correcting completion is attempted.
#
#    These completer functions are only used when this function is called
#    without arguments. If arguments are given, they should be names of
#    completer functions which will then be called.
#
#  last_prompt
#    If this is set to `always' the cursor is moved up to the last prompt
#    after printing a list even if a numeric argument was given.
#
#
# Also, most completion functions use the configuration keys:
#
#  description_format
#    If this is set to a non-empty string, it will be displayed above
#    all matches generated. The sequence `%d' in this string is replaced
#    by a short description of what is completed in the current position
#    of the command line.
#
#  message_format
#    Like `description_format', but used in places where no completions
#    can automatically be generated but the completion system still wants
#    to give a hint what is expected in that position.
#
#  group_matches
#    If this is set to a non-empty string, different types of matches will
#    be put in different groups.


# If you want to complete only set or unset options for the unsetopt
# and setopt builtin, un-comment these lines:
#
#   local _set_options _unset_options
#
#   if zmodload -e parameter; then
#     _set_options=(${(k)options[(R)on]})
#     _unset_options=(${(k)options[(R)off]})
#   else
#     _set_options=("${(@f)$({ unsetopt kshoptionprint; setopt } 2>/dev/null)}")
#     _unset_options=("${(@f)$({ unsetopt kshoptionprint; unsetopt } 2>/dev/null)}")
#   fi
#
# This is needed because completion functions may set options locally
# which makes the output of setopt and unsetopt reflect a different
# state than the global one for which you are completing.


local comp ret=1 _compskip

setopt localoptions nullglob rcexpandparam
unsetopt markdirs globsubst shwordsplit nounset ksharrays

# Special completion contexts after `~' and `='.

if compset -P 1 '\='; then
  compstate[context]=equal
elif [[ "$PREFIX" != */* && "$PREFIX[1]" = '~' ]]; then
  compset -p 1
  compstate[context]=tilde
fi

# Get the names of the completers to use in the positional parameters.

(( $# )) || set ${(s.:.)compconfig[completer]}

# And now just call the completer functions defined.

for comp; do
  if "$comp"; then
    ret=0
    break;
  fi
done

[[ "$compconfig[last_prompt]" = always ]] && compstate[last_prompt]=yes

_lastcomp=( "${(@kv)compstate}" )
_lastcomp[completer]="$comp"
_lastcomp[prefix]="$PREFIX"
_lastcomp[suffix]="$SUFFIX"
_lastcomp[iprefix]="$IPREFIX"
_lastcomp[isuffix]="$ISUFFIX"
_lastcomp[qiprefix]="$QIPREFIX"
_lastcomp[qisuffix]="$QISUFFIX"

return ret