#compdef xauth local state context line expl typeset -A opt_args local tmp cmd _arguments -s \ '-f[specify authfile]:authfile:_files' \ '(-q)-v[verbose mode]' \ '(-v)-q[quiet mode]' \ '-b[break locks]' \ '-i[ignore locks]' \ '*::command:->command' while [[ -n "$state" ]]; do tmp="$state" state= case "$tmp" in command) if (( CURRENT == 1 )); then state=subcommands else cmd="$words[1]" curcontext="${curcontext%:*:*}:xauth-${cmd}:" case "$cmd" in add) _arguments \ ':display name:->displayname' \ ':protocol name:->protocolname' \ ':hexkey:' ;; generate) if (( CURRENT == 2 )); then state=displayname elif (( CURRENT == 3 )); then state=protocolname else case "$words[CURRENT-1]" in timeout) _message 'timeout(seconds)';; group) _message 'group-id';; data) _message 'hexdata';; *) _wanted options expl 'xauth generate options' \ compadd trusted untrusted timeout group data ;; esac fi ;; extract|nextract) case "$CURRENT" in 2) _wanted files expl 'filename to write auth data' _files;; *) state=displayname;; esac ;; list|nlist) state=displayname ;; merge|nmerge) _wanted files expl 'filename to read auth data' _files ;; remove) state=displayname ;; source) _wanted files expl 'filename to source' _files ;; info|exit|quit|\?) ;; help) state=subcommands ;; esac fi ;; subcommands) tmp=( 'add:add entry' 'generate:use server to generate entry' 'extract:extract entries into file' 'nextract:numerically extract entries' 'list:list entries' 'nlist:numerically list entries' 'merge:merge entries from files' 'nmerge:numerically merge entries' 'remove:remove entries' 'source:read commands from file' 'info:print information about entries' 'exit:save changes and exit program' 'quit:abort changes and exit program' 'help:print help' '?:list available commands' ) _describe 'xauth command' tmp -- ;; protocolname) _wanted values expl 'authorization protocol' \ compadd MIT-MAGIC-COOKIE-1 XDM-AUTHORIZATION-1 SUN-DES-1 MIT-KERBEROS-5 ;; displayname) _wanted values expl 'display name' \ compadd - ${${(f)"$(xauth list)"}%% *} || _x_display ;; esac done