#compdef zstyle local curcontext="$curcontext" state context ostate line expl ctop local nm=$compstate[nmatches] mesg typeset -A opt_args typeset -A styles # Assoc array of styles; the values give the possible top-level # contexts (currently c for completion, z for zftp or cz for both), # followed by a colon, followed by a state to enter, empty if none. styles=( accept-exact c:bool add-space c:bool arguments c: auto-description c: break c: completer c:completer completions c: condition c: cursor c:cursor disable-stat c:bool domains c: expand c: file-patterns c:filepat format c: glob c: group-name c: group-order c:tag groups c:_groups hidden c:bool hosts c:_hosts hosts-ports c:host-port users-hosts-ports c:user-host-port ignore-parents c:ignorepar ignored-patterns c: insert-unambiguous c:bool last-prompt c:bool list c:listwhen list-arguments c: list-colors c: list-packed c:bool list-rows-first c:bool local c: matcher-list c: max-errors c: menu c:boolauto numbers c:bool original c:bool packageset c:packageset path 'c:_wanted directories expl directory _path_files -/' ports c:_ports prefix-hidden c:bool prefix-needed c:bool prompt c: remove-all-dups c:bool single-ignored c:single-ignored sort c:bool special-dirs c:sdirs squeeze-slashes c:bool stop c:stop subst-glob-only c: substitute c: tag-order c:tag users c:_users users-hosts c:user-host verbose c:bool word c:bool chpwd z:bool progress z:progress remote_glob z:bool titlebar z:bool update z: ) local taglist taglist=(accounts all-files all-expansions arguments arrays association-keys bookmarks builtins characters colors commands corrections cursors cvs default descriptions devices directories directory-stack displays expansions extensions files fonts functions globbed-files groups history-words hosts indexes jobs keymaps keysyms local-directories libraries limits manuals maps messages modifiers modules my-accounts named-directories names nicknames options original other-accounts packages parameters path-directories paths pods ports prefixes processes ps regex sequences sessions signals strings tags targets types urls users values warnings widgets windows zsh-options) _arguments ':context:->contexts' ':style:->styles' '*:argument:->style-arg' while [[ -n $state ]]; do ostate=$state state= case "$ostate" in contexts) if _wanted contexts; then if [[ $PREFIX != :*: ]]; then _all_labels contexts expl context compadd -P : -S : completion zftp elif [[ $PREFIX = :completion:* ]]; then mesg='' case "$PREFIX" in :completion:[^:]#) mesg=function ;; :completion:[^:]#:[^:]#) mesg=completer ;; :completion:[^:]#:[^:]#:[^:]#) mesg='command or context' ;; :completion:[^:]#:[^:]#:[^:]#:[^:]#) mesg=argument ;; :completion:[^:]#:[^:]#:[^:]#:[^:]#:[^:]#) mesg=tag ;; esac [[ -n "$mesg" ]] && _message "$mesg" fi fi ;; styles) # Get the top-level context we're completing for, if any. if [[ $words[2] = :(completion|zftp):* ]]; then ctop=${words[2][2]} else ctop=cz fi _wanted styles expl style \ compadd -M 'r:|-=* r:|=*' - ${(k)styles[(R)[^:]#[$ctop][^:]#:*]} ;; style-arg) state="${styles[$words[3]]#*:}" ;; bool) _wanted values expl boolean compadd true false ;; boolauto) _wanted values expl boolean compadd true false auto select ;; cursor) if [[ "$words[2]" = *:completion:inc* ]]; then _wanted values expl 'cursor positioning' compadd complete key default elif [[ "$words[2]" = *:completion::* ]]; then _wanted values expl 'cursor positioning' compadd true false else _wanted values expl 'cursor positioning' \ compadd complete key default true false fi ;; completer) _wanted values expl completer \ compadd _complete _approximate _correct _match \ _expand _list _menu _oldlist _next_tags ;; 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) compset -q if compset -P '*:*:'; then _message description elif compset -P '*:'; then _message 'tag alias' else _wanted tags expl tag compadd - $taglist fi ;; filepat) if compset -P '*:*:'; then _message description elif compset -P '*:'; then _message tag else _message '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 ;; _*) ${=ostate} ;; *) ;; esac done [[ $compstate[nmatches] != $nm ]]