|
|
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.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.