#compdef cvs _cvs () { setopt localoptions extendedglob typeset -A commands commands=(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 release "re rel" remove "rm delete" status "st stat" rtag "rt rfreeze" tag "ta freeze" unedit "" update "up upd" watch "" watchers "") local com="${words[(i)(${(j:|:)${(kv)=commands}})]}" local showlist='compstate[list]=list; compstate[force_list]=yes' local showhint="$showlist ; compstate[insert]=''" local complete_D="compadd today yesterday week\\ ago month\\ ago" local complete_k="compadd kv kvl k o b v" local complete_r="_cvsrevisions" local complete_m="compadd -UX 'Enter log message' -n ''; $showhint" if (( com < CURRENT )); then case "$words[$com]" in add|ad|new) # "+k:m:" _complete_opts k: "$complete_k" m: "$complete_m" || _cvsaddp ;; admin|adm|rcs) # "+ib::c:a:A:e:l::u::LUn:N:m:o:s:t::IqxV:k:" _complete_opts i '' b:: '' c: '' a: '' A: '' e: '' l:: '' u:: '' L '' \ U '' n: '' N: '' m: "$complete_m" o: '' s: '' t:: '' I '' q '' x '' \ V: '' k: "$complete_k" || _cvstargets ;; annotate|ann) # "+lr:D:fR" _complete_opts l '' r: "$complete_r" D: "$complete_D" f '' R '' || _cvstargets ;; checkout|co|get) # "+ANnk:d:flRpQqcsr:D:j:P" _complete_opts A '' N '' n '' k: "$complete_k" d: '_files -/' f '' \ l '' R '' p '' Q '' q '' c '' s '' r: "$complete_r" D: "$complete_D" \ j: "$complete_r" P '' || _cvsrepositories ;; commit|ci|com) # "+nlRm:fF:r:" _complete_opts n '' l '' R '' m: "$complete_m" f '' F: _files \ r: "$complete_r" || _cvsmodified ;; diff|di|dif) # "+abcdefhilnpstuw0123456789BHNRC:D:F:I:L:U:V:W:k:r:" _complete_opts a '' b '' c '' d '' e '' f '' h '' i '' l '' n '' p '' \ s '' t '' u '' w '' 0 '' 1 '' 2 '' 3 '' 4 '' 5 '' 6 '' 7 '' 8 '' \ 9 '' B '' H '' N '' R '' C: '' D: "$complete_D" F: '' I: '' L: '' \ U: '' V: '' W: '' k: "$complete_k" r: "$complete_r" || _cvsmodified || _cvstargets ;; edit) # "+lRa:" _complete_opts l '' R '' a: 'compadd edit unedit commit all none' || _cvstargets ;; editors) # "+lR" _complete_opts l '' R '' || _cvstargets ;; export|exp|ex) # "+Nnk:d:flRQqr:D:" _complete_opts N '' n '' k: "$complete_k" d: '_files -/' f '' l '' \ R '' Q '' q '' r: "$complete_r" D: "$complete_D" || _cvsrepositories ;; history|hi|his) # "+Tacelow?D:b:f:m:n:p:r:t:u:x:X:z:" _complete_opts T '' a '' c '' e '' l '' o '' w '' \? '' \ D: "$complete_D" b: '' f: '' m: "$complete_m" n: '' p: '' r: '' \ t: '' u: '' x: '' X: '' z: '' || _cvstargets ;; import|im|imp) # "+Qqdb:m:I:k:W:" _complete_opts Q '' q '' d '' b: '' m: "$complete_m" I: _files \ k: "$complete_k" W: '' || case $[CURRENT-com] in 1) _cvsrepositories;; 2) compadd -UX "Enter vendor tag name" -n '' && eval "$showhint";; 3) compadd -UX "Enter release tag name" -n '' && eval "$showhint";; *) compadd -UX "No futher arguments used" -n '' && eval "$showhint";; esac ;; init) break ;; login|logon|lgn|logout) _complete_opts || _files ;; rdiff|patch|pa) # "+V:k:cuftsQqlRD:r:" _complete_opts V: '' k: "$complete_k" c '' u '' f '' t '' s '' Q '' \ q '' l '' R '' D: "$complete_D" r: "$complete_r" || _cvstargets ;; release|re|rel) # "+Qdq" _complete_opts Q '' d '' q '' || _files -/ ;; remove|rm|delete) # "+flR" _complete_opts f '' l '' R '' || _cvsremovep ;; status|st|stat) # "+vlR" _complete_opts v '' l '' R '' || _cvstargets ;; tag|ta|freeze) # "+FQqlRcdr:D:bf" _complete_opts F '' Q '' q '' l '' R '' c '' d '' r: "$complete_r" \ D: "$complete_D" b '' f '' || _cvstargets ;; unedit) # "+lR" _complete_opts l '' R '' || _cvstargets ;; update|up|upd) # "+ApPflRQqduk:r:D:j:I:W:" _complete_opts A '' p '' P '' f '' l '' R '' Q '' q '' d '' u '' \ k: "$complete_k" r: "$complete_r" D: "$complete_D" j: "$complete_r" \ I: '' W: '' || _cvstargets ;; watch) if (( CURRENT == com + 1 )); then compadd on off add remove else case "$words[com+1]" in on|off) # "+lR" _complete_opts l '' R '' || _cvstargets ;; add|remove) # "+lRa:" _complete_opts l '' R '' \ a: 'compadd edit unedit commit all none' || \ _cvstargets ;; esac fi ;; watchers) # "+lR" _complete_opts l '' R '' || _cvstargets ;; *) _files;; esac return fi _complete_opts \ H '' Q '' q '' r '' w '' l '' n '' t '' v '' f '' a '' \ b: "compadd /usr/local/bin" \ T: "compadd $TMPPREFIX:h $TMPDIR /tmp" \ e: "compadd vi" \ d: "compadd $_cvs_roots || _files -/" \ z: "compadd 9'" \ s: "_cvs_user_variable" \ || compadd ${(k)commands} || compadd ${(kv)=commands} } _cvsrevisions () { compadd - ${${${(M)${(f)"$(cvs -q status -vl .)"}:# *}##[ ]##}%%[ ]*} } _cvsrepositories () { local root=$CVSROOT [[ -f CVS/Root ]] && root=$(