#compdef 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 yesterday week\\ ago month\\ ago" local complete_k="compadd kv kvl k o b v" local complete_r="compadd -UX 'Enter tag name or rev number' ''; $showhint" 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" || _files ;; 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" || _files ;; annotate|ann) # "+lr:D:fR" _complete_opts l '' r: '' D: '' f '' R '' || _files ;; checkout|co|get) # "+ANnk:d:flRpQqcsr:D:j:P" _complete_opts A '' N '' n '' k: "$complete_k" d: '' f '' l '' R '' p '' Q '' q '' c '' s '' r: "$complete_r" D: "$complete_D" j: '' P '' || compadd MODULE ;; commit|ci|com) # "+nlRm:fF:r:" _complete_opts n '' l '' R '' m: "$complete_m" f '' F: '' r: "$complete_r" || _files ;; 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" || _files ;; edit) # "+lRa:" _complete_opts l '' R '' a: '' || _files ;; editors) # "+lR" _complete_opts l '' R '' || _files ;; export|exp|ex) # "+ANnk:d:flRpQqcsr:D:j:P" _complete_opts A '' N '' n '' k: "$complete_k" d: '' f '' l '' R '' p '' Q '' q '' c '' s '' r: "$complete_r" D: "$complete_D" j: '' P '' || compadd MODULE ;; 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: '' || _files ;; import|im|imp) # "+Qqdb:m:I:k:W:" _complete_opts Q '' q '' d '' b: '' m: "$complete_m" I: '' k: "$complete_k" W: '' || case $[CURRENT-com] in 1) if [[ "${+CVSROOT}" == 1 && "$CVSROOT" != :* ]]; then compgen -X "Enter repository name" -W "$CVSROOT" -g '*~*CVSROOT(/)' -s '' else compadd -UX "Enter repository name" -n '' && eval "$showhint" fi ;; 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" || _files ;; release|re|rel) # "+Qdq" _complete_opts Q '' d '' q '' || _files -/ ;; remove|rm|delete) # "+flR" _complete_opts f '' l '' R '' || _files ;; status|st|stat) # "+vlR" _complete_opts v '' l '' R '' || _files ;; tag|ta|freeze) # "+FQqlRcdr:D:bf" _complete_opts F '' Q '' q '' l '' R '' c '' d '' r: "$complete_r" D: "$complete_D" b '' f '' || _files ;; unedit) # "+lR" _complete_opts l '' R '' || _files ;; 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: '' I: '' W: '' || _files ;; watch) if (( CURRENT == com + 1 )); then compadd on off add remove else case "$words[com+1]" in on|off) # "+lR" _complete_opts l '' R '' || _files ;; add|remove) # "+lRa:" _complete_opts l '' R '' a: '' || _files ;; esac fi ;; watchers) # "+lR" _complete_opts l '' R '' || _files ;; *) _files;; esac return fi case ${+cvs_roots} in 0) cvs_roots=() if [[ -f ~/.cvspass ]]; then cvs_roots=( $(cut -d ' ' -f 1 ~/.cvspass) ) fi ;; esac _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}