Annotation of 43BSD/contrib/mh/papers/mh4/text.tex, revision 1.1.1.1

1.1       root        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.

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.