about summary refs log tree commit diff
path: root/Completion/Base/_values
blob: e4d61d288b000f3d4432ff43a1919f9d39dac79a (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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#autoload

local subopts

if [[ "$1" = -O?* ]]; then
  subopts=( "${(@P)1[3,-1]}" )
  shift
if [[ "$1" = -O ]]; then
  subopts=( "${(@P)1}" )
  shift 2
else
  subopts=()
fi

if compvalues -i "$@"; then

  local noargs args opts descr action expl sep _sub_context oldsc="$_sub_context"

  if ! compvalues -D descr action; then

    compvalues -C _sub_context
    _sub_context="${oldsc}:${oldsc+${oldsc}-}${_sub_context}"

    _tags "${_sub_context}" values || return 1

    compvalues -V noargs args opts

    if [[ "$PREFIX" = *\=* ]]; then
      local name

      name="${PREFIX%%\=*}"
      if compvalues -L "$name" descr action; then
        IPREFIX="${IPREFIX}${name}="
        PREFIX="${PREFIX#*\=}"
      else
        local prefix suffix

	prefix="${PREFIX#*\=}"
	suffix="$SUFFIX"
	PREFIX="$name"
	SUFFIX=''
	args=( "$args[@]" "$opts[@]" )
	compadd -M 'r:|[_-]=* r:|=*' -D args - "${(@)args[@]%%:*}"

	[[ $#args -ne 1 ]] && return 1

        PREFIX="$prefix"
	SUFFIX="$suffix"
        IPREFIX="${IPREFIX}${args[1]%%:*}="
	compvalues -L "${args[1]%%:*}" descr action _sub_context
        _sub_context="${oldsc}:${oldsc+${oldsc}-}${_sub_context}"
      fi
    else
      compvalues -d descr
      if [[ ${#noargs}+${#args}+${#opts} -ne 1 ]] && compvalues -s sep; then
        sep=( "-qQS" "$sep" )
      else
        sep=()
      fi

      _describe "$descr" \
        noargs "$sep[@]" -M 'r:|[_-]=* r:|=*' -- \
        args -S= -M 'r:|[_-]=* r:|=*' -- \
        opts -qS= -M 'r:|[_-]=* r:|=*'

      return
    fi
  else
    compvalues -C _sub_context
    _sub_context="${oldsc}:${oldsc+${oldsc}-}${_sub_context}"
  fi

  _tags "${oldsc}:any" arguments || return 1

  _description expl "$descr"

  # We add the separator character as a autoremovable suffix unless
  # we have only one possible value left.

  [[ ${#snames}+${#names}+${#onames} -ne 1 ]] && compvalues -s sep &&
      expl=( "-qS$sep" "$expl[@]" )

  if [[ "$action" = -\>* ]]; then
    compvalues -v val_args
    state="${${action[3,-1]##[ 	]#}%%[ 	]#}"
    compstate[restore]=''
    return 1
  else
    typeset -A val_args

    compvalues -v val_args

    if [[ "$action" = \ # ]]; then

      # An empty action means that we should just display a message.

      _message "$descr"
      return 1

    elif [[ "$action" = \(\(*\)\) ]]; then
      local ws

      # ((...)) contains literal strings with descriptions.

      eval ws\=\( "${action[3,-3]}" \)

      _describe "$descr" ws -M 'r:|[_-]=* r:|=*' "$subopts[@]"

    elif [[ "$action" = \(*\) ]]; then

      # Anything inside `(...)' is added directly.

      compadd "$subopts[@]" "$expl[@]" - ${=action[2,-2]}
    elif [[ "$action" = \{*\} ]]; then

      # A string in braces is evaluated.

      eval "$action[2,-2]"

    elif [[ "$action" = \ * ]]; then

      # If the action starts with a space, we just call it.

      ${(e)=~action}
    else

      # Otherwise we call it with the description-arguments built above.

      action=( $=action )
      ${(e)action[1]} "$subopts[@]" "$expl[@]" ${(e)~action[2,-1]}
    fi
  fi

  [[ nm -ne "$compstate[nmatches]" ]]
else
  return 1;
fi