about summary refs log tree commit diff
path: root/Completion/Zsh/Command/_zstyle
blob: 75acde5f7272dfb6470cdbdf50f8a34f07baaf4d (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
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
#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-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:bool
  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
      ;;

    (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'
      ;;

    (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 ]]