This file gives some examples of compctl commands. You can either put the compctl commands in your .zshrc or include a separate file from your .zshrc with the source command.

These are just examples, use and modify to personal taste. Copying this file without thought will needlessly increase zsh's memory usage and startup time.

For an explanation of what all this means, read either the introduction for some explanation or the manual for a detailed description.

compctl -u -x `s[+] c[-1,-f],s[-f+]' -g `~/Mail/*(:t)' - `s[-f],c[-1,-f]' -f -- mail
Complete users by default. After a -f with an optional space, complete file names; if a + follows the -f, whether or not there is a space in between, complete with the non-directory part of files in the directory ~/Mail.

compctl -g '*(/)' rmdir dircmp
Rmdir only real directories

compctl -g '*(*)' strip gprof adb dbx xdbx ups
Strip, profile, and debug only executables. The compctls for the debuggers could be better, of course.

compctl -K cdmatch -S '/' -x 'S[/][~]' -g '*(-/)' -- cd pushd
See the func/cdmatch function in the distribution

compctl -g 'RCS/*(:t:s/\,v//)' co rlog rcs
For rcs users, co and rlog from the RCS directory. We don't want to see the RCS and ,v though.

compctl -g '*.ps' + -g '*(-/)' gs ghostview psps pstops psmulti psselect
Run ghostscript on postscript files, but if no postscript file matches what we already typed, complete directories as the postscript file may not be in the current directory.

compctl -g '*.tex*' + -g '*(-/)' tex latex texi2dvi glatex slitex gslitex
compctl -g '*.dvi' + -g '*(-/)' xdvi dvips
Similar things for tex, texinfo and dvi files.

compctl -l '' nohup exec nice eval trap compctl -l '' -x 'p[1]' -B -- builtin
Anything after nohup is a command by itself with its own completion (the one for the trap builtin isn't perfect -- it does not complete signal names)

compctl -k hosts -x 'p[2,-1]' -l '' -- rsh
If the command is rsh, make the first argument complete to hosts and treat the rest of the line as a command on its own.

compctl -j -P % -x 's[-] p[1]' -k signals -- kill
kill takes signal names as the first argument after -, but job names after %

compctl -f -x 'R[-*d,^*]' -g '*.gz *.z *.Z' + -g '*(-/)' -- gzip
compctl -g '*.gz *.z *.Z' + -g '*(-/)' gunzip
compctl -g '*.Z' + -g '*(-/)' uncompress zmore
compctl -g '*.F' + -g '*(-/)' melt fcat
gzip files, but gzip -d only gzipped or compressed files

compctl -j -P % fg bg wait jobs disown
compctl -A shift
compctl -caF type whence which
compctl -F unfunction
compctl -a unalias
compctl -v unset typeset declare vared readonly export integer
compctl -e disable
compctl -d enable
compctl -k '(cputime filesize datasize stacksize coredumpsize resident \ memoryuse memorylocked descriptors openfiles vmemorysize)' limit ulimit
compctl -l '' -x 'p[1]' -f -- . source
Some builtins.

compctl -s '$(groups)' newgrp
compctl -f -x 'p[1]' -s '$(groups)' -- chgrp
compctl -f -x 'p[1]' -u -- chown
compctl -g '*.x' + -g '*(-/)' rpcgen
compctl -f -x 'C[-1,*f*] p[2]' -g "*.tar" -- tar
compctl -u -x 's[+] c[-1,-f],s[-f+]' -g '~/Mail/*(:t)' - \ 's[-f],c[-1,-f]' -f -- mail elm
compctl -g "*.[cCoa]" -x 's[-I]' -g "*(/)" - \
's[-l]' -s '${(s.:.)LD_LIBRARY_PATH}/lib*.a(:t:r:s/lib//)' -- cc gcc
Miscellaneous
compctl -x 's[-]' -k "(\
daystart depth follow maxdepth mindepth noleaf version xdev \ amin anewer cmin cnewer ctime empty false fstype gid group inum links lname mmin \ mtime name newer nouser nogroup path perm regex size true type uid used user xtype \ exec fprint fprint0 fprintf ok print print0 printf prune ls \
)"
- 'p[1]' -g '. .. *(-/)' - \
'c[-1,-anewer][-1,-cnewer][-1,-newer][-1,-fprint][-1,fprint0][-1,fprintf]' -f - \ 'c[-1,-fstype]' -k '(ufs 4.2 4.3 nfs tmp mfs S51K S52K)' - \ 'c[-1,-group]' -s '$(groups)' - \ 'c[-1,-user]' -u - \ 'r[-exec,;][-ok,;]' -l '' -- find
find is very system dependend, this one is for GNU find. # xsetroot: gets possible colours, cursors and bitmaps from wherever. # Uses two auxiliary functions. You might need to change the path names. Xcolours() { reply=($(awk '{ print $4 }' < /usr/lib/X11/X11/rgb.txt)) } Xcursor() { reply=($(awk '/^#define/ {print $2}' \ -INDEX.Z', this leads to: compctl -g '/home/ftp/index/INDEX/*-INDEX.Z(:t:r:s/-INDEX//)' ftp tftp # There are (at least) two ways to complete manual pages. This one is # extremely memory expensive if you have lots of man pages man_var() { man_pages=( $^manpath/man*/*(N:t:r) ) # Check your setting of SH_WORD_SPLIT compctl -k man_pages man reply=( $man_pages ) } compctl -K man_var man # This one isn't that expensive but somewhat slower man_glob () { local a read -cA a if [[ $a[2] = -s ]] then # Or [[ $a[2] = [0-9]* ]] for BSD reply=( $^manpath/man$a[3]/$1*$2(N:t:r) ) # See above else reply=( $^manpath/man*/$1*$2(N:t:r) ) # See above fi } compctl -K man_glob man # Various MH completions by Peter Stephenson # Still to do: # Support for searching for files in standard MH locations. # mhcomp is best autoloaded. Edit path where indicated. function mhcomp { # Completion function for MH folders. # Works with both + (rel. to top) and @ (rel. to current). local nword args pref char mhpath integer ngtrue read -nc nword read -cA args [[ -o nullglob ]] && ngtrue=1 || setopt nullglob pref=$args[$nword] char=$pref[1] pref=$pref[2,-1] # The `...`'s here account for most of the time spent in this function. if [[ $char = + ]]; then # mhpath=`mhpath +` # EDIT ME: Use a hard wired value here: it's faster. mhpath=~/Mail elif [[ $char = @ ]]; then mhpath=`mhpath` fi reply="reply=($mhpath/$pref*(-/))" eval $reply # I'm frankly amazed that this next step works, but it does. reply=(${reply#$mhpath/}) (( ngtrue )) || unsetopt nullglob } mhfseq() { set -A reply $(mark | awk -F: '{print $1}') \ next cur prev first last all unseen } compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k '(all fast nofast header noheader help list nolist \ pack nopack pop push recurse norecurse total nototal)' -- folder compctl -K mhfseq -x 's[+][@],c[-1,-draftfolder] s[+][@]' \ -K mhcomp -S / -q - 'c[-1,-draftmessage]' -K mhfseq - \ 'C[-1,-(editor|whatnowproc)]' -c - \ 's[-]' -k '(draftfolder draftmessage nodraftfolder editor noedit \ file form use nouse whatnowproc nowhatnowproc help)' -- comp compctl -K mhfseq + -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k '(audit noaudit changecur nochangecur form format \ file silent nosilent truncate notruncate width help)' - \ 'C[-1,-(audit|form|file)]' -f -- inc compctl -K mhfseq -x 's[+][@],C[-1,-src] s[+][@]' \ -K mhcomp -S / -q - 'c[-1,-file]' -f - 'c[-1,-rmmprov]' -c - \ 's[-]' -k '(draft link nolink preserve nopreserve src file \ rmmproc normmproc help)' -- refile compctl -K mhfseq -x 's[+][@],C[-1,-(draftfolder|fcc)] s[+][@]' \ -K mhcomp -S / -q - 'c[-1,-draftmessage]' -K mhfseq -\ 's[-]' -k '(annotate noannotate cc nocc draftfolder nodraftfolder \ draftmessage editor noedit fcc filter form inplace noinplace query \ noquery width whatnowproc nowhatnowproc help)' - 'c[-1,(cc|nocc)]' \ -k '(all to cc me)' - 'C[-1,-(filter|form)]' -f - \ 'C[-1,-(editor|whatnowproc)]' -c -- repl compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k '(clear noclear form format header noheader reverse noreverse \ file help width)' - 'C[-1,-(file|form)]' -f -- scan compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k '(draft header noheader showproc noshowproc)' - \ 'c[-1,showproc]' -c -- show compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' \ -k '(help)' -- rmm # End of MH completions # By Bart Schaefer # CVS -- there's almost no way to make this all-inclusive, but ... # cvsflags=(-H -Q -q -r -w -l -n -t -v -b -e -d) cvscmds=(add admin checkout commit diff history import export log rdiff release remove status tag rtag update) # diff assumes gnu rcs using gnu diff # log assumes gnu rcs compctl -k "($cvscmds $cvsflags)" \ -x "c[-1,-D]" -k '(today yesterday 1\\\ week\\\ ago)' \ - "r[add,;]" -k "(-k -m)" -f \ - "r[admin,;]" -K cvstargets \ - "r[checkout,;]" -k "(-A -N -P -Q -c -f -l -n -p -q -s -r -D -d -k -j)" \ - "r[commit,;]" -k "(-n -R -l -f -m -r)" -K cvstargets \ - "r[diff,;]" -k "(-l -D -r -c -u -b -w)" -K cvstargets \ - "r[history,;]" \ -k "(-T -c -o -m -x -a -e -l -w -D -b -f -n -p -r -t -u)" \ -K cvstargets \ - "r[history,;] c[-1,-u]" -u \ - "r[import,;]" -k "(-Q -q -I -b -m)" -f \ - "r[export,;]" -k "(-N -Q -f -l -n -q -r -D -d)" -f \ - "R[(r|)log,;]" -k "(-l -R -h -b -t -r -w)" -K cvstargets \ - 'R[(r|)log,;] s[-w] n[-1,,],s[-w]' -u -S , -q \ - "r[rdiff,;]" -k "(-Q -f -l -c -u -s -t -D -r -V)" -K cvstargets \ - "r[release,;]" -k "(-Q -d -q)" -f \ - "r[remove,;]" -k "(-l -R)" -K cvstargets \ - "r[status,;]" -k "(-v -l -R)" -K cvstargets \ - "r[tag,;]" -k "(-Q -l -R -q -d -b)" -K cvstargets \ - "r[rtag,;]" -k "(-Q -a -f -l -R -n -q -d -b -r -D)" -f \ - "r[update,;]" -k "(-A -P -Q -d -f -l -R -p -q -k -r -D -j -I)" \ -K cvstargets \ -- cvs unset cvsflags cvscmds cvstargets() { local nword args pref ngtrue f [[ -o nullglob ]] && ngtrue=1 setopt nullglob read -nc nword; read -Ac args pref=$args[$nword] if [[ -d $pref:h && ! -d $pref ]] then pref=$pref:h elif [[ $pref != */* ]] then pref= fi [[ -n "$pref" && "$pref" != */ ]] && pref=$pref/ reply=($(for f in $(cat ${pref}CVS/Entries 2>/dev/null | \ sed 's/^\/\([^\/]*\).*/\1/'); do echo $pref$f; done) $(echo ${pref}**/CVS(:h) | sed 's/CVS//')) [[ $ngtrue = 1 ]] || unsetopt nullglob }