summary refs log tree commit diff
path: root/Completion/Zsh/Context/_brace_parameter
blob: f22db88957a61a3f6e21b4ccef0360708a558eea (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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#compdef -brace-parameter-

local char delim found_percent found_m exp
local -a flags
integer q_last n_q

if [[ $PREFIX = *'${('[^\)]# ]]; then
  # Parameter flags.
  compset -p 3

  # Based on code in _globquals.
  while [[ -n $PREFIX ]]; do
    char=$PREFIX[1]
    compset -p 1
    if [[ $char = q ]]; then
      (( q_last++, n_q++ ))
      continue
    else
      (( q_last = 0 ))
    fi
    # Skip arguments to find what's left to complete
    case $char in
      (%)
      found_percent=1
      ;;

      (m)
      found_m=1
      ;;

      ([gIjsZ_])
      # Single delimited argument.
      if [[ -z $PREFIX ]]; then
	_delimiters qualifier-$char
	return
      elif ! _globqual_delims; then
	# still completing argument
	case $char in
	  (g)
	  compset -P '*'
	  flags=('o:octal escapes' 'c:expand ^X etc.' 'e:expand \M-t etc.')
	  _describe -t format 'format option' flags -Q -S ''
	  ;;

	  (I)
	  _message 'integer expression'
	  ;;

	  ([js])
	  _message "separator"
	  ;;

	  (Z)
	  compset -P '*'
	  flags=(
	    'c:parse comments as strings (else as ordinary words)'
	    'C:strip comments (else treat as ordinary words)'
	    'n:treat newlines as whitespace'
	  )
	  _describe -t format 'format option' flags -Q -S ''
	  ;;

	  (_)
	  _message "no useful values"
	  ;;
	esac
	return
      fi
      ;;

      ([lr])
      # One compulsory argument, two optional.
      if [[ -z $PREFIX ]]; then
	_delimiters qualifier-$char
	return
      else
	delim=$PREFIX[1]
	if ! _globqual_delims; then
	  # still completing argument
	  _message "padding width"
	  return
	fi
	# TBD if $PREFIX is empty can complete
	# either repeat delimiter or a new qualifier.
	# You might think it would just be easier
	# for the user to type the delimiter at
	# this stage, but users are astonishingly lazy.
	if [[ $delim = $PREFIX[1] ]]; then
	  # second argument
	  if ! _globqual_delims; then
	    _message "repeated padding"
	    return
	  fi
	  if [[ $delim = $PREFIX[1] ]]; then
	    if ! _globqual_delims; then
	      _message "one-off padding"
	      return
	    fi
	  fi
	fi
      fi
      ;;
    esac
  done

  if [[ -z $found_percent ]]; then
    flags=("%:expand prompt sequences")
  else
    flags=("%:expand prompts respecting options")
  fi
  case $q_last in
    (0)
    if (( n_q == 0 )); then
      flags+=("q:quote with backslashes")
    fi
    ;;

    (1)
    flags+=(
      "q:quote with single quotes"
      "-:quote minimally for readability"
    )
    ;;

    (2)
    flags+=("q:quote with double quotes")
    ;;

    (3)
    flags+=("q:quote with \$'...'")
    ;;
  esac
  if (( !n_q )); then
    flags+=("Q:remove one level of quoting")
  fi
  if [[ -z $found_m ]]; then
    flags+=("m:count multibyte width in padding calculation")
  else
    flags+=("m:count number of character code points in padding calculation")
  fi
  flags+=(
    "#:evaluate as numeric expression"
    "@:double-quoted splitting of scalars"
    "A:assign as an array parameter"
    "a:sort in array index order (with O to reverse)"
    "b:backslash quote pattern characters only"
    "c:count characters in an array (with \${(c)#...})"
    "C:capitalize words"
    "D:perform directory name abbreviation"
    "e:perform single-word shell expansions"
    "f:split the result on newlines"
    "F:join arrays with newlines"
    "g:process echo array sequences (needs options)"
    "i:sort case-insensitively"
    "k:substitute keys of associative arrays"
    "L:lower case all letters"
    "n:sort decimal integers numerically"
    "o:sort in ascending order (lexically if no other sort option)"
    "O:sort in descending order (lexically if no other sort option)"
    "P:use parameter value as name of parameter for redirected lookup"
    "t:substitute type of parameter"
    "u:substitute first occurrence of each unique word"
    "U:upper case all letters"
    "v:substitute values of associative arrays (with (k))"
    "V:visibility enhancements for special characters"
    "w:count words in array or string (with \${(w)#...})"
    "W:count words including empty words (with \${(W)#...})"
    "X:report parsing errors and eXit substitution"
    "z:split words as if zsh command line"
    "0:split words on null bytes"
    "p:handle print escapes or variables in parameter flag arguments"
    "~:treat strings in parameter flag arguments as patterns"
    "j:join arrays with specified string"
    "l:left-pad resulting words"
    "r:right-pad resulting words"
    "s:split words on specified string"
    "Z:split words as if zsh command line (with options)"
    # "_:extended flags, for future expansion"
    "S:search substrings in #, %, / expressions"
    "I:search <argument>th match in #, %, / expressions"
    "B:include index of beginning of match in #, %, / expressions"
    "E:include index of one past end of match in #, %, / expressions"
    "M:include matched portion in #, %, / expressions"
    "N:include length of match in #, % expressions"
    "R:include rest (unmatched portion) in #, %, / expressions"
  )
  _describe -t flags "parameter flag" flags -Q -S ''
  return
elif compset -P '*:([\|\*\^]|\^\^)'; then
  _arrays
  return
elif compset -P '*:'; then
    flags=(
      '-:substitute alternate value if parameter is null'
      '+:substitute alternate value if parameter is non-null'
      '=:substitute and assign alternate value if parameter is null'
      '\:=:unconditionally assign value to parameter'
      '?:print error if parameter is set and non-null'
      '#:filter value matching pattern'
      '/:replace whole word matching pattern'
      '|:set difference'
      '*:set intersection'
      '^:zip arrays'
      '^^:zip arrays reusing values from shorter array'
    )
    _describe -t flags "operator" flags -Q -S ''
    _history_modifiers p
    return
fi

_parameters -e