1 | # |
---|
2 | # The following several shell functions and `compctl' commands |
---|
3 | # that will configure the programmable command completion of |
---|
4 | # the Z Shell (zsh) for the nmh mail system. |
---|
5 | # |
---|
6 | # You may need to edit where it says EDIT ME. |
---|
7 | # These were orginally written for MH by Peter Stephenson |
---|
8 | |
---|
9 | # The following three functions are best autoloaded. |
---|
10 | # |
---|
11 | # mhcomp completes folders (including subfolders). |
---|
12 | # mhfseq completes sequence names and message numbers. |
---|
13 | # mhfile completes files in standard nmh locations. |
---|
14 | |
---|
15 | # |
---|
16 | # Completion function for nmh folders. Works with |
---|
17 | # both + (relative to top) and @ (relative to current). |
---|
18 | # |
---|
19 | function mhcomp { |
---|
20 | local nword args pref char mhpath |
---|
21 | read -nc nword |
---|
22 | read -cA args |
---|
23 | |
---|
24 | pref=$args[$nword] |
---|
25 | char=$pref[1] |
---|
26 | pref=$pref[2,-1] |
---|
27 | |
---|
28 | # The $(...) here accounts for most of the time spent in this function. |
---|
29 | if [[ $char = + ]]; then |
---|
30 | # mhpath=$(mhpath +) |
---|
31 | # EDIT ME: use a hard wired value here: it's faster. |
---|
32 | mhpath=~/Mail |
---|
33 | elif [[ $char = @ ]]; then |
---|
34 | mhpath=$(mhpath) |
---|
35 | fi |
---|
36 | |
---|
37 | eval "reply=($mhpath/$pref*(N-/))" |
---|
38 | |
---|
39 | # I'm frankly amazed that this next step works, but it does. |
---|
40 | reply=(${reply#$mhpath/}) |
---|
41 | } |
---|
42 | |
---|
43 | # |
---|
44 | # Extract nmh message names and numbers for completion. Use of the |
---|
45 | # correct folder, if it is not the current one, requires that it |
---|
46 | # should be the previous command line argument. If the previous |
---|
47 | # argument is `-draftmessage', a hard wired draft folder name is used. |
---|
48 | # |
---|
49 | mhfseq() { |
---|
50 | local folder foldpath words pos nums |
---|
51 | read -cA words |
---|
52 | read -cn pos |
---|
53 | |
---|
54 | # Look for a folder name. |
---|
55 | # First try the previous word. |
---|
56 | if [[ $words[$pos-1] = [@+]* ]]; then |
---|
57 | folder=$words[$pos-1] |
---|
58 | # Next look and see if we're looking for a draftmessage |
---|
59 | elif [[ $words[$pos-1] = -draftmessage ]]; then |
---|
60 | # EDIT ME: shortcut -- hard-wire draftfolder here |
---|
61 | # Should really look for a +draftfolder argument. |
---|
62 | folder=+drafts |
---|
63 | fi |
---|
64 | # Else use the current folder ($folder empty) |
---|
65 | |
---|
66 | if [[ $folder = +* ]]; then |
---|
67 | # EDIT ME: use hard-wired path with + for speed. |
---|
68 | foldpath=~/Mail/$folder[2,-1] |
---|
69 | else |
---|
70 | foldpath=$(mhpath $folder) |
---|
71 | fi |
---|
72 | |
---|
73 | # Extract all existing message numbers from the folder. |
---|
74 | nums=($foldpath/<->(N:t)) |
---|
75 | # If that worked, look for marked sequences. |
---|
76 | # EDIT ME |
---|
77 | # if you never use non-standard sequences, comment out |
---|
78 | # or delete the next three lines. |
---|
79 | if (( $#nums )); then |
---|
80 | nums=($nums $(mark $folder | awk -F: '{print $1}')) |
---|
81 | fi |
---|
82 | |
---|
83 | # EDIT ME: `unseen' is the value of Unseen-Sequence, if it exists; |
---|
84 | set -A reply next cur prev first last all unseen $nums |
---|
85 | |
---|
86 | } |
---|
87 | |
---|
88 | # |
---|
89 | # Find an nmh file; for use with -form arguments and the like. |
---|
90 | # Use with compctl -K mhfile. |
---|
91 | # |
---|
92 | mhfile () { |
---|
93 | local mhfpath file |
---|
94 | # EDIT ME |
---|
95 | # Array containing all the places nmh will look for templates etc. |
---|
96 | mhfpath=(~/Mail /usr/local/nmh/lib) |
---|
97 | |
---|
98 | # Emulate completeinword behaviour as appropriate |
---|
99 | local wordstr |
---|
100 | if [[ -o completeinword ]]; then |
---|
101 | wordstr='$1*$2' |
---|
102 | else |
---|
103 | wordstr='$1$2*' |
---|
104 | fi |
---|
105 | |
---|
106 | if [[ $1$2 = */* ]]; then |
---|
107 | # path given: don't search nmh locations |
---|
108 | eval "reply=($wordstr(.N))" |
---|
109 | else |
---|
110 | # no path: only search nmh locations. |
---|
111 | eval "reply=(\$mhfpath/$wordstr(.N:t))" |
---|
112 | fi |
---|
113 | } |
---|
114 | |
---|
115 | # Note: you must type the initial + or @ of a folder name to get |
---|
116 | # completion, even in places where only folder names are allowed. |
---|
117 | # Abbreviations for options are not recognised. Hit tab to complete |
---|
118 | # the option name first. |
---|
119 | |
---|
120 | compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ |
---|
121 | 's[-]' -k "(all noall fast nofast header noheader help list nolist \ |
---|
122 | pack nopack pop push recurse norecurse total nototal)" -- folder folders |
---|
123 | |
---|
124 | compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ |
---|
125 | 's[-]' -k "(sequence all noall recurse norecurse showzero noshowzero \ |
---|
126 | alpha noalpha fast nofast help)" -- flist flists |
---|
127 | |
---|
128 | compctl -K mhfseq -x 's[+][@],c[-1,-draftfolder] s[+][@]' \ |
---|
129 | -K mhcomp -S / -q - 'c[-1,-draftmessage]' -K mhfseq - \ |
---|
130 | 'C[-1,-(editor|whatnowproc)]' -c - \ |
---|
131 | 's[-]' -k "(draftfolder draftmessage nodraftfolder editor noedit \ |
---|
132 | file form use nouse whatnowproc nowhatnowproc help)" - \ |
---|
133 | 'c[-1,-form]' -K mhfile -- comp |
---|
134 | |
---|
135 | compctl -K mhfseq -x 's[+][@]' \ |
---|
136 | -K mhcomp -S / -q - 'c[-1,-draftmessage]' -K mhfseq -\ |
---|
137 | 's[-]' -k "(annotate noannotate cc nocc draftfolder nodraftfolder \ |
---|
138 | draftmessage editor noedit fcc filter form group nogroup inplace noinplace |
---|
139 | query noquery width whatnowproc nowhatnowproc help)" - 'c[-1,(cc|nocc)]' \ |
---|
140 | -k "(all to cc me)" - 'C[-1,-(filter|form)]' -K mhfile - \ |
---|
141 | 'C[-1,-(editor|whatnowproc)]' -c -- repl |
---|
142 | |
---|
143 | compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ |
---|
144 | 's[-]' -k "(audit noaudit changecur nochangecur form format \ |
---|
145 | file silent nosilent truncate notruncate width help)" - \ |
---|
146 | 'C[-1,-(audit|form)]' -K mhfile - 'c[-1,-file]' -f + -- inc |
---|
147 | |
---|
148 | compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ |
---|
149 | 's[-]' -k "(sequence add delete list public nopublic zero nozero help)" -- \ |
---|
150 | mark |
---|
151 | |
---|
152 | compctl -K mhfseq -x 's[+][@]' \ |
---|
153 | -K mhcomp -S / -q - 'c[-1,-file]' -f - 'c[-1,-rmmprov]' -c - \ |
---|
154 | 's[-]' -k "(draft link nolink preserve nopreserve src file \ |
---|
155 | rmmproc normmproc help)" -- refile |
---|
156 | |
---|
157 | compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ |
---|
158 | 's[-]' -k "(clear noclear form format header noheader reverse noreverse \ |
---|
159 | file help width)" - 'c[-1,-file]' -f - 'c[-1,-form]' -K mhfile -- scan |
---|
160 | |
---|
161 | compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ |
---|
162 | 's[-]' -k "(draft form moreproc nomoreproc header noheader \ |
---|
163 | showproc noshowproc length width help)" - 'C[-1,-(show|more)proc]' -c - \ |
---|
164 | 'c[-1,-file]' -f - 'c[-1,-form]' -K mhfile - \ |
---|
165 | 'c[-1,-length]' -s '$LINES' - 'c[-1,-width]' -s '$COLUMNS' -- show next prev |
---|
166 | |
---|
167 | compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' \ |
---|
168 | -k "(help)" -- rmm |
---|
169 | |
---|
170 | compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \ |
---|
171 | 's[-]' -k "(after before cc date datefield from help list nolist \ |
---|
172 | public nopublic search sequence subject to zero nozero not or and \ |
---|
173 | lbrace rbrace)" -- pick |
---|
174 | |
---|
175 | compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' \ |
---|
176 | -k "(alias check draft draftfolder draftmessage help nocheck \ |
---|
177 | nodraftfolder)" -- whom |
---|
178 | |
---|
179 | compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' \ |
---|
180 | -k "(file part type list headers noheaders realsize norealsize nolist \ |
---|
181 | show serialonly noserialonly form pause nopause noshow store auto noauto \ |
---|
182 | nostore cache nocache rcache wcache check nocheck ebcdicsafe noebcdicsafe \ |
---|
183 | rfc934mode norfc934mode verbose noverbose help)" - \ |
---|
184 | 'c[-1,-file]' -f - 'c[-1,-form]' -K mhfile - \ |
---|
185 | 'C[-1,-[rw]cache]' -k '(public private never ask)' -- mhn |
---|
186 | |
---|
187 | compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' -k '(help)' -- mhpath |
---|
188 | |
---|