#compdef cvs # redefine _cvs. _cvs () { # "+Qqrwtnlvb:T:e:d:Hfz:s:xa" _arguments -s \ -{a,f,H,l,n,Q,q,r,t,v,w,x} \ '--version' '--help' '--help-commands' '--help-synonyms' '--help-options' \ '--allow-root=:rootdir:_files -/' \ '-b+:bindir:_cvs_bindir' \ '-T+:temporary directory:_cvs_tempdir' \ '-d+:cvsroot:_cvs_root' \ '-e+:editor:_cvs_editor' \ '-s+:user variable:_cvs_user_variable' \ '-z+:gzip level:_cvs_gzip_level' \ '*::cvs command:_cvs_command' } # define cvs command dispatch function. (( $+functions[_cvs_command] )) || _cvs_command () { local cmd typeset -A cmds cmds=(add " ad new " admin " adm rcs " annotate " ann " checkout " co get " commit " ci com " diff " di dif " edit "" editors "" export " exp ex " history " hi his " import " im imp " init "" log " lo rlog " login " logon lgn " logout "" rdiff " patch pa " release " re rel " remove " rm delete " status " st stat " rtag " rt rfreeze " tag " ta freeze " unedit "" update " up upd " watch "" watchers "") if (( CURRENT == 1 )); then _wanted commands && { compadd "$@" ${(k)cmds} || compadd "$@" ${(kv)=cmds} } else local curcontext="$curcontext" cmd="${${(k)cmds[(R)* $words[1] *]}:-${(k)cmds[(i)$words[1]]}}" if (( $#cmd )); then curcontext="${curcontext%:*:*}:cvs-${cmd}:" _cvs_$cmd else _message "unknown cvs command: $words[1]" fi fi } # define completion functions for each cvs command (( $+functions[_cvs_add] )) || _cvs_add () { # "+k:m:" _arguments -s \ '-k+:keyword substitution:_cvs_k' \ '-m+:message:_cvs_m' \ '*:file:_cvs_files_unmaintained' \ } (( $+functions[_cvs_admin] )) || _cvs_admin () { # "+ib::c:a:A:e:l::u::LUn:N:m:o:s:t::IqxV:k:" _arguments -s \ -{i,L,U,I,q,x} \ '-b-:default branch:(1.1.1)' \ '-c+:comment leader (not used):' \ '-a+:login names (not work with CVS):' \ '-A+:access list to append (not work with CVS):' \ '-e+:access list to erase (not work with CVS):' \ '-l-:revision to lock:' \ '-u-:revision to unlock:' \ '-n+:symbolic-name(\:revision):' \ '-N+:symbolic-name(\:revision):' \ '-m+:revision\:msg:' \ '-o+:range to delete:' \ '-s+:state(\:revision):' \ '-t-:descriptive text:_cvs_admin_t' \ '-V+:version (obsolete):' \ '-k+:keyword substitution:_cvs_k' \ '*:file:_cvs_files' } (( $+functions[_cvs_admin_t] )) || _cvs_admin_t () { if compset -P -; then _message 'descriptive text' else _files "$@" fi } (( $+functions[_cvs_annotate] )) || _cvs_annotate () { # "+lr:D:fR" _arguments -s \ -{l,f,R} \ '-r+:tag:_cvs_revisions' \ '-D+:date:_cvs_D' \ '*:file:_cvs_files' } (( $+functions[_cvs_checkout] )) || _cvs_checkout () { # "+ANnk:d:flRpQqcsr:D:j:P" _arguments -s \ -{A,N,n,f,l,R,q,c,s,P} \ '-k+:keyword substitution:_cvs_k' \ '-d+:directory:_files -/' \ '-r+:tag:_cvs_revisions' \ '-D+:date:_cvs_D' \ '-j+:tag:_cvs_revisions' \ '*:module:_cvs_modules' } (( $+functions[_cvs_commit] )) || _cvs_commit () { # "+nlRm:fF:r:" _arguments -s \ -{n,l,R,f} \ '-m+:message:_cvs_m' \ '-F+:log message file:_files' \ '-r+:tag:_cvs_revisions' \ '*:file:_cvs_files_modified' } (( $+functions[_cvs_diff] )) || _cvs_diff () { # "+abcdefhilnpstuw0123456789BHNRC:D:F:I:L:U:V:W:k:r:" _arguments -s \ -{l,R} \ '-D+:date:_cvs_D' \ '-k+:keyword substitution:_cvs_k' \ '-r+:tag:_cvs_revisions' \ -{h,p,0,1,2,3,4,5,6,7,8,9} \ '--binary' \ '--brief' \ '--changed-group-format=:format:' \ '-c' '-C+:lines:' '--context=-:lines:' \ '-e' '--ed' \ '-t' '--expand-tabs' \ '-f' '--forward-ed' \ '--horizon-lines=:lines:' \ '--ifdef=:name:' \ '-w' '--ignore-all-space' \ '-B' '--ignore-blank-lines' \ '-i' '--ignore-case' \ '-I+:regex:' '--ignore-matching-lines=:regex:' \ '-b' '--ignore-space-change' \ '--initial-tab' \ '*-L+:label:' '*--label=:label:' \ '--left-column' \ '--line-format=:format:' \ '-d' '--minimal' \ '-N' '--new-file' \ '--new-group-format=:format:' \ '--new-line-format=:format:' \ '--old-group-format=:format:' \ '--old-line-format=:format:' \ '--paginate' \ '-n' '--rcs' \ '-s' '--report-identical-files' \ '--show-c-function' \ '-F+:regex:' '--show-function-line=:regex:' \ '-y' '--side-by-side' \ '-H' '--speed-large-files' \ '--suppress-common-lines' \ '-a' '--text' \ '--unchanged-group-format=:format:' \ '--unchanged-line-format=:format:' \ '-u' '-U+:lines:' '--unified=-:lines:' \ '-W:columns:' '--width=:columns:' \ '*:file:_cvs_diff_arg' } (( $+functions[_cvs_diff_arg] )) || _cvs_diff_arg () { _cvs_files_modified || _cvs_files } (( $+functions[_cvs_edit] )) || _cvs_edit () { # "+lRa:" _arguments -s \ -{l,R} \ '-a+:action:(edit unedit commit all none)' \ '*:file:_cvs_files' } (( $+functions[_cvs_editors] )) || _cvs_editors () { # "+lR" _arguments -s \ -{l,R} \ '*:file:_cvs_files' } (( $+functions[_cvs_export] )) || _cvs_export () { # "+Nnk:d:flRQqr:D:" _arguments -s \ -{N,n,f,l,R,Q,q} \ '-k+:keyword substitution:_cvs_k' \ '-d+:directory:_files -/' \ '-r+:tag:_cvs_revisions' \ '-D+:date:_cvs_D' \ '*:module:_cvs_modules' } (( $+functions[_cvs_history] )) || _cvs_history () { # "+Tacelow?D:b:f:m:n:p:r:t:u:x:X:z:" _arguments -s \ -{T,a,c,e,l,o,w,\?} \ '-D+:date:_cvs_D' \ '-b+:string:' \ '-f+:file:_cvs_files' \ '-m+:module:_cvs_modules' \ '-n+:module:_cvs_modules' \ '*-p+:repository:' \ '-r+:rev:' \ '-t+:tag:' \ '-u+:user name:' \ '-x+:type:_cvs_history_x' \ '-X+:arg:' \ '-z+:timezone:' \ '*:file:_cvs_files' } (( $+functions[_cvs_history_x] )) || _cvs_history_x () { _values -s '' 'type' \ 'F[release]' \ 'O[checkout]' \ 'E[export]' \ 'T[rtag]' \ 'C[merge collision-detected]' \ 'G[merge succeed]' \ 'U[working file was copied]' \ 'W[working file was deleted]' \ 'A[A file was added]' \ 'M[A file was modified]' \ 'R[A file was removed]' } (( $+functions[_cvs_import] )) || _cvs_import () { # "+Qqdb:m:I:k:W:" _arguments -s \ -{Q,q,d} \ '-b+:branch:' \ '-m+:message:_cvs_m' \ '*-I+:name:_files' \ '-k+:keyword substitution:_cvs_k' \ '*-W+:spec:' \ ':repository:_cvs_modules' \ ':vendor tag:' \ ':release tag:' } (( $+functions[_cvs_init] )) || _cvs_init () { false } (( $+functions[_cvs_log] )) || _cvs_log () { # "+bd:hlNRr::s:tw::" _arguments -s \ -{b,h,l,N,R,t} \ '-d+:dates:' \ '-r-:revisions:' \ '-s+:states:' \ '-w-:logins:' \ '*:file:_cvs_files' } (( $+functions[_cvs_login] )) || _cvs_login () { false } (( $+functions[_cvs_logout] )) || _cvs_logout () { false } (( $+functions[_cvs_rdiff] )) || _cvs_rdiff () { # "+V:k:cuftsQqlRD:r:" _arguments -s \ -{c,u,f,t,s,Q,q,l,R} \ '-V+:version:' \ '-k+:keyword substitution:_cvs_k' \ '*-D+:date:_cvs_D' \ '*-r+:tag:_cvs_revisions' \ '*:module:_cvs_modules' } (( $+functions[_cvs_release] )) || _cvs_release () { # "+Qdq" _arguments -s \ -{Q,d,q} \ '*:directory:_files -/' } (( $+functions[_cvs_remove] )) || _cvs_remove () { # "+flR" _arguments -s \ -{f,l,R} \ '*:file:_cvs_files_removed' } (( $+functions[_cvs_rtag] )) || _cvs_rtag () { # "+FanfQqlRdbr:D:" _arguments -s \ -{F,a,n,f,Q,q,l,R,d,b} \ '*-D+:date:_cvs_D' \ '*-r+:tag:_cvs_revisions' \ ':tag:' \ '*:module:_cvs_modules' } (( $+functions[_cvs_status] )) || _cvs_status () { # "+vlR" _arguments -s \ -{v,l,R} \ '*:file:_cvs_files' } (( $+functions[_cvs_tag] )) || _cvs_tag () { # "+FQqlRcdr:D:bf" _arguments -s \ -{F,Q,q,l,R,c,d,b,f} \ '-r+:tag:_cvs_revisions' \ '-D+:date:_cvs_D' \ ':tag:' \ '*:file:_cvs_files' } (( $+functions[_cvs_unedit] )) || _cvs_unedit () { # "+lR" _arguments -s \ -{l,R} \ '*:file:_cvs_files' } (( $+functions[_cvs_update] )) || _cvs_update () { # "+ApCPflRQqduk:r:D:j:I:W:" _arguments -s \ -{A,C,p,P,f,l,R,Q,q,d,u} \ '-k+:keyword substitution:_cvs_k' \ '-r+:tag:_cvs_revisions' \ '-D+:date:_cvs_D' \ '-j+:tag:_cvs_revisions' \ '*-I+:name:_files' \ '*-W+:spec:' \ '*:file:_cvs_files' } (( $+functions[_cvs_watch] )) || _cvs_watch () { local expl if (( CURRENT == 2 )); then _wanted values expl 'watch command' compadd on off add remove else case "$words[2]" in on|off) # "+lR" _arguments -s \ -{l,R} \ ':watch command:' \ '*:file:_cvs_files' ;; add|remove) # "+lRa:" _arguments -s \ -{l,R} \ '*-a+:action:(edit unedit commit all none)' \ ':watch command:' \ '*:file:_cvs_files' ;; esac fi } (( $+functions[_cvs_watchers] )) || _cvs_watchers () { # "+lR" _arguments -s \ -{l,R} \ '*:file:_cvs_files' } (( $+functions[_cvs_loadstat] )) || _cvs_loadstat () { zstyle -t ":completion:${curcontext}:" disable-stat && return (( $+_cvs_loadstat_tried )) && return _cvs_loadstat_tried=yes zmodload -i zsh/stat 2>/dev/null } (( $+functions[_cvs_root] )) || _cvs_root () { local cvspassfile id typeset -gU _cvs_roots if [[ -f "${cvspassfile::=${CVS_PASSFILE:-$HOME/.cvspass}}" ]]; then _cvs_loadstat if (( $+builtins[stat] )); then id="$(LC_ALL=C builtin stat -g +mtime -F '%Y/%m/%d-%T' "$cvspassfile")" else id="$(LC_ALL=C ls -l "$cvspassfile")" fi if [[ "$id" != "$_cvs_pass_id" ]]; then _cvs_roots=($_cvs_roots ${${(f)"$(<$cvspassfile)"}%% *}) _cvs_pass_id="$id" fi fi _wanted files && { compadd -M 'r:|[:@./]=* r:|=*' "$@" $_cvs_roots || _files "$@" -/ } } (( $+functions[_cvs_tempdir] )) || _cvs_tempdir () { _wanted directories && compadd "$@" $TMPPREFIX:h $TMPDIR /tmp } (( $+functions[_cvs_user_variable] )) || _cvs_user_variable () { if compset -P '*='; then _default else _message "variable=value" fi } # define completion functions for cvs global options. (( $+functions[_cvs_bindir] )) || _cvs_bindir () { _wanted directories && { compadd "$@" /usr/local/bin || _files "$@" -/ } } (( $+functions[_cvs_editor] )) || _cvs_editor () { _wanted commands && compadd "$@" vi } (( $+functions[_cvs_gzip_level] )) || _cvs_gzip_level () { _wanted values && compadd "$@" 9 } # define completion functions for cvs common options and arguments. (( $+functions[_cvs_D] )) || _cvs_D () { _wanted values && compadd "$@" today yesterday week\ ago month\ ago } (( $+functions[_cvs_k] )) || _cvs_k () { _wanted values && compadd "$@" kv kvl k o b v } (( $+functions[_cvs_m] )) || _cvs_m () { _message "log message" } (( $+functions[_cvs_modules] )) || _cvs_modules () { local root=$CVSROOT expl [[ -f CVS/Root ]] && root=$(