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
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
|
#compdef zstyle
local state context ostate line expl ctop suf
local nm=$compstate[nmatches] taglist patterns contexts MATCH
integer MBEGIN MEND
typeset -A opt_args styles
# Assoc array of styles; the values give the possible top-level
# contexts:
# c completion
# d chpwd
# e line editor
# v vcs_info
# z zftp
# or any combination of the above,
# followed by a colon, followed by a state to enter, empty if none.
styles=(
accept-exact c:bool
accept-exact-dirs c:bool
add-space c:bool
ambiguous c:bool
assign-list c:_parameters
auto-description c:
avoid-completer c:completer
break-keys c:
cache-path c:_directories
cache-policy c:_functions
call-command c:bool
command c:command
command-path c:_dir_list
commands c:
complete c:bool
complete-options c:bool
completer c:completer
condition c:bool
cursor c:cursor
delimiters c:
disabled c:bool
domains c:
environ c:environ
expand c:
extra-verbose c:bool
fake c:
fake-always c:
fake-files c:fake-files
fake-parameters c:fake-params
file-list c:bool
file-patterns c:filepat
file-sort c:fsort
filter c:
force-list c:
format c:
glob c:bool
global c:bool
group-name c:
group-order c:tag
groups c:_groups
hidden c:bool
hosts c:_hosts
hosts-ports c:host-port
ignore-line c:ignline
ignore-parents c:ignorepar
ignored-patterns c:
insert-ids c:insert-ids
insert-sections c:insert-sections
insert-tab c:bool
insert-unambiguous c:insunambig
keep-prefix c:keep-prefix
last-prompt c:bool
list ce:listwhen
list-colors c:
list-dirs-first c:bool
list-grouped c:bool
list-packed c:bool
list-prompt c:
list-rows-first c:bool
list-separator c:separator
list-suffixes c:bool
local c:
mail-directory c:_directories
match-original c:match-orig
matcher c:
matcher-list c:
max-errors c:
max-matches-width c:max-matches-width
menu c:boolauto
muttrc c:_files
numbers c:bool
old-list c:bool
old-matches c:oldmatches
old-menu c:bool
original c:bool
packageset c:packageset
path c:_directories
pager c:_command_names
path-completion c:bool
pine-directory c:_directories
ports c:_ports
prefix-hidden c:bool
prefix-needed c:bool
preserve-prefix c:preserve-prefix
range c:
recent-dirs-insert c:recent-dirs-insert
recursive-files c:
regular c:bool
rehash c:bool
remote-access c:bool
remove-all-dups c:bool
select-prompt c:
select-scroll c:
separate-sections c:bool
show-ambiguity c:
show-completer c:bool
single-ignored c:single-ignored
sort c:sort-order
special-dirs c:sdirs
squeeze-slashes c:bool
stop c:stop
strip-comments c:bool
subst-globs-only c:bool
substitute c:bool
suffix c:bool
tag-order c:tag-order
try-to-use-pminst c:bool
urls c:_urls
use-cache c:bool
use-compctl c:urgh
use-ip c:bool
use-perl c:bool
users c:_users
users-hosts c:user-host
users-hosts-ports c:user-host-port
verbose ce:bool
word c:bool
recent-dirs-default d:bool
recent-dirs-file d:_files
recent-dirs-max d:
recent-dirs-prune d:
recent-dirs-pushd d:bool
auto-previous e:bool
break-keys e:
cursor e:
edit-buffer e:bool
edit-previous e:bool
editor e:
insert-kept e:
leave-cursor e:bool
match e:
prompt e:
stop-keys e:
toggle e:bool
url-globbers e:
url-local-schema e:
url-metas e:
url-other-schema e:
url-seps e:
whence e:
word-chars e:
word-class e:
word-style e:word-style
word-context e:
formats v:vcs-format
actionformats v:vcs-format
branchformat v:branch-format
nvcsformats v:
hgrevformat v:hgrev-format
stgitformat v:stg-format
patch-format v:patch-format
nopatch-format v:patch-format
max-exports v:
enable v:vcs
disable v:vcs
disable-patterns v:
check-for-changes v:bool
check-for-staged-changes
v:bool
stagedstr v:
unstagedstr v:
command v:_command_names
use-server v:bool
use-simple v:bool
get-revision v:bool
get-mq v:bool
get-bookmarks v:bool
get-unapplied v:bool
debug v:bool
hooks v:_vcs_info_hooks
use-prompt-escapes v:bool
use-quilt v:bool
quilt-standalone v:bool
quilt-patch-dir v:_directories
quiltcommand v:_command_names
chpwd z:bool
progress z:progress
remote-glob z:bool
titlebar z:bool
update z:
)
taglist=(
accounts all-expansions all-files arguments arrays association-keys
bookmarks builtins characters colormapids colors commands contexts
corrections cursors default descriptions devices directories
directory-stack displays expansions extensions files flags fstypes
fonts functions globbed-files groups history-words hosts indexes
interfaces jobs keymaps keysyms libraries limits local-directories
mailboxes manuals maps messages modifiers modules my-accounts
named-directories names newsgroups nicknames options original
other-accounts packages parameters path-directories paths pods ports
prefixes printers processes processes-names ps regex sequences
sessions signals strings styles tags targets timezones types urls
users values variant visuals warnings widgets windows zsh-options
email-address ${(k)functions[(I)_email-*]#_}
)
# Be careful with the context arguments here. They like to masquerade.
_arguments -C \
'(: -)-L[output in form of zstyle commands]:pattern for context patterns:->metapatterns:style:->metastyles' \
'(: -)-d[delete style definitions]:verbatim context pattern:->patterns:*:styles:->pstyles' \
'(: -)-e[value is evaluated when style is looked up]:context pattern:->contexts:style:->styles:*:command:_cmdstring' \
'(: -)-g[retrieve style definition]:array parameter:_parameters -g "*array*":verbatim context pattern:->patterns:styles:->pstyles' \
'(: -)-s[retrieve style value as string]:context name:->contexts:style:->styles:scalar parameter:_parameters -g "*scalar*":separator: ' \
'(: -)-b[retrieve style value as boolean]:context name:->contexts:style:->styles:scalar parameter:_parameters -g "*scalar*"' \
'(: -)-a[retrieve style value as array]:context name:->contexts:style:->styles:array parameter:_parameters -g "*array*"' \
'(: -)-t[test a style, returning false if it'\''s undefined]:context name:->contexts:style:->styles:*:strings to test presence of: ' \
'(: -)-T[test a style, returning true if it'\''s undefined]:context name:->contexts:style:->styles:*:strings to test presence of: ' \
'(: -)-m[pattern-match values of a style]:context name:->contexts:style:->styles:pattern: ' \
'(-):context pattern:->contexts' '(-):style:->styles' '(-)*:argument:->style-arg'
while (( $#state )); do
case "$state[1]" in
# 'contexts' completes either full context names (for -t/-s/-a), or context
# patterns (for 'zstyle :foo bar' and -e).
(contexts)
if [[ ! -prefix :*: ]]; then
_wanted contexts expl "$state_descr" compadd -P : -qS : chpwd completion vcs_info zftp zle
elif compset -P :completion:; then
contexts=( functions _completers cmdorcont argument tag )
elif compset -P :vcs_info:; then
contexts=( vcs-string user-context repo-root-name )
elif compset -P :zle:; then
_wanted widgets expl widget _widgets -qS :
fi
if (( $#contexts )); then
for ostate in $contexts; do
compset -P '[^:]#:' || break
done
suf=()
compset -S ':*' || suf=( -qS: )
[[ $ostate = $contexts[-1] ]] && suf=()
if compset -P '(|\\)\((*\||)'; then # handle (x|y) patterns
suf=()
compset -S '(|\\)[)|]*' ||
suf=( -S "${${QIPREFIX:+|}:-\|}" -r "${${QIPREFIX:+|}:-\\\\} \t)" )
fi
state+=( "$ostate" )
fi
;;
# 'patterns' completes context patterns that are set, for -d/-g.
(patterns)
zstyle -g patterns
_wanted contexts expl "$state_descr" compadd -a patterns
;;
# 'metapatterns': patterns that are matched not against contexts, but
# against patterns.
(metapatterns)
zstyle -g patterns
patterns=( "${(@b)patterns}" )
_wanted contexts expl "$state_descr" compadd -a patterns
;;
# 'metastyles': styles that are set on context patterns matching the given
# metapattern.
(metastyles)
# Anonymous function to shadow the global $styles assoc
() {
local metapattern=${(Q)${${opt_args[-L]%:*}//(#m)\\([\\:])/${MATCH[2]}}}
local -a metastyles styles
local pattern
zstyle -g patterns
for pattern in "${(@M)patterns:#${~metapattern}}"; do
zstyle -g styles $pattern
metastyles+=( "${styles[@]}" )
done
_wanted styles expl "$state_descr" compadd -a metastyles
unset pattern
unset metastyles
}
;;
# 'pstyles': complete styles that are set for the verbatim context pattern
# specified on the command line. (If the user has set no zstyles, this
# will complete nothing.)
(pstyles)
local -a pstyles
local pattern
if (( $+opt_args[-d] )); then
pattern=${opt_args[-d]}
pattern=${pattern%":${(b)PREFIX}"} # remove style
pattern=${pattern//(#m)\\([\\:])/${MATCH[2]}} # undo _arguments escaping
pattern=${(Q)pattern} # undo command-line escaping (assumes no noglob)
zstyle -g pstyles $pattern
elif (( $+opt_args[-g] )); then
pattern=${opt_args[-g]}
pattern=${pattern%":${(b)PREFIX}"} # remove style
pattern=${pattern#*:} # remove array name
pattern=${pattern//(#m)\\([\\:])/${MATCH[2]}} # undo _arguments escaping
pattern=${(Q)pattern} # undo command-line escaping (assumes no noglob)
zstyle -g pstyles $pattern
fi
_wanted styles expl style compadd -a pstyles
unset pattern
unset pstyles
;;
# 'styles': complete all styles that may be set in the context given on the
# command line. This is independent of what styles are set.
(styles)
# Get the top-level context we're completing for, if any.
if [[ -n $line[1] ]]; then
# zstyle :something <TAB>
local the_context=$line[1]
else
# zstyle -x :something <TAB>
local joined_value=${(v)opt_args[(i)(-e|-s|-b|-a|-t|-T|-m)]}
local the_context=${(Q)joined_value[0, ${joined_value[(i)[^\\]:]}-2 ]}
fi
# Note: for 'zstyle :something <TAB>' and for 'zstyle -e :something <TAB>',
# $the_context is a context pattern; for -s,-b,-a,-t,-T,-m, it is a context
# name. We currently draw no distinction between these two cases.
case $the_context in
(:completion:*)
ctop=c
;;
(:chwpd:*)
ctop=d
;;
(:zftp:*)
ctop=z
;;
(:vcs_info:*)
ctop=v
;;
(:zle:*)
ctop=e
;;
(*)
ctop=a-z
;;
esac
_wanted styles expl style \
compadd -M 'r:|-=* r:|=*' -k "styles[(R)[^:]#[$ctop][^:]#:*]"
;;
(style-arg)
state+=( "${styles[${(Q)line[2]}]#*:}" )
;;
(argument)
_message -e arguments argument
;;
(bool)
_wanted values expl boolean compadd true false
;;
(boolauto)
_wanted values expl boolean \
compadd true false auto select search search-backward interactive
;;
(cmdorcont)
_alternative -O suf \
'commands:command:_path_commands' \
'contexts:context:(-array-value- -brace-parameter- -command- -condition- -math- -parameter- -redirect- -subscript- -value-)'
;;
(cursor)
_wanted values expl 'cursor positioning' compadd complete key default
;;
(completer)
_wanted values expl completer _completers -p
;;
(environ)
if [[ "$PREFIX" = *\=* ]]; then
compstate[parameter]="${PREFIX%%\=*}"
compset -P 1 '*='
_value
else
suf=()
compset -S '=*' || suf=(-S '=')
_parameters -q $suf
fi
;;
(fsort)
_wanted values expl 'how to sort files' \
compadd name size links time date modification access inode change reverse
;;
(function)
_wanted control-functions expl 'control function' \
compadd predict-on all-matches
;;
(functions)
_wanted comp-widgets expl 'completion widget' \
compadd $suf -M 'r:|-=* r:|=*' - all-matches complete-debug complete-tag \
correct-word expand-word expand-alias-word history-words \
${${${(M)${(f)"$(_call_program comp-widgets zle -l)"}:#*-C*}:#_*}/ -C*}
;;
(user-host-port)
if [[ $PREFIX != *[@:]* ]]; then
_users -S @
elif [[ $PREFIX = *[@:]*[[@:]* ]]; then
compset -P 2 '*[:@]'
_ports
else
compset -P 1 '*[:@]'
_hosts -S :
fi
;;
(host-port)
if [[ $PREFIX != *:* ]]; then
_hosts -S :
else
compset -P 1 '*:'
_ports
fi
;;
(listwhen)
_wanted values expl 'when to list completions' \
compadd always never sometimes
;;
(packageset)
_wanted values expl 'default package set' \
compadd available installed uninstalled
;;
(progress)
_wanted values expl 'progress meter style' \
compadd none bar percent
;;
(sdirs)
_wanted values expl 'whether to complete . or ..' \
compadd true false ..
;;
(stop)
_wanted values expl 'when to insert matches' \
compadd true false verbose
;;
(tag)
_wanted tags expl tag compadd $suf -a taglist
;;
(tag-order)
if compset -P '*:*:'; then
_message -e descriptions description
elif compset -P '*:'; then
_message -e labels 'tag label'
else
suf=()
compset -S ':*' || suf=( -qS: )
_wanted values expl tag compadd $suf -a taglist
fi
;;
(filepat)
if compset -P '*:*:'; then
_message -e descriptions description
elif compset -P '*:'; then
_message -e tags tag
else
_message -e patterns 'glob patterns'
fi
;;
(user-host)
if [[ $PREFIX = *[@:]* ]]; then
compset -P '*[@:]'
_hosts
else
_users -S @
fi
;;
(ignorepar)
_wanted values expl 'which parents to ignore' \
compadd parent pwd .. directory
;;
(single-ignored)
_wanted values expl 'how to handle a single ignored match' \
compadd - show menu
;;
(command)
shift 3 words
(( CURRENT -= 3 ))
_normal
;;
(insert-ids)
_wanted values expl 'when to insert process IDs' \
compadd - menu single longer
;;
(insert-sections)
_wanted values expl 'where to insert man page section' \
compadd - true false prepend suffix
;;
(fake-files)
_message -e fakes 'prefix and names'
;;
(fake-params)
if compset -P '*:'; then
_wanted values expl 'parameter type' compadd scalar array integer
else
suf=''
compset -S ':*' || suf='-qS:'
_wanted values expl 'fake parameter' _parameters $suf
fi
;;
(ignline)
_wanted values expl 'ignore strings on the line' compadd true false current current-shown other
;;
(keep-prefix)
_wanted values expl 'keep prefix' compadd true false changed
;;
(match-orig)
_wanted values expl "match without inserting \`*'" compadd only both
;;
(oldmatches)
_wanted values expl 'use list of old matches' compadd true false only
;;
(insunambig)
_wanted values expl 'insert unambiguous string' compadd true false pattern
;;
(preserve-prefix)
_message -e prefixes 'pattern matching prefix to keep'
;;
(recent-dirs-insert)
_wanted values expl 'inserting recent directories' \
compadd true false always fallback both
;;
(separator)
_message -e separators 'separator string'
;;
(sort-order)
_wanted sort-orders expl 'sort order' compadd -F line - true false match nosort numeric reverse
;;
(max-matches-width)
_message -e numbers 'maximum display width for matches'
;;
(urgh)
_wanted values expl no compadd no false off 0
;;
(word-style)
_wanted word-styles expl 'word style' compadd {normal,specified,unspecified,shell,whitespace}-subword
;;
(vcs-string)
_wanted vcs expl vcs compadd $suf - \
${${(f)"$(_call_program vcs vcs_info_printsys 2>/dev/null)"}:#\#*}
;;
(vcs)
_wanted vcs expl vcs compadd \
${${(f)"$(_call_program vcs vcs_info_printsys 2>/dev/null)"}:#(\#|*-)*}
;;
(user-context)
_wanted user-contexts expl 'user context' compadd $suf default command
;;
(repo-root-name)
_message -e names 'repository root name'
;;
(vcs-format)
if [[ $PREFIX = *% ]]; then
compset -P '*%'
_values -s '' 'format replacement' \
's[the vcs in use]' \
'b[the current branch]' \
'a[an identifier describing the action]' \
'i[current revision no/id]' \
'c[details of staged changes]' \
'u[details of unstaged changes]' \
'r[repository name]' \
'S[subdirectory within repository]' \
'm[misc replacement - backend specific]'
else
_message -e formats 'vcs format'
fi
;;
(branch-format)
if [[ $PREFIX = *% ]]; then
compset -P '*%'
_values -s '' 'format replacement' \
'b[the current branch]' \
'r[current revision number]'
else
_message -e formats 'vcs format'
fi
;;
(hgrev-format)
if [[ $PREFIX = *% ]]; then
compset -P '*%'
_values -s '' 'format replacement' \
'h[current revision hash (global)]' \
'r[current revision number (local)]'
else
_message -e formats 'vcs format'
fi
;;
(stg-format)
if [[ $PREFIX = *% ]]; then
compset -P '*%'
_values -s '' 'format replacement' \
'p[patch currently on top of the stack]' \
'c[the number of unapplied patches]'
else
_message -e formats 'vcs format'
fi
;;
(patch-format)
if [[ $PREFIX = *% ]]; then
compset -P '*%'
_values -s '' 'format replacement' \
'p[name of top-most patch (applied-string)]' \
'u[number of unapplied patches (unapplied-string)]' \
'n[number of applied patches]' \
'c[number of unapplied patches]' \
'a[number of all patches]' \
'g[names of active mq guards (hg backend)]' \
'G[number of active mq guards (hg backend)]'
else
_message -e formats 'vcs format'
fi
;;
(_*)
${=state[1]} $suf
;;
esac
shift state
done
[[ $compstate[nmatches] != $nm ]]
|