Added all of the MH sources, including RCS files, in
[mmh] / docs / historical / mh-6.8.5 / papers / mh4 / text.tex
1 % begin text
2 \banner
3 \section{Acknowledgements}
4 The \MH/ system described herein is based on the original Rand \MH/ system.
5 It has been extensively developed (perhaps too much so) by Marshall Rose and
6 John Romine at the University of California, Irvine.
7 Einar Stefferud, Jerry Sweet, and Terry Domae provided numerous suggestions
8 to improve the UCI version of \MH/.
9 \section{Disclaimer}
10 The Regents of the University of California wish to make it known that:
11 \bigquote
12 Although each program has been tested by its contributor,
13 no warranty, express or implied,
14 is made by the contributor or the University of California,
15 as to the accuracy and functioning of the program
16 and related program material,
17 nor shall the fact of distribution constitute any such warranty,
18 and no responsibility is assumed by the contributor
19 or the University of California in connection herewith.
20 \endbigquote
21 \section{Conventions}
22 In this document,
23 certain \TeX -formatting conventions are adhered to:
24 {\advance\leftskip by\parindent
25 \item{1.} The names of \unix/ commands, such as \pgm{comp},
26 are presented in {\it text italics}.
27 \item{2.} Arguments to programs, such as \arg{msgs},
28 are presented in {\sl slanted roman} and delimited by single-quotes.
29 \item{3.} \unix/ pathnames and envariables,
30 such as \file{/usr/uci/} and \file{\$SIGNATURE},
31 are also presented in {\sl slanted roman}.
32 \item{4.} Text presenting an example, such as \eg{frated},
33 is presented in {\tt typewriter style}.
34 \item{5.} Entries in the user's \MH/ \profile/ and \context/ files,
35 such as \entry{Current-Folder},
36 are presented in {\sc Caps-Small-Caps} and delimited by a box.
37 \smallskip}
38 \bop\section{General Changes}
39 This section discusses system-wide changes to \MH/ that are general in nature.
40 \subsection{Message Numbering}
41 In previous versions of \MH/, a folder could have up to \eg{999} messages;
42 in \mh4, this limit has been raised to \eg{1999}.
43 \subsection{Version Information}
44 When any \MH/ command is invoked with the \switch{help} switch,
45 in addition to listing the syntax of the command,
46 the program will list information pertaining to its version.
47 This information includes the version of \MH/,
48 the host it was generated on,
49 and the date the program was loaded.
50 For example,
51 \example MH \#4.25[UCI] (uci-750b) of Thu Jul 19 21:07:01 PDT 1984\endexample
52 The \eg{\#4.25[UCI]} indicates that the program is from the UCI \mh4
53 version of \MH/.
54 The program was generated on \eg{uci-750b},
55 on \eg{Thu Jul 19 21:07:01 PDT 1984}.
56 \par
57 This information is sometimes useful in the unusual circumstance when a bug
58 is found in \MH/.
59 By providing the version information,
60 along with the circumstances concerning the problem with \MH/,
61 the local \MH/ maintainer is better able to track-down the problem.
62 \subsection{The User Context}
63 The \MH/ profile for the user now consists of two parts:
64 a static part, the \profile/, which is found in the user's \file{\$HOME/}
65 directory,
66 and, a dynamic part, the \context/, which is usually found in the user's \MH/
67 directory.
68 The former file contains information which \MH/ commands read,
69 but {\it never\/} write
70 (e.g., command switches).
71 The latter contains information that \MH/ commands read and write,
72 (e.g., \entry{Current-Folder}).
73 \par
74 This change has three advantages over the way things were done in \mh3.
75 \underbar{First},
76 a lot less information gets written out when an \MH/ command exits,
77 if the context changes.
78 This is due to the fact that the user's \context/ file is often much,
79 much smaller than a user's \profile/ file.
80 \underbar{Second},
81 one can keep different context files around
82 (the entry \entry{context} is changed in the user's \profile/ file).%
83 \nfootnote{Note that this entry must be given {\it entirely} in lowercase in
84 the \profile/ file.}
85 Hence, the \MH/ user can maintain different sets of private sequences
86 (explained later),
87 by manipulating different \context/ files.
88 \underbar{Third},
89 if more than one person uses a \unix/ login
90 (say a maintenance account),
91 then each can define their own \file{\$MH} envariable to point to their
92 \profile/ file.
93 As a result,
94 each user has the \MH/ environment which that user is accustomed to.
95 Further,
96 depending on the needs of the users who share the \unix/ login,
97 the same or different contexts may be automatically maintained for that login.
98 \par
99 See \man{mh-profile}(5) for more details on the user context file.
100 \section{Message Selection}
101 A new facility has been added to give the \MH/ user greater power in
102 selecting and referencing messages:
103 first, a change to the \pgm{pick} program is described;
104 second, the notion of user-defined sequences is detailed.
105 \subsection{Selecting Messages}
106 The \pgm{pick} command now does only one thing:
107 it defines sequences based on the selection criterion it is given.
108 In addition, with the \switch{list} switch,
109 \pgm{pick} can be directed to list the numbers of the messages which
110 satisfied the criterion, to the standard output.
111 This is very handy for using \pgm{pick} in backquoted operations with the
112 shell.
113 \subsection{User-Defined Sequences}
114 User-defined sequences allow the \MH/ user a tremendous amount of power
115 in dealing with groups of messages in the same folder
116 by allowing the user to bind a group of messages to a meaningful symbolic
117 name.
118 The user may choose any name for a message sequence,
119 as long as it consists of alphanumeric characters and does not conflict with
120 the standard \MH/ reserved message names (e.g., \arg{first}, etc).
121 After defining a sequence,
122 it can be used wherever a \MH/ command expects a \arg{msg} or \arg{msgs}
123 argument.
124 Although all \MH/ commands expand user-defined sequences as appropriate,
125 there are two commands that allow the user to define and manipulate them:
126 \pgm{pick} and \pgm{mark}.
127 \subsubsection{Pick and User-Defined Sequences}
128 Most users of \MH/ will use only the \pgm{pick} command.
129 By giving the \switch{sequence~name} switch to \pgm{pick}
130 (which can occur more than once on the command line),
131 each sequence named is defined as those messages which \pgm{pick} matched,
132 according the the selection criteria it was given.
133 Hence,
134 \example pick -from frated -seq fred\endexample
135 finds all those messages in the current folder which were from
136 \eg{frated},
137 creates a sequence called \eg{fred},
138 and then adds them to the sequence.
139 The user could then invoke
140 \example scan fred\endexample
141 to get a \pgm{scan} listing of those messages.
142 Note that by default,
143 \pgm{pick} creates the named sequences
144 before it adds the selected messages to the sequence.
145 Hence, if the named sequence already existed,
146 the sequence is destroyed prior to being re-defined
147 (nothing happens to the messages that were a part of this sequence,
148 they simply cease to be members of that sequence).
149 By using the \switch{nozero} switch, this behavior can be inhibited,
150 as in
151 \example
152     pick -from frated -seq sgroup\\
153     pick -from fear -seq sgroup -nozero\\
154     pick -from freida -seq sgroup -nozero%
155 \endexample
156 which finds all those messages in the current folder which were from
157 \eg{frated}, \eg{fear}, or \eg{freida},
158 and defines the sequence called \eg{sgroup} as exactly those messages.
159 These operations amounted to an ``inclusive-or'' of three selection
160 criteria.
161 Using \pgm{pick},
162 one can also generate the ``and'' of some selection criteria as well:
163 \example
164     pick -from frated -seq fred\\
165     pick -before friday -seq fred -nozero fred%
166 \endexample
167 This example defines the sequence called \eg{fred} as exactly those
168 messages from \eg{frated} that were dated prior to \eg{friday}.
169 \par
170 \pgm{Pick} is normally used as a back-quoted command,
171 for example,
172 \example scan \bq{pick -from postmaster}\endexample
173 Now suppose that the user decides that another command should be issued,
174 using exactly those messages.
175 Since,
176 \pgm{pick} wasn't given a \switch{sequence~name} argument in this example,
177 the user would end-up typing the entire back-quoted command again.
178 A simpler way is to add a default sequence name to the \profile/ file.
179 For example,
180 \example pick: -sequence select -list\endexample
181 will tell \pgm{pick} to always define the sequence \eg{select} whenever
182 it's run.
183 The \switch{list} is necessary since the \switch{sequence~name} switch sets
184 \switch{nolist}
185 whenever the former is encountered.
186 Hence, this profile entry makes \pgm{pick} define the \eg{select}
187 sequence and otherwise behave exactly as if it had no profile entry at all.
188 \par
189 Finally,
190 previous versions of \pgm{pick} balked if a selection criterion was not given.
191 The \mh4 version of \pgm{pick} does not, and merely matches the messages that
192 were specified.
193 This lets the \MH/ user type something such as
194 \example show \bq{pick last:20 -seq fear}\endexample
195 instead of typing
196 \example
197     mark -add -nozero -seq fear last:20\\
198     show fear%
199 \endexample
200 \subsubsection{Mark and User-Defined Sequences}
201 The \pgm{mark} command lets the user perform low-level manipulation of
202 sequences,
203 and also provides a well-needed debug facility to the
204 implementors/developers/maintainers of \MH/ (the \MH/-hacks).
205 In the future, a user-friendly ``front-end'' for \pgm{mark} will
206 probably be developed to give the \MH/ user a way to take better
207 advantage of the underlying facilities.
208 \subsubsection{Public and Private User-Defined Sequences}
209 There are two kinds of sequences: {\it public\/} sequences,
210 and {\it private\/} sequences.
211 {\it Public\/} sequences of a folder are accessible to any \MH/ user who
212 can read that folder.
213 {\it Private\/} sequences are accessible only to the \MH/ user who defined
214 those sequences.
215 By default,
216 \pgm{pick} (and \pgm{mark\/}) create {\it public\/} sequences
217 if the folder for which the sequences are being defined is writable by the
218 \MH/ user.
219 Otherwise, {\it private\/} sequences are created.
220 This can be overridden with the \switch{public} and \switch{private} switches.
221 \subsubsection{Sequence Negation}
222 In addition to telling a \MH/ command to use the messages in the sequence
223 \eg{seen}, as in
224 \example refile seen +old\endexample
225 it would be useful to be easily able to tell a \MH/ command to use all
226 messages {\it except\/} those in the sequence.
227 One way of doing this would be to use \pgm{mark} and define the sequence
228 explicitly,
229 as in
230 \example mark -delete -zero seen -seq notseen\endexample
231 which,
232 owing to \pgm{mark\/}'s cryptic interpretation of \switch{delete} and
233 \switch{zero},
234 defines the sequence \eg{notseen} to be all messages not in the sequence
235 \eg{seen}.
236 Naturally,
237 anytime the sequence \eg{seen} is changed,
238 \eg{notseen} will have to be updated.
239 Another way to achieve this is to define the entry
240 \entry{Sequence-Negation} in the \profile/ file.
241 If the entry was
242 \example Sequence-Negation: not\endexample
243 then anytime a \MH/ command was given \eg{notseen} as a \arg{msg} or
244 \arg{msgs} argument,
245 it would substitute all messages that are not a member of the sequence
246 \eg{seen}.
247 That is,
248 \example refile notseen +new\endexample
249 does just that.
250 The value of the \entry{Sequence-Negation} entry in the profile can be
251 any string.
252 Hence,
253 experienced users of \MH/ do not use a word,
254 but rather a special character which their shell does not interpret
255 (users of the \pgm{CShell} use a single carat, \eg{`\^'},
256 while users of the Bourne shell use an exclamation-mark, \eg{`!'\/}).
257 This is because there is nothing to prevent a user of \MH/ from defining a
258 sequence with this string as its prefix,
259 if the string is nothing but letters and digits.
260 Obviously,
261 this could lead to confusing behavior
262 if the \entry{Sequence-Negation} entry leads \MH/ to believe that two
263 sequences are opposites, by virtue of their names differing by the prefix
264 string.
265 \subsubsection{The Previous Sequence}
266 Many times users find themselves issuing a series of commands on the same
267 sequences of messages.
268 If the user first defined these messages as a sequence,
269 then considerable typing may be saved.
270 If the user doesn't have this foresight,
271 \MH/ provides a handy way of remembering the \arg{msgs} or
272 \arg{msg} argument last given to a \MH/ command by the user.
273 If the entry \entry{Previous-Sequence} is defined in the \profile/ file,
274 then when the command finishes,
275 it will define the sequence(s) named in the value of this entry as being
276 defined as those messages that were specified.
277 Hence, a profile entry of
278 \example Previous-Sequence: pseq\endexample
279 directs any \MH/ command that accepts a \arg{msg} or \arg{msgs} argument to
280 define the sequence \eg{pseq} as those messages when it finishes.
281 More than one sequence name may be placed in this entry,
282 separated with spaces.
283 The one disadvantage of this approach
284 is that all \MH/ commands have to update the sequence information for
285 the folder each time they run
286 (although most commands read this information,
287 usually only \pgm{pick} and \pgm{mark} have to write this information out).
288 \section{Composition of Mail}
289 Two new facilities have been added to give the \MH/ user greater power in
290 composing and sending mail:
291 the {\it draft folder},
292 which allows a user to maintain a folder of message drafts;
293 and, {\it draft pushing},
294 which permits a user to \pgm{send} the current draft in the background.
295 \subsection{The Draft Folder}
296 The \pgm{comp}, \pgm{dist}, \pgm{forw}, and \pgm{repl} commands have two
297 hidden switches, \switch{draftfolder~+folder} and \switch{draftmessage~msg}.
298 If \switch{draftfolder~+folder} is used,
299 these commands are directed to construct a draft message in the indicated
300 folder.
301 If \switch{draftmessage~msg} is not used, it defaults to \arg{new}
302 (unless the user invokes \pgm{comp} with \switch{use},
303 in which case the default is \arg{cur}).
304 Hence, the user may have several message compositions in progress
305 simultaneously.
306 Now, all of the \MH/ tools are available on each of the user's message
307 drafts
308 (e.g., \pgm{show}, \pgm{scan}, \pgm{pick}, and so on).
309 If the folder does not exist,
310 the user is asked if it should be created (just like with \pgm{refile\/}).
311 Also,
312 the last draft message the user was composing is known as \arg{cur} in the
313 draft folder.
314 \par
315 Furthermore,
316 the \pgm{send} command has these switches as well.
317 Hence, from the shell,
318 the user can send off whatever drafts desired using the
319 standard \MH/ \arg{msgs} convention with \switch{draftmessage msgs}.
320 If no \arg{msgs} are given, it defaults to \arg{cur}.
321 \par
322 In addition,
323 all five programs have a \switch{nodraftfolder} switch,
324 which undoes the last occurance of \switch{draftfolder~folder}
325 (useful if the latter occurs in the user's \MH/ profile).
326 \par
327 If the user does not give the \switch{draftfolder~+folder} switch,
328 then all these commands act ``normally''.
329 Note that the \switch{draft} switch to \pgm{send} and \pgm{show}
330 still refers to the file called \eg{draft} in the user's \MH/
331 directory.
332 In the interests of economy of expression,
333 when using \pgm{comp} or \pgm{send},
334 the user needn't prefix the draft \arg{msg} or \arg{msgs} with
335 \switch{draftmessage}.
336 Both of these commands accept a \arg{file} or \arg{files} argument,
337 and they will, if given \switch{draftfolder~+folder} treat these arguments
338 as \arg{msg} or \arg{msgs}.%
339 \nfootnote{This may appear to be inconsistant, at first,
340 but it saves a lot of typing.}
341 Hence,
342 \example send -draftf +draft first\endexample
343 is the same as
344 \example send -draftf +draft -draftm first\endexample
345 \par
346 To make all this a bit more clear, here are some examples.
347 Let's assume that the following entries are in the \profile/ file:
348 \example
349     comp: -draftfolder +draft\\
350     dist: -draftfolder +draft\\
351     forw: -draftfolder +draft\\
352     repl: -draftfolder +draft\\
353     sendf: -draftfolder +draft%
354 \endexample
355 Furthermore,
356 let's assume that the program \pgm{sendf} is a symbolic link in the user's 
357 \file{\$HOME/bin/} directory to \pgm{send}.
358 Then, any of the commands
359 \example
360     comp\\
361     dist\\
362     forw\\
363     repl%
364 \endexample
365 constructs the message draft in the \eg{draft} folder using the \arg{new}
366 message number.
367 Furthermore,
368 they each define \arg{cur} in this folder to be that message draft.
369 If the user were to use the \pgm{quit} option at \whatnow/ level,
370 then later on,
371 if no other draft composition was done,
372 the draft could be sent with simply
373 \example sendf\endexample
374 Or,
375 if more editing was required,
376 the draft could be edited with
377 \example comp -use\endexample
378 Instead,
379 if other drafts had been composed in the meantime,
380 so that this message draft was no longer known as \arg{cur} in the \eg{draft}
381 folder,
382 then the user could \pgm{scan} the folder to see which message draft in the
383 folder should be used for editing or sending.
384 Clever users could even employ \pgm{pick} to do the work:
385 \example
386     comp -use \bq{pick +draft -to bug-mh}\\
387 \noalign{\leftline{or}}
388     sendf \bq{pick +draft -to bug-mh}%
389 \endexample
390 Note that in the \pgm{comp} example,
391 the output from \pgm{pick} must resolve to a single message draft
392 (it makes no sense to talk about composing two or more drafts with one
393 invocation of \pgm{comp\/}).
394 In contrast,
395 in the \pgm{send} example,
396 as many message drafts as desired can appear,
397 since \pgm{send} doesn't mind sending more than one draft at a time.
398 \par
399 Note that the argument \switch{draftfolder~+folder} is not
400 included in the profile entry for \pgm{send},
401 since when \pgm{comp}, et. al., invoke \pgm{send} directly,
402 they supply \pgm{send} with the \unix/ pathname of the message draft,
403 and {\it not} a \arg{draftmessage~msg} argument.
404 As far as \pgm{send} is concerned,
405 a {\it draft folder} is not being used.
406 \par
407 It is important to realize that \MH/ treats the draft folder like a standard
408 \MH/ folder in nearly all respects.
409 There are two exceptions:
410 \underbar{first}
411 under no circumstancs will the \arg{draftfolder~folder} switch cause the
412 named folder to become the current folder.%
413 \nfootnote{Obviously,
414 if the folder appeared in the context of a standard \arg{+folder}
415 argument to an \MH/ program, as in
416 \example scan +draft\endexample
417 it might become the current folder, depending on the context changes of the
418 \MH/ program in question.}
419 \underbar{Second},
420 although conceptually \pgm{send} deletes the \arg{msgs} named in the draft
421 folder,
422 it does not call \entry{delete-prog} to perform the deletion.
423 \subsection{What Happens if the Draft Exists}
424 When the \pgm{comp}, \pgm{dist}, \pgm{forw}, and \pgm{repl} commands are
425 invoked and the draft you indicated already exists,
426 these programs will prompt the user for a reponse directing the program's
427 action.
428 In \mh4, the prompt is
429 \begingroup
430     \smallertype
431     \example
432         ``/usr/src/uci/mh/mhbox/draft'' exists; replace, list, or quit?%
433     \endexample
434 \endgroup
435 The appropriate responses and their meanings are:
436 \smallskip
437 {\advance\leftskip by\parindent
438 \item{\underbar{replace}:} deletes the draft and starts afresh.
439 \item{\underbar{list}:} lists the draft.
440 \item{\underbar{quit}:} leaves the draft intact and exits.
441 \smallskip}
442 \noindent
443 In addition, if you specified \switch{draftfolder~folder} to the command,
444 then one other response will be accepted:
445 \smallskip
446 {\advance\leftskip by\parindent
447 \item{\underbar{new}:} finds a new draft,
448 just as if \switch{draftmessage~new} had been given.
449 \smallskip}
450 \noindent
451 Finally, the \pgm{comp} command will accept one more response:
452 \smallskip
453 {\advance\leftskip by\parindent
454 \item{\underbar{use}:} re-uses the draft,
455 just as if \switch{use} had been given.
456 \smallskip}
457 \subsection{The Push Option at\/{ }\whatnow/ Level}
458 The \pgm{comp}, \pgm{dist}, \pgm{forw}, and \pgm{repl} commands take
459 an additional option for the \whatnow/ query.
460 The \pgm{push} option, which must be spelled out fully,
461 directs the command to \pgm{send} the draft
462 in a special detached fashion,
463 with all normal output is discarded.
464 If \pgm{push} is used and the draft can not be sent,
465 then \MH/ will send the user a message,
466 indicating the name of the draft file,
467 and an explanation of the failure.
468 Although using \pgm{push} calls \man{send}(1),
469 the \pgm{send} command will consult the profile entry for \pgm{push}.
470 \par
471 The user can also invoke \pgm{send} from the shell with the \switch{push}
472 switch,
473 which makes \pgm{send} act like it had been \pgm{push\/}'d by one of the
474 composition commands.%
475 \nfootnote{Note that in this case,
476 \pgm{send} consults the profile entry for whatever name it was invoked as,
477 such as \pgm{sendf}.}
478 \par
479 The \pgm{send} program also has two other switches,
480 \switch{unique} and \switch{nounique}.
481 If \pgm{push\/}'d,
482 then the \switch{unique} switch tells \pgm{send} to rename the draft file to
483 a unique filename.
484 This allows the user to have several drafts being sent simultaneously
485 (after {\it push\/}ing one draft,
486 another draft may be composed and edited immediately).
487 The \switch{unique} switch,
488 which is the default when \pgm{send} is \pgm{push\/}'d,
489 is not really useful if you're using {\it draft folders},
490 as the user generally gets a new message draft for each composition.
491 Hence, users of the {\it draft folder} mechanism should put
492 \example send: -nounique\endexample
493 in their \profile/ file.
494 This has the added advantage of making
495 \example comp -use\endexample
496 easy to use when a draft fails to be posted properly.
497 \par
498 By using \pgm{push}, the user can free the shell to do other things,
499 because it appears to the shell that the \MH/ command has finished.
500 As a result the shell will immediately prompt for another command,
501 despite the fact that the command is really still running.
502 Note that if the user indicates that annotations are to be performed
503 (with \switch{annotate}),
504 the annotations will be performed after the message has been
505 successfully sent.
506 This action will appear to occur asynchronously.
507 Obviously, if one of the messages that is to be annotated is
508 removed before the draft has been successfully sent,
509 then when \MH/ tries to make the annotations,
510 it won't be able to do so,
511 and an error message will mysteriously appear on the user's terminal.
512 \subsection{Options at\/{ }\whatnow/ Level}
513 When using the \pgm{comp}, \pgm{dist}, \pgm{forw}, and \pgm{repl} commands at
514 \whatnow/ level,
515 the \pgm{edit}, \pgm{list}, \pgm{headers},
516 and (for the \pgm{dist} and \pgm{repl} commands) the \pgm{display} options
517 will pass on any additional arguments given them to whatever program they
518 invoke.
519 \par
520 In addition,
521 in \mh1 (the original Rand \MH/)
522 and \mh2 (the first UCI version of \MH/),
523 \MH/ used a complicated heuristic to determine if the draft should be deleted
524 or preserved after an unsuccessful edit.
525 In \mh3,
526 \MH/ was changed to always preserve the draft,
527 since \pgm{comp}, et. al.,
528 could usually look at a draft, apply another set of heuristics,
529 and decide if it was important or not.
530 With the notion of a {\it draft folder}, 
531 in which one by default gets a \arg{new} message draft,
532 \mh4 has again re-implemented the edit deletion/preservation
533 algorithm (with a minor bug-fix),
534 to keep the draft folder from being cluttered with aborted edits.
535 \par
536 Also,
537 note that by default,
538 if the draft cannot be successfully sent,
539 these commands return to \whatnow/ level.
540 But, when \pgm{push} is used, this does not happen (obviously).
541 Hence,
542 if these commands were expected to annotate any messages,
543 this will have to be done by hand, later on, with the \pgm{anno} command.
544 \par
545 Finally, if the \switch{delete} switch is given to the \pgm{quit} option,
546 then these commands will inform the user of the name of the unsent draft file.
547 \subsection{Posting of Mail}
548 \mh4 does a few different things when mail is posted.
549 \subsubsection{Signature}
550 There's now a \entry{Signature} entry in the \profile/ file.
551 If the \file{\$SIGNATURE} envariable is not set,
552 then \pgm{send} will consult this profile entry to determine the
553 personal name of the \MH/ user.
554 This personal name is placed in the \eg{From:} field of the message.
555 If this profile entry doesn't exist,
556 then \pgm{send} will consult the file \file{\$HOME/.signature}.
557 \subsubsection{Blind Carbon Copies}
558 The \pgm{post} command now handles blind carbon copies in an entirely
559 different fashion from the way they were handled in \mh3.
560 In particular,
561 the message sent to ``blind'' recipients contains minimal information in its
562 headers,
563 namely \eg{Date:},
564 \eg{Message-ID:} (if \switch{msgid} was given),
565 \eg{From:},
566 \eg{Subject:} (if given in the message draft),
567 and a standard blind carbon copy disclaimer.
568 The body of the message sent to the blind recipients is simply the actual
569 message sent to the ``sighted'' recipients.
570 However,
571 if the \switch{filter~filterfile} switch was given to \pgm{post},
572 then the body of the message is given to \pgm{mhl} to be formatted with the
573 named \arg{filterfile}.
574 \subsubsection{Server Interaction}
575 In \mh4, \MH/ supports a mail transport configuration which allows
576 \pgm{post} to talk directly to an SMTP server.
577 A possible extension of this,
578 which looks particularly promising for when \MH/ is used on small
579 workstations,
580 is the ability to post mail on a different host,
581 such as a ``mail relay''.
582 In this way,
583 the load on the local host may be reduced,
584 and mail traffic may be handled more efficiently.
585 \section{Folder Handling}
586 Two new facilities have been added to give the \MH/ user greater power in
587 manipulating folders:
588 {\it relative folder addressing},
589 which allows a user to shorten the typing of long folder names;
590 and the {\it folder-stack},
591 which permits a user to keep a stack of current folders.
592 \subsection{Relative Folder Addressing}
593 By default, when \arg{+folder} is given,
594 and the folder name is not absolute
595 (i.e., does not start with \file{/}, \file{./}, or \file{../}),
596 then the \unix/ pathname of the folder is interpreted relative to the user's
597 \MH/ directory.
598 Although this mechanism works fine for top-level folders and their immediate
599 sub-folders,
600 once the depth of the sub-folder tree grows, it becomes rather unwieldly:
601 \example scan +mh/mh.4/draft/flames\endexample
602 is a lot of typing.
603 \MH/ can't do anything if the current folder was \eg{+inbox},
604 but if the current folder was, say, \eg{+mh/mh.4/draft},
605 \MH/ has a short-hand notation to reference a sub-folder of the
606 current folder.
607 Using the \arg{@folder} notation,
608 the \MH/ user can direct any \MH/ command which expects a \arg{+folder}
609 argument to look for the folder relative to the current folder instead of the
610 user's \MH/ directory.
611 Hence, if the current folder was \eg{+mh/mh.4/draft},
612 then
613 \example scan @flames\endexample
614 would do the trick handily.
615 In addition, if the current folder was \eg{+mh/mh.4/draft},
616 \example scan @../pick\endexample
617 would scan the folder \eg{+mh/mh.4/pick},
618 since, in the \unix/ fashion,
619 it references the folder \eg{pick} which is a sub-folder of
620 the folder that is the parent of the current folder.
621 Since most advanced \MH/ users seem to exhibit a large degree of locality
622 in referencing folders when they process mail,
623 this convention should receive a lot of use.
624 \subsection{The Folder Stack}
625 The {\it folder-stack\/} mechanism in \MH/ gives the \MH/ user a
626 facility similar to the {\it CShell\/}'s directory-stack.
627 Simply put,
628 \example folder -push +foo\endexample
629 makes \eg{foo} the current folder,
630 saving the folder that was previously the current folder on the
631 {\it folder-stack}.
632 As expected,
633 \example folder -pop\endexample
634 takes the top of the {\it folder-stack\/} and makes it the current folder.
635 Each of these switches lists the {\it folder-stack\/} when they execute.
636 It is simple to write a {\it pushf\/} command as a shell script.
637 It's one line:
638 \example exec folder -push \$@\endexample
639 Probably a better way is to link \pgm{folder} to your \file{\$HOME/bin/}
640 directory under the name of \pgm{pushf} and then add the entry
641 \example pushf: -push\endexample
642 to the \profile/ file.
643 \par
644 The manual page for \man{folder}(1) discusses the analogy between the
645 \pgm{CShell} directory stack commands and the switches in \pgm{folder}
646 which manipulate the {\it folder-stack}.
647 \section{Other Changes}
648 This last section discusses the other,
649 more program-specific changes made to \MH/.
650 \subsection{Address Parsing}
651 There's a new library program, \pgm{ap}, which parses addresses according to
652 the rules that the \MH/ programs use.
653 It's often useful for figuring out how \MH/ sees a particular address.
654 The \pgm{rcvtrip} rcvmail hook,
655 described at the end of this report,
656 uses this facility.
657 \subsection{Alternate Mailboxes}
658 There's a new entry in the profile, \entry{Alternate-Mailboxes},
659 which is read by \pgm{repl} and \pgm{scan} to determine which addresses in a
660 messages are under the user's administration.
661 Hence,
662 \example
663     Alternate-Mailboxes: mh@uci-750a, bug-mh
664 \endexample
665 says that the mailbox \eg{mh@uci-750a}
666 and any mailbox whose local part is \eg{bug-mh}
667 is read by the user.
668 Hence, \pgm{repl} will not include them in the reply list,
669 and \pgm{scan} will act accordingly if it encounters a message which is from
670 any of these addresses.
671 A current restriction is that the hostnames given must be the ``official''
672 hostnames for the mailboxes,
673 as local nicknames for hosts are not replaced with their official site names.
674 \subsection{Annotation}
675 The \pgm{anno} command no longer prompts for a \eg{text} component
676 if the \switch{text~body} switch isn't given.
677 \subsection{More on Folder Handling}
678 If \pgm{folders} 
679 (or \pgm{folder} when invoked with the \switch{all} switch)
680 is given a \arg{+folder} or \arg{msg} argument,
681 then it will set the current folder and/or message
682 (in previous versions of \MH/,
683 \pgm{folders} ignored any \arg{+folder} or \arg{msg} arguments).
684 In addition,
685 the top-level folders of the current folder will be listed
686 (if \switch{norecurse} is in effect),
687 or the current folder will be listed recursively
688 (if \switch{recurse} was given).
689 \subsection{Scanning}
690 The \pgm{scan} and \pgm{inc} commands now have a \switch{size} switch
691 (and a complementary switch, \switch{nosize}),
692 which indicate if the {\it scan listing\/} should include the size of the
693 message in bytes.
694 \par
695 Furthermore,
696 the fields in the {\it scan listing\/} have been compressed a bit to allow
697 more of the \eg{Subject} and \eg{Body} portions of the listing to appear.
698 \par
699 Finally,
700 if \pgm{scan} encounters a message without a date field,
701 rather than leaving that portion of the {\it scan listing} blank,
702 as had been done in previous versions of \MH/,
703 the date is filled-in with the last write date of the message,
704 and post-fixed with a `*'.
705 This is particularly handy for scanning a {\it draft folder},
706 as message drafts usually aren't allowed to have dates in them.
707 \subsection{BBoards Support}
708 The \pgm{bbr} command now uses the name it was invoked with as its prompting
709 string.
710 To override this,
711 the \MH/ user can specify the \switch{prompt~string} switch to \pgm{bbr}.
712 \par
713 The \pgm{bbc} command now lists the \eg{last update time} of a {\it BBoard},
714 instead of the \eg{local leaders} when \switch{topics} is used without
715 \switch{verbose}.
716 The \eg{local leaders} are now listed when \switch{verbose} is given with
717 \switch{topics}.
718 \subsection{RcvMail Support}
719 The \pgm{rcvcron} and \pgm{rcvtty} are now standard in all \mh4
720 configurations.
721 Further, there's a shell script, \pgm{rcvtrip},
722 that demonstrates the power (and utility) of a {\it hook\/} operating in the
723 \MH/ environment.