1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
|
#
# 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 originally 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 \
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
|