# # The following several shell functions and `compctl' commands # that will configure the programmable command completion of # the Z Shell (zsh) for the nmh mail system. # # You may need to edit where it says EDIT ME. # These were orginally written for MH by Peter Stephenson # The following three functions are best autoloaded. # # mhcomp completes folders (including subfolders). # mhfseq completes sequence names and message numbers. # mhfile completes files in standard nmh locations. # # Completion function for nmh folders. Works with # both + (relative to top) and @ (relative to current). # function mhcomp { local nword args pref char mhpath read -nc nword read -cA args pref=$args[$nword] char=$pref[1] pref=$pref[2,-1] # The $(...) here accounts 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 eval "reply=($mhpath/$pref*(N-/))" # I'm frankly amazed that this next step works, but it does. reply=(${reply#$mhpath/}) } # # Extract nmh message names and numbers for completion. Use of the # correct folder, if it is not the current one, requires that it # should be the previous command line argument. If the previous # argument is `-draftmessage', a hard wired draft folder name is used. # mhfseq() { local folder foldpath words pos nums read -cA words read -cn pos # Look for a folder name. # First try the previous word. if [[ $words[$pos-1] = [@+]* ]]; then folder=$words[$pos-1] # Next look and see if we're looking for a draftmessage elif [[ $words[$pos-1] = -draftmessage ]]; then # EDIT ME: shortcut -- hard-wire draftfolder here # Should really look for a +draftfolder argument. folder=+drafts fi # Else use the current folder ($folder empty) if [[ $folder = +* ]]; then # EDIT ME: use hard-wired path with + for speed. foldpath=~/Mail/$folder[2,-1] else foldpath=$(mhpath $folder) fi # Extract all existing message numbers from the folder. nums=($foldpath/<->(N:t)) # If that worked, look for marked sequences. # EDIT ME # if you never use non-standard sequences, comment out # or delete the next three lines. if (( $#nums )); then nums=($nums $(mark $folder | awk -F: '{print $1}')) fi # EDIT ME: `unseen' is the value of Unseen-Sequence, if it exists; set -A reply next cur prev first last all unseen $nums } # # Find an nmh file; for use with -form arguments and the like. # Use with compctl -K mhfile. # mhfile () { local mhfpath file # EDIT ME # Array containing all the places nmh will look for templates etc. mhfpath=(~/Mail /usr/local/nmh/lib) # Emulate completeinword behaviour as appropriate local wordstr if [[ -o completeinword ]]; then wordstr='$1*$2' else wordstr='$1$2*' fi if [[ $1$2 = */* ]]; then # path given: don't search nmh locations eval "reply=($wordstr(.N))" else # no path: only search nmh locations. eval "reply=(\$mhfpath/$wordstr(.N:t))" fi } # Note: you must type the initial + or @ of a folder name to get # completion, even in places where only folder names are allowed. # Abbreviations for options are not recognised. Hit tab to complete # the option name first. compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k "(all noall fast nofast header noheader help list nolist \ pack nopack pop push recurse norecurse total nototal)" -- folder folders compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k "(sequence all noall recurse norecurse showzero noshowzero \ alpha noalpha fast nofast help)" -- flist flists 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)" - \ 'c[-1,-form]' -K mhfile -- comp compctl -K mhfseq -x 's[+][@]' \ -K mhcomp -S / -q - 'c[-1,-draftmessage]' -K mhfseq -\ 's[-]' -k "(annotate noannotate cc nocc draftfolder nodraftfolder \ draftmessage editor noedit fcc filter form group nogroup inplace noinplace query noquery width whatnowproc nowhatnowproc help)" - 'c[-1,(cc|nocc)]' \ -k "(all to cc me)" - 'C[-1,-(filter|form)]' -K mhfile - \ 'C[-1,-(editor|whatnowproc)]' -c -- repl 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)]' -K mhfile - 'c[-1,-file]' -f + -- inc compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k "(sequence add delete list public nopublic zero nozero help)" -- \ mark compctl -K mhfseq -x '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[+][@]' -K mhcomp -S / -q - \ 's[-]' -k "(clear noclear form format header noheader reverse noreverse \ file help width)" - 'c[-1,-file]' -f - 'c[-1,-form]' -K mhfile -- scan compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k "(draft form moreproc nomoreproc header noheader \ showproc noshowproc length width help)" - 'C[-1,-(show|more)proc]' -c - \ 'c[-1,-file]' -f - 'c[-1,-form]' -K mhfile - \ 'c[-1,-length]' -s '$LINES' - 'c[-1,-width]' -s '$COLUMNS' -- show next prev compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' \ -k "(help)" -- rmm compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ 's[-]' -k "(after before cc date datefield from help list nolist \ public nopublic search sequence subject to zero nozero not or and \ lbrace rbrace)" -- pick compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' \ -k "(alias check draft draftfolder draftmessage help nocheck \ nodraftfolder)" -- whom compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' \ -k "(file part type list headers noheaders realsize norealsize nolist \ show serialonly noserialonly form pause nopause noshow store auto noauto \ nostore cache nocache rcache wcache check nocheck ebcdicsafe noebcdicsafe \ rfc934mode norfc934mode verbose noverbose help)" - \ 'c[-1,-file]' -f - 'c[-1,-form]' -K mhfile - \ 'C[-1,-[rw]cache]' -k '(public private never ask)' -- mhn compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' -k '(help)' -- mhpath