view papers/mh4/text.tex @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children
line wrap: on
line source

% begin text
\banner
\section{Acknowledgements}
The \MH/ system described herein is based on the original Rand \MH/ system.
It has been extensively developed (perhaps too much so) by Marshall Rose and
John Romine at the University of California, Irvine.
Einar Stefferud, Jerry Sweet, and Terry Domae provided numerous suggestions
to improve the UCI version of \MH/.
\section{Disclaimer}
The Regents of the University of California wish to make it known that:
\bigquote
Although each program has been tested by its contributor,
no warranty, express or implied,
is made by the contributor or the University of California,
as to the accuracy and functioning of the program
and related program material,
nor shall the fact of distribution constitute any such warranty,
and no responsibility is assumed by the contributor
or the University of California in connection herewith.
\endbigquote
\section{Conventions}
In this document,
certain \TeX -formatting conventions are adhered to:
{\advance\leftskip by\parindent
\item{1.} The names of \unix/ commands, such as \pgm{comp},
are presented in {\it text italics}.
\item{2.} Arguments to programs, such as \arg{msgs},
are presented in {\sl slanted roman} and delimited by single-quotes.
\item{3.} \unix/ pathnames and envariables,
such as \file{/usr/uci/} and \file{\$SIGNATURE},
are also presented in {\sl slanted roman}.
\item{4.} Text presenting an example, such as \eg{frated},
is presented in {\tt typewriter style}.
\item{5.} Entries in the user's \MH/ \profile/ and \context/ files,
such as \entry{Current-Folder},
are presented in {\sc Caps-Small-Caps} and delimited by a box.
\smallskip}
\bop\section{General Changes}
This section discusses system-wide changes to \MH/ that are general in nature.
\subsection{Message Numbering}
In previous versions of \MH/, a folder could have up to \eg{999} messages;
in \mh4, this limit has been raised to \eg{1999}.
\subsection{Version Information}
When any \MH/ command is invoked with the \switch{help} switch,
in addition to listing the syntax of the command,
the program will list information pertaining to its version.
This information includes the version of \MH/,
the host it was generated on,
and the date the program was loaded.
For example,
\example MH \#4.25[UCI] (uci-750b) of Thu Jul 19 21:07:01 PDT 1984\endexample
The \eg{\#4.25[UCI]} indicates that the program is from the UCI \mh4
version of \MH/.
The program was generated on \eg{uci-750b},
on \eg{Thu Jul 19 21:07:01 PDT 1984}.
\par
This information is sometimes useful in the unusual circumstance when a bug
is found in \MH/.
By providing the version information,
along with the circumstances concerning the problem with \MH/,
the local \MH/ maintainer is better able to track-down the problem.
\subsection{The User Context}
The \MH/ profile for the user now consists of two parts:
a static part, the \profile/, which is found in the user's \file{\$HOME/}
directory,
and, a dynamic part, the \context/, which is usually found in the user's \MH/
directory.
The former file contains information which \MH/ commands read,
but {\it never\/} write
(e.g., command switches).
The latter contains information that \MH/ commands read and write,
(e.g., \entry{Current-Folder}).
\par
This change has three advantages over the way things were done in \mh3.
\underbar{First},
a lot less information gets written out when an \MH/ command exits,
if the context changes.
This is due to the fact that the user's \context/ file is often much,
much smaller than a user's \profile/ file.
\underbar{Second},
one can keep different context files around
(the entry \entry{context} is changed in the user's \profile/ file).%
\nfootnote{Note that this entry must be given {\it entirely} in lowercase in
the \profile/ file.}
Hence, the \MH/ user can maintain different sets of private sequences
(explained later),
by manipulating different \context/ files.
\underbar{Third},
if more than one person uses a \unix/ login
(say a maintenance account),
then each can define their own \file{\$MH} envariable to point to their
\profile/ file.
As a result,
each user has the \MH/ environment which that user is accustomed to.
Further,
depending on the needs of the users who share the \unix/ login,
the same or different contexts may be automatically maintained for that login.
\par
See \man{mh-profile}(5) for more details on the user context file.
\section{Message Selection}
A new facility has been added to give the \MH/ user greater power in
selecting and referencing messages:
first, a change to the \pgm{pick} program is described;
second, the notion of user-defined sequences is detailed.
\subsection{Selecting Messages}
The \pgm{pick} command now does only one thing:
it defines sequences based on the selection criterion it is given.
In addition, with the \switch{list} switch,
\pgm{pick} can be directed to list the numbers of the messages which
satisfied the criterion, to the standard output.
This is very handy for using \pgm{pick} in backquoted operations with the
shell.
\subsection{User-Defined Sequences}
User-defined sequences allow the \MH/ user a tremendous amount of power
in dealing with groups of messages in the same folder
by allowing the user to bind a group of messages to a meaningful symbolic
name.
The user may choose any name for a message sequence,
as long as it consists of alphanumeric characters and does not conflict with
the standard \MH/ reserved message names (e.g., \arg{first}, etc).
After defining a sequence,
it can be used wherever a \MH/ command expects a \arg{msg} or \arg{msgs}
argument.
Although all \MH/ commands expand user-defined sequences as appropriate,
there are two commands that allow the user to define and manipulate them:
\pgm{pick} and \pgm{mark}.
\subsubsection{Pick and User-Defined Sequences}
Most users of \MH/ will use only the \pgm{pick} command.
By giving the \switch{sequence~name} switch to \pgm{pick}
(which can occur more than once on the command line),
each sequence named is defined as those messages which \pgm{pick} matched,
according the the selection criteria it was given.
Hence,
\example pick -from frated -seq fred\endexample
finds all those messages in the current folder which were from
\eg{frated},
creates a sequence called \eg{fred},
and then adds them to the sequence.
The user could then invoke
\example scan fred\endexample
to get a \pgm{scan} listing of those messages.
Note that by default,
\pgm{pick} creates the named sequences
before it adds the selected messages to the sequence.
Hence, if the named sequence already existed,
the sequence is destroyed prior to being re-defined
(nothing happens to the messages that were a part of this sequence,
they simply cease to be members of that sequence).
By using the \switch{nozero} switch, this behavior can be inhibited,
as in
\example
    pick -from frated -seq sgroup\\
    pick -from fear -seq sgroup -nozero\\
    pick -from freida -seq sgroup -nozero%
\endexample
which finds all those messages in the current folder which were from
\eg{frated}, \eg{fear}, or \eg{freida},
and defines the sequence called \eg{sgroup} as exactly those messages.
These operations amounted to an ``inclusive-or'' of three selection
criteria.
Using \pgm{pick},
one can also generate the ``and'' of some selection criteria as well:
\example
    pick -from frated -seq fred\\
    pick -before friday -seq fred -nozero fred%
\endexample
This example defines the sequence called \eg{fred} as exactly those
messages from \eg{frated} that were dated prior to \eg{friday}.
\par
\pgm{Pick} is normally used as a back-quoted command,
for example,
\example scan \bq{pick -from postmaster}\endexample
Now suppose that the user decides that another command should be issued,
using exactly those messages.
Since,
\pgm{pick} wasn't given a \switch{sequence~name} argument in this example,
the user would end-up typing the entire back-quoted command again.
A simpler way is to add a default sequence name to the \profile/ file.
For example,
\example pick: -sequence select -list\endexample
will tell \pgm{pick} to always define the sequence \eg{select} whenever
it's run.
The \switch{list} is necessary since the \switch{sequence~name} switch sets
\switch{nolist}
whenever the former is encountered.
Hence, this profile entry makes \pgm{pick} define the \eg{select}
sequence and otherwise behave exactly as if it had no profile entry at all.
\par
Finally,
previous versions of \pgm{pick} balked if a selection criterion was not given.
The \mh4 version of \pgm{pick} does not, and merely matches the messages that
were specified.
This lets the \MH/ user type something such as
\example show \bq{pick last:20 -seq fear}\endexample
instead of typing
\example
    mark -add -nozero -seq fear last:20\\
    show fear%
\endexample
\subsubsection{Mark and User-Defined Sequences}
The \pgm{mark} command lets the user perform low-level manipulation of
sequences,
and also provides a well-needed debug facility to the
implementors/developers/maintainers of \MH/ (the \MH/-hacks).
In the future, a user-friendly ``front-end'' for \pgm{mark} will
probably be developed to give the \MH/ user a way to take better
advantage of the underlying facilities.
\subsubsection{Public and Private User-Defined Sequences}
There are two kinds of sequences: {\it public\/} sequences,
and {\it private\/} sequences.
{\it Public\/} sequences of a folder are accessible to any \MH/ user who
can read that folder.
{\it Private\/} sequences are accessible only to the \MH/ user who defined
those sequences.
By default,
\pgm{pick} (and \pgm{mark\/}) create {\it public\/} sequences
if the folder for which the sequences are being defined is writable by the
\MH/ user.
Otherwise, {\it private\/} sequences are created.
This can be overridden with the \switch{public} and \switch{private} switches.
\subsubsection{Sequence Negation}
In addition to telling a \MH/ command to use the messages in the sequence
\eg{seen}, as in
\example refile seen +old\endexample
it would be useful to be easily able to tell a \MH/ command to use all
messages {\it except\/} those in the sequence.
One way of doing this would be to use \pgm{mark} and define the sequence
explicitly,
as in
\example mark -delete -zero seen -seq notseen\endexample
which,
owing to \pgm{mark\/}'s cryptic interpretation of \switch{delete} and
\switch{zero},
defines the sequence \eg{notseen} to be all messages not in the sequence
\eg{seen}.
Naturally,
anytime the sequence \eg{seen} is changed,
\eg{notseen} will have to be updated.
Another way to achieve this is to define the entry
\entry{Sequence-Negation} in the \profile/ file.
If the entry was
\example Sequence-Negation: not\endexample
then anytime a \MH/ command was given \eg{notseen} as a \arg{msg} or
\arg{msgs} argument,
it would substitute all messages that are not a member of the sequence
\eg{seen}.
That is,
\example refile notseen +new\endexample
does just that.
The value of the \entry{Sequence-Negation} entry in the profile can be
any string.
Hence,
experienced users of \MH/ do not use a word,
but rather a special character which their shell does not interpret
(users of the \pgm{CShell} use a single carat, \eg{`\^'},
while users of the Bourne shell use an exclamation-mark, \eg{`!'\/}).
This is because there is nothing to prevent a user of \MH/ from defining a
sequence with this string as its prefix,
if the string is nothing but letters and digits.
Obviously,
this could lead to confusing behavior
if the \entry{Sequence-Negation} entry leads \MH/ to believe that two
sequences are opposites, by virtue of their names differing by the prefix
string.
\subsubsection{The Previous Sequence}
Many times users find themselves issuing a series of commands on the same
sequences of messages.
If the user first defined these messages as a sequence,
then considerable typing may be saved.
If the user doesn't have this foresight,
\MH/ provides a handy way of remembering the \arg{msgs} or
\arg{msg} argument last given to a \MH/ command by the user.
If the entry \entry{Previous-Sequence} is defined in the \profile/ file,
then when the command finishes,
it will define the sequence(s) named in the value of this entry as being
defined as those messages that were specified.
Hence, a profile entry of
\example Previous-Sequence: pseq\endexample
directs any \MH/ command that accepts a \arg{msg} or \arg{msgs} argument to
define the sequence \eg{pseq} as those messages when it finishes.
More than one sequence name may be placed in this entry,
separated with spaces.
The one disadvantage of this approach
is that all \MH/ commands have to update the sequence information for
the folder each time they run
(although most commands read this information,
usually only \pgm{pick} and \pgm{mark} have to write this information out).
\section{Composition of Mail}
Two new facilities have been added to give the \MH/ user greater power in
composing and sending mail:
the {\it draft folder},
which allows a user to maintain a folder of message drafts;
and, {\it draft pushing},
which permits a user to \pgm{send} the current draft in the background.
\subsection{The Draft Folder}
The \pgm{comp}, \pgm{dist}, \pgm{forw}, and \pgm{repl} commands have two
hidden switches, \switch{draftfolder~+folder} and \switch{draftmessage~msg}.
If \switch{draftfolder~+folder} is used,
these commands are directed to construct a draft message in the indicated
folder.
If \switch{draftmessage~msg} is not used, it defaults to \arg{new}
(unless the user invokes \pgm{comp} with \switch{use},
in which case the default is \arg{cur}).
Hence, the user may have several message compositions in progress
simultaneously.
Now, all of the \MH/ tools are available on each of the user's message
drafts
(e.g., \pgm{show}, \pgm{scan}, \pgm{pick}, and so on).
If the folder does not exist,
the user is asked if it should be created (just like with \pgm{refile\/}).
Also,
the last draft message the user was composing is known as \arg{cur} in the
draft folder.
\par
Furthermore,
the \pgm{send} command has these switches as well.
Hence, from the shell,
the user can send off whatever drafts desired using the
standard \MH/ \arg{msgs} convention with \switch{draftmessage msgs}.
If no \arg{msgs} are given, it defaults to \arg{cur}.
\par
In addition,
all five programs have a \switch{nodraftfolder} switch,
which undoes the last occurance of \switch{draftfolder~folder}
(useful if the latter occurs in the user's \MH/ profile).
\par
If the user does not give the \switch{draftfolder~+folder} switch,
then all these commands act ``normally''.
Note that the \switch{draft} switch to \pgm{send} and \pgm{show}
still refers to the file called \eg{draft} in the user's \MH/
directory.
In the interests of economy of expression,
when using \pgm{comp} or \pgm{send},
the user needn't prefix the draft \arg{msg} or \arg{msgs} with
\switch{draftmessage}.
Both of these commands accept a \arg{file} or \arg{files} argument,
and they will, if given \switch{draftfolder~+folder} treat these arguments
as \arg{msg} or \arg{msgs}.%
\nfootnote{This may appear to be inconsistant, at first,
but it saves a lot of typing.}
Hence,
\example send -draftf +draft first\endexample
is the same as
\example send -draftf +draft -draftm first\endexample
\par
To make all this a bit more clear, here are some examples.
Let's assume that the following entries are in the \profile/ file:
\example
    comp: -draftfolder +draft\\
    dist: -draftfolder +draft\\
    forw: -draftfolder +draft\\
    repl: -draftfolder +draft\\
    sendf: -draftfolder +draft%
\endexample
Furthermore,
let's assume that the program \pgm{sendf} is a symbolic link in the user's 
\file{\$HOME/bin/} directory to \pgm{send}.
Then, any of the commands
\example
    comp\\
    dist\\
    forw\\
    repl%
\endexample
constructs the message draft in the \eg{draft} folder using the \arg{new}
message number.
Furthermore,
they each define \arg{cur} in this folder to be that message draft.
If the user were to use the \pgm{quit} option at \whatnow/ level,
then later on,
if no other draft composition was done,
the draft could be sent with simply
\example sendf\endexample
Or,
if more editing was required,
the draft could be edited with
\example comp -use\endexample
Instead,
if other drafts had been composed in the meantime,
so that this message draft was no longer known as \arg{cur} in the \eg{draft}
folder,
then the user could \pgm{scan} the folder to see which message draft in the
folder should be used for editing or sending.
Clever users could even employ \pgm{pick} to do the work:
\example
    comp -use \bq{pick +draft -to bug-mh}\\
\noalign{\leftline{or}}
    sendf \bq{pick +draft -to bug-mh}%
\endexample
Note that in the \pgm{comp} example,
the output from \pgm{pick} must resolve to a single message draft
(it makes no sense to talk about composing two or more drafts with one
invocation of \pgm{comp\/}).
In contrast,
in the \pgm{send} example,
as many message drafts as desired can appear,
since \pgm{send} doesn't mind sending more than one draft at a time.
\par
Note that the argument \switch{draftfolder~+folder} is not
included in the profile entry for \pgm{send},
since when \pgm{comp}, et. al., invoke \pgm{send} directly,
they supply \pgm{send} with the \unix/ pathname of the message draft,
and {\it not} a \arg{draftmessage~msg} argument.
As far as \pgm{send} is concerned,
a {\it draft folder} is not being used.
\par
It is important to realize that \MH/ treats the draft folder like a standard
\MH/ folder in nearly all respects.
There are two exceptions:
\underbar{first}
under no circumstancs will the \arg{draftfolder~folder} switch cause the
named folder to become the current folder.%
\nfootnote{Obviously,
if the folder appeared in the context of a standard \arg{+folder}
argument to an \MH/ program, as in
\example scan +draft\endexample
it might become the current folder, depending on the context changes of the
\MH/ program in question.}
\underbar{Second},
although conceptually \pgm{send} deletes the \arg{msgs} named in the draft
folder,
it does not call \entry{delete-prog} to perform the deletion.
\subsection{What Happens if the Draft Exists}
When the \pgm{comp}, \pgm{dist}, \pgm{forw}, and \pgm{repl} commands are
invoked and the draft you indicated already exists,
these programs will prompt the user for a reponse directing the program's
action.
In \mh4, the prompt is
\begingroup
    \smallertype
    \example
	``/usr/src/uci/mh/mhbox/draft'' exists; replace, list, or quit?%
    \endexample
\endgroup
The appropriate responses and their meanings are:
\smallskip
{\advance\leftskip by\parindent
\item{\underbar{replace}:} deletes the draft and starts afresh.
\item{\underbar{list}:} lists the draft.
\item{\underbar{quit}:} leaves the draft intact and exits.
\smallskip}
\noindent
In addition, if you specified \switch{draftfolder~folder} to the command,
then one other response will be accepted:
\smallskip
{\advance\leftskip by\parindent
\item{\underbar{new}:} finds a new draft,
just as if \switch{draftmessage~new} had been given.
\smallskip}
\noindent
Finally, the \pgm{comp} command will accept one more response:
\smallskip
{\advance\leftskip by\parindent
\item{\underbar{use}:} re-uses the draft,
just as if \switch{use} had been given.
\smallskip}
\subsection{The Push Option at\/{ }\whatnow/ Level}
The \pgm{comp}, \pgm{dist}, \pgm{forw}, and \pgm{repl} commands take
an additional option for the \whatnow/ query.
The \pgm{push} option, which must be spelled out fully,
directs the command to \pgm{send} the draft
in a special detached fashion,
with all normal output is discarded.
If \pgm{push} is used and the draft can not be sent,
then \MH/ will send the user a message,
indicating the name of the draft file,
and an explanation of the failure.
Although using \pgm{push} calls \man{send}(1),
the \pgm{send} command will consult the profile entry for \pgm{push}.
\par
The user can also invoke \pgm{send} from the shell with the \switch{push}
switch,
which makes \pgm{send} act like it had been \pgm{push\/}'d by one of the
composition commands.%
\nfootnote{Note that in this case,
\pgm{send} consults the profile entry for whatever name it was invoked as,
such as \pgm{sendf}.}
\par
The \pgm{send} program also has two other switches,
\switch{unique} and \switch{nounique}.
If \pgm{push\/}'d,
then the \switch{unique} switch tells \pgm{send} to rename the draft file to
a unique filename.
This allows the user to have several drafts being sent simultaneously
(after {\it push\/}ing one draft,
another draft may be composed and edited immediately).
The \switch{unique} switch,
which is the default when \pgm{send} is \pgm{push\/}'d,
is not really useful if you're using {\it draft folders},
as the user generally gets a new message draft for each composition.
Hence, users of the {\it draft folder} mechanism should put
\example send: -nounique\endexample
in their \profile/ file.
This has the added advantage of making
\example comp -use\endexample
easy to use when a draft fails to be posted properly.
\par
By using \pgm{push}, the user can free the shell to do other things,
because it appears to the shell that the \MH/ command has finished.
As a result the shell will immediately prompt for another command,
despite the fact that the command is really still running.
Note that if the user indicates that annotations are to be performed
(with \switch{annotate}),
the annotations will be performed after the message has been
successfully sent.
This action will appear to occur asynchronously.
Obviously, if one of the messages that is to be annotated is
removed before the draft has been successfully sent,
then when \MH/ tries to make the annotations,
it won't be able to do so,
and an error message will mysteriously appear on the user's terminal.
\subsection{Options at\/{ }\whatnow/ Level}
When using the \pgm{comp}, \pgm{dist}, \pgm{forw}, and \pgm{repl} commands at
\whatnow/ level,
the \pgm{edit}, \pgm{list}, \pgm{headers},
and (for the \pgm{dist} and \pgm{repl} commands) the \pgm{display} options
will pass on any additional arguments given them to whatever program they
invoke.
\par
In addition,
in \mh1 (the original Rand \MH/)
and \mh2 (the first UCI version of \MH/),
\MH/ used a complicated heuristic to determine if the draft should be deleted
or preserved after an unsuccessful edit.
In \mh3,
\MH/ was changed to always preserve the draft,
since \pgm{comp}, et. al.,
could usually look at a draft, apply another set of heuristics,
and decide if it was important or not.
With the notion of a {\it draft folder}, 
in which one by default gets a \arg{new} message draft,
\mh4 has again re-implemented the edit deletion/preservation
algorithm (with a minor bug-fix),
to keep the draft folder from being cluttered with aborted edits.
\par
Also,
note that by default,
if the draft cannot be successfully sent,
these commands return to \whatnow/ level.
But, when \pgm{push} is used, this does not happen (obviously).
Hence,
if these commands were expected to annotate any messages,
this will have to be done by hand, later on, with the \pgm{anno} command.
\par
Finally, if the \switch{delete} switch is given to the \pgm{quit} option,
then these commands will inform the user of the name of the unsent draft file.
\subsection{Posting of Mail}
\mh4 does a few different things when mail is posted.
\subsubsection{Signature}
There's now a \entry{Signature} entry in the \profile/ file.
If the \file{\$SIGNATURE} envariable is not set,
then \pgm{send} will consult this profile entry to determine the
personal name of the \MH/ user.
This personal name is placed in the \eg{From:} field of the message.
If this profile entry doesn't exist,
then \pgm{send} will consult the file \file{\$HOME/.signature}.
\subsubsection{Blind Carbon Copies}
The \pgm{post} command now handles blind carbon copies in an entirely
different fashion from the way they were handled in \mh3.
In particular,
the message sent to ``blind'' recipients contains minimal information in its
headers,
namely \eg{Date:},
\eg{Message-ID:} (if \switch{msgid} was given),
\eg{From:},
\eg{Subject:} (if given in the message draft),
and a standard blind carbon copy disclaimer.
The body of the message sent to the blind recipients is simply the actual
message sent to the ``sighted'' recipients.
However,
if the \switch{filter~filterfile} switch was given to \pgm{post},
then the body of the message is given to \pgm{mhl} to be formatted with the
named \arg{filterfile}.
\subsubsection{Server Interaction}
In \mh4, \MH/ supports a mail transport configuration which allows
\pgm{post} to talk directly to an SMTP server.
A possible extension of this,
which looks particularly promising for when \MH/ is used on small
workstations,
is the ability to post mail on a different host,
such as a ``mail relay''.
In this way,
the load on the local host may be reduced,
and mail traffic may be handled more efficiently.
\section{Folder Handling}
Two new facilities have been added to give the \MH/ user greater power in
manipulating folders:
{\it relative folder addressing},
which allows a user to shorten the typing of long folder names;
and the {\it folder-stack},
which permits a user to keep a stack of current folders.
\subsection{Relative Folder Addressing}
By default, when \arg{+folder} is given,
and the folder name is not absolute
(i.e., does not start with \file{/}, \file{./}, or \file{../}),
then the \unix/ pathname of the folder is interpreted relative to the user's
\MH/ directory.
Although this mechanism works fine for top-level folders and their immediate
sub-folders,
once the depth of the sub-folder tree grows, it becomes rather unwieldly:
\example scan +mh/mh.4/draft/flames\endexample
is a lot of typing.
\MH/ can't do anything if the current folder was \eg{+inbox},
but if the current folder was, say, \eg{+mh/mh.4/draft},
\MH/ has a short-hand notation to reference a sub-folder of the
current folder.
Using the \arg{@folder} notation,
the \MH/ user can direct any \MH/ command which expects a \arg{+folder}
argument to look for the folder relative to the current folder instead of the
user's \MH/ directory.
Hence, if the current folder was \eg{+mh/mh.4/draft},
then
\example scan @flames\endexample
would do the trick handily.
In addition, if the current folder was \eg{+mh/mh.4/draft},
\example scan @../pick\endexample
would scan the folder \eg{+mh/mh.4/pick},
since, in the \unix/ fashion,
it references the folder \eg{pick} which is a sub-folder of
the folder that is the parent of the current folder.
Since most advanced \MH/ users seem to exhibit a large degree of locality
in referencing folders when they process mail,
this convention should receive a lot of use.
\subsection{The Folder Stack}
The {\it folder-stack\/} mechanism in \MH/ gives the \MH/ user a
facility similar to the {\it CShell\/}'s directory-stack.
Simply put,
\example folder -push +foo\endexample
makes \eg{foo} the current folder,
saving the folder that was previously the current folder on the
{\it folder-stack}.
As expected,
\example folder -pop\endexample
takes the top of the {\it folder-stack\/} and makes it the current folder.
Each of these switches lists the {\it folder-stack\/} when they execute.
It is simple to write a {\it pushf\/} command as a shell script.
It's one line:
\example exec folder -push \$@\endexample
Probably a better way is to link \pgm{folder} to your \file{\$HOME/bin/}
directory under the name of \pgm{pushf} and then add the entry
\example pushf: -push\endexample
to the \profile/ file.
\par
The manual page for \man{folder}(1) discusses the analogy between the
\pgm{CShell} directory stack commands and the switches in \pgm{folder}
which manipulate the {\it folder-stack}.
\section{Other Changes}
This last section discusses the other,
more program-specific changes made to \MH/.
\subsection{Address Parsing}
There's a new library program, \pgm{ap}, which parses addresses according to
the rules that the \MH/ programs use.
It's often useful for figuring out how \MH/ sees a particular address.
The \pgm{rcvtrip} rcvmail hook,
described at the end of this report,
uses this facility.
\subsection{Alternate Mailboxes}
There's a new entry in the profile, \entry{Alternate-Mailboxes},
which is read by \pgm{repl} and \pgm{scan} to determine which addresses in a
messages are under the user's administration.
Hence,
\example
    Alternate-Mailboxes: mh@uci-750a, bug-mh
\endexample
says that the mailbox \eg{mh@uci-750a}
and any mailbox whose local part is \eg{bug-mh}
is read by the user.
Hence, \pgm{repl} will not include them in the reply list,
and \pgm{scan} will act accordingly if it encounters a message which is from
any of these addresses.
A current restriction is that the hostnames given must be the ``official''
hostnames for the mailboxes,
as local nicknames for hosts are not replaced with their official site names.
\subsection{Annotation}
The \pgm{anno} command no longer prompts for a \eg{text} component
if the \switch{text~body} switch isn't given.
\subsection{More on Folder Handling}
If \pgm{folders} 
(or \pgm{folder} when invoked with the \switch{all} switch)
is given a \arg{+folder} or \arg{msg} argument,
then it will set the current folder and/or message
(in previous versions of \MH/,
\pgm{folders} ignored any \arg{+folder} or \arg{msg} arguments).
In addition,
the top-level folders of the current folder will be listed
(if \switch{norecurse} is in effect),
or the current folder will be listed recursively
(if \switch{recurse} was given).
\subsection{Scanning}
The \pgm{scan} and \pgm{inc} commands now have a \switch{size} switch
(and a complementary switch, \switch{nosize}),
which indicate if the {\it scan listing\/} should include the size of the
message in bytes.
\par
Furthermore,
the fields in the {\it scan listing\/} have been compressed a bit to allow
more of the \eg{Subject} and \eg{Body} portions of the listing to appear.
\par
Finally,
if \pgm{scan} encounters a message without a date field,
rather than leaving that portion of the {\it scan listing} blank,
as had been done in previous versions of \MH/,
the date is filled-in with the last write date of the message,
and post-fixed with a `*'.
This is particularly handy for scanning a {\it draft folder},
as message drafts usually aren't allowed to have dates in them.
\subsection{BBoards Support}
The \pgm{bbr} command now uses the name it was invoked with as its prompting
string.
To override this,
the \MH/ user can specify the \switch{prompt~string} switch to \pgm{bbr}.
\par
The \pgm{bbc} command now lists the \eg{last update time} of a {\it BBoard},
instead of the \eg{local leaders} when \switch{topics} is used without
\switch{verbose}.
The \eg{local leaders} are now listed when \switch{verbose} is given with
\switch{topics}.
\subsection{RcvMail Support}
The \pgm{rcvcron} and \pgm{rcvtty} are now standard in all \mh4
configurations.
Further, there's a shell script, \pgm{rcvtrip},
that demonstrates the power (and utility) of a {\it hook\/} operating in the
\MH/ environment.