Annotation of 43BSD/contrib/mh/papers/mh4/text.tex, revision 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.