|
|
1.1 ! root 1: .\" @(MHWARNING) ! 2: .po +.75i ! 3: .de $c \" Major Heading printer ! 4: .ce ! 5: .b "\\s12\\n+(ch.\\ \\$1\\s0" \" 12 Point Bold Header ! 6: .(x ! 7: ! 8: \ \ \ \\n(ch.\\ \\ \\$1 ! 9: .)x ! 10: .sp 45p \" 45 point space or about 1/2 inch ! 11: .. ! 12: \".nr xs .15v \" Put index entries closer together ! 13: .(x ! 14: ! 15: Section ! 16: .)x _ ! 17: .de $0 \" Sub-Heading macro called AFTER printing the heading ! 18: .(x ! 19: .sp .3v ! 20: .ti .5i ! 21: \\$1 ! 22: .)x ! 23: .. ! 24: .de $s \" Macro to print footnote separator ! 25: \"\l'2i' \" No line drawn ! 26: .if n \ ! 27: . sp 1.3 \" But extra space to make up for it. ! 28: .. ! 29: .fc ^ ~ \" The characters ^ and ~ CANNOT BE USED ! 30: \" throughout this document except as field ! 31: \" delimiter & pad indicator! ! 32: .he ''-%-'' ! 33: .ll 32P \" 32 Picas or about 5+1/3 inch Line Length ! 34: .if n .ll 72m \" Use 72 ems for nroff ! 35: .nr ss 30p \" 30 point space before section titles ! 36: .nr fm 5v \" Rand likes bigger than normal [3v] bottom margins ! 37: .nr bm 7v \" ditto ! 38: .ds . \\fB.\\fP\\h'-(1m/3)' \" Bold period to stand out. ! 39: .ds << <\\h!-(\\w'<'/2)!< ! 40: .ds >> >\\h!-(\\w'>'/2)!> ! 41: .ds ** \v'-3p'\s+1*\s0\v'+3p' ! 42: .so version.rf ! 43: .tp ! 44: .(l C ! 45: \fIdiscard this page\fR ! 46: .sp 4 ! 47: The Rand \fIMH\fR ! 48: Message Handling System: ! 49: User's Manual ! 50: .sp ! 51: UCI Version ! 52: .sp 2 ! 53: \*(td ! 54: \*(MH ! 55: .)l ! 56: .++ C ! 57: .+c INTRODUCTION ! 58: .pp ! 59: Although people can travel cross-country in hours and can ! 60: reach others by telephone in seconds, communications still depend ! 61: heavily upon paper, most of which is distributed through the mails. ! 62: .pp ! 63: There are several major reasons for this continued dependence on ! 64: written documents. ! 65: First, a written document may be proofread ! 66: and corrected prior to its distribution, giving the author ! 67: complete control over his words. ! 68: Thus, a written document is ! 69: better than a telephone conversation in this respect. ! 70: Second, ! 71: a carefully written document is far less likely to be ! 72: misinterpreted or poorly translated than a phone conversation. ! 73: Third, a signature offers reasonable verification of authorship, ! 74: which cannot be provided with media such as telegrams. ! 75: .pp ! 76: However, the need for ! 77: .u fast , ! 78: accurate, and reproducible document distribution is ! 79: obvious. ! 80: One solution in widespread use is the telefax. ! 81: Another ! 82: that is rapidly gaining popularity is electronic mail. ! 83: Electronic mail is similar to telefax in that the data to be sent ! 84: are digitized, transmitted via phone lines, and ! 85: turned back into a document at the receiver. ! 86: The advantage of ! 87: electronic mail is in its compression factor. ! 88: Whereas a telefax ! 89: must scan a page in very fine lines and send all of the black and ! 90: white information, electronic mail assigns characters fixed ! 91: codes which can be transmitted as a few bits of information. ! 92: Telefax presently has the advantage of being able to transmit an ! 93: arbitrary page, including pictures, but electronic mail is ! 94: beginning to deal with this problem. ! 95: Electronic mail also integrates well ! 96: with current directions in office automation, allowing documents ! 97: prepared with sophisticated equipment at one site to be quickly ! 98: transferred and printed at another site. ! 99: .pp ! 100: Currently, most electronic mail is intraorganizational, ! 101: with mail transfer remaining within one computer. ! 102: As computer ! 103: networking becomes more common, however, it is becoming more feasible to ! 104: communicate with anyone whose computer can be linked to your ! 105: own via a network. ! 106: .pp ! 107: The pioneering efforts on general-purpose electronic mail ! 108: were by organizations using the DoD ARPAnet[1]. ! 109: The capability to send messages between computers existed before ! 110: the ARPAnet was developed, but it was used only in limited ways. ! 111: With the advent of the ! 112: ARPAnet, tools began to be developed which made it convenient for ! 113: individuals or organizations to distribute messages ! 114: over broad geographic areas, using ! 115: diverse computer facilities. ! 116: The interest and activity in ! 117: message systems has now reached such proportions that steps ! 118: have been taken within the DoD to coordinate and ! 119: unify the development of military message systems. ! 120: The use of electronic mail is expected to increase ! 121: dramatically in the next few years. ! 122: The utility of such systems ! 123: in the command and control and intelligence environments is ! 124: clear, and applications in these areas will probably lead the ! 125: way. ! 126: As the costs for sending and handling electronic messages ! 127: continue their rapid decrease, such uses can be ! 128: expected to spread rapidly into other areas and, of course, will ! 129: not be limited to the DoD. ! 130: .pp ! 131: A message system provides tools that help users (individuals ! 132: or organizations) deal with messages in various ways. ! 133: Messages ! 134: must be composed, sent, received, stored, retrieved, ! 135: forwarded, and replied to. ! 136: Today's best interactive computer ! 137: systems provide a variety of word-processing and information ! 138: handling capabilities. ! 139: The message handling facilities should be ! 140: well integrated with the rest of the system, so as to be a ! 141: graceful extension of overall system capability. ! 142: .pp ! 143: The message system described in this report, \fIMH\fR, provides most of the ! 144: features that can be found in other message systems and also ! 145: incorporates some new ones. ! 146: It has been built on the UNIX time-sharing ! 147: system[2], a popular operating system for the DEC PDP-11\** ! 148: and VAX-11 classes of computers. ! 149: .(f ! 150: \** PDP and VAX are trademarks of Digital Equipment Corporation. ! 151: .)f ! 152: A \*(lqsecure\*(rq operating ! 153: system similar to UNIX is currently being developed[3], ! 154: and that system will also run \fIMH\fR. ! 155: .pp ! 156: This report provides a complete description of \fIMH\fR and ! 157: thus may serve as a user's manual, although parts of the report ! 158: will be of interest to non-users as well. ! 159: Sections 2 and 3, the ! 160: Overview and Tutorial, present the key ! 161: ideas of \fIMH\fR and will give those not familiar with message systems ! 162: an idea of what such systems are like. ! 163: .pp ! 164: \fIMH\fR consists of a set of commands which use some special ! 165: files and conventions. ! 166: The final section is divided into three parts. ! 167: The first part covers the information ! 168: a user needs to know in addition to the ! 169: commands. ! 170: Then, each of the \fIMH\fR commands is described in detail. ! 171: Finally, other obscure details are revealed. ! 172: A summary of the commands is given in Appendix A, ! 173: and the syntax of message sequences is given in Appendix B. ! 174: .pp ! 175: A novel approach has been taken in the design of \fIMH\fR. ! 176: Instead of creating a large subsystem that appears as a single ! 177: command to the user (such as MS[4]), ! 178: \fIMH\fR is a collection of separate commands ! 179: which are run as separate programs. ! 180: The file and directory ! 181: system of UNIX are used directly. ! 182: Messages are stored as ! 183: individual files (datasets), and collections of them are grouped ! 184: into directories. ! 185: In contrast, most other message systems store ! 186: messages in a complicated data structure within a monolithic ! 187: file. ! 188: With the \fIMH\fR approach, UNIX commands can be ! 189: interleaved with commands invoking the functions of the message ! 190: handler. ! 191: Conversely, existing UNIX commands ! 192: can be used in connection with messages. ! 193: For ! 194: example, all the usual UNIX editing, text-formatting, and printing ! 195: facilities can be applied directly to individual messages. ! 196: MH, ! 197: therefore, consists of a relatively small amount of new code; it ! 198: makes extensive use of other UNIX software to provide the ! 199: capabilities found in other message systems. ! 200: .+c OVERVIEW ! 201: .pp ! 202: There are three main aspects of \fIMH\fR\0: the way messages are ! 203: stored (the message database), the user's profile (which directs ! 204: how certain actions of the message handler take place), and the ! 205: commands for dealing with messages. ! 206: .pp ! 207: Under \fIMH\fR, each message is stored as a separate file. ! 208: A user ! 209: can take any action with a message that he could with an ordinary ! 210: file in UNIX. ! 211: A UNIX directory in which messages are stored is ! 212: called a folder. ! 213: Each folder contains some standard entries to support ! 214: the message-handling functions. ! 215: The messages in a folder have numerical ! 216: names. ! 217: These folders (directories) ! 218: are entries in a particular directory path, described in ! 219: the user profile, through which \fIMH\fR can find message folders. ! 220: Using the UNIX \*(lqlink\*(rq facility, it is possible for one copy of a ! 221: message to be \*(lqfiled\*(rq in more than one folder, providing a ! 222: message index facility. ! 223: Also, using the UNIX tree-structured ! 224: file system, it is possible to have a folder within a folder, ! 225: nested arbitrarily deep, ! 226: and have the full power of the \fIMH\fR commands available. ! 227: .pp ! 228: Each user of \fIMH\fR has a user profile, a file in ! 229: his \fB$HOME\fR (initial login) directory called \fI\&.mh\(ruprofile\fR. ! 230: This profile contains several ! 231: pieces of information used by the \fIMH\fR commands: ! 232: a path name to the directory that contains the message folders ! 233: and parameters that tailor \fIMH\fR commands ! 234: to the individual user's requirements. ! 235: There is also another file, ! 236: called the user context, ! 237: which contains information concerning which folder the user last referenced ! 238: (the \*(lqcurrent\*(rq folder). ! 239: It also contains ! 240: most of the necessary state information concerning how ! 241: the user is dealing with his messages, enabling \fIMH\fR to be ! 242: implemented as a set of individual UNIX commands, in contrast to the ! 243: usual approach of a monolithic subsystem. ! 244: .pp ! 245: In \fIMH\fR, incoming mail is appended ! 246: to the end of a file in a system spooling area for the user. ! 247: This area is called the mail drop directory, ! 248: and the file is called the user's mail drop. ! 249: Normally when the user logins in, ! 250: s/he is informed of new mail ! 251: (or the \fIMH\fR program \fImsgchk\fR may be run). ! 252: The user adds the new messages to his/her collection of \fIMH\fR messages ! 253: by invoking the command ! 254: \fIinc\fR. ! 255: The \fIinc\fR (incorporate) command adds the new ! 256: messages to a folder called \*(lqinbox\*(rq, assigning them names which ! 257: are consecutive integers starting with the next highest integer ! 258: available in inbox. ! 259: \fIinc\fR also produces a ! 260: \fIscan\fR summary of ! 261: the messages thus incorporated. ! 262: A folder can be compacted into a single file, ! 263: for easy storage, ! 264: by using the \fIpackf\fR command. ! 265: Also, ! 266: messages within a folder can be sorted by date and time with the \fIsortm\fR ! 267: command. ! 268: ! 269: .pp ! 270: There are four commands for examining the messages in a ! 271: folder: ! 272: \fIshow\fR, ! 273: \fIprev\fR, ! 274: \fInext\fR, ! 275: and ! 276: \fIscan\fR. ! 277: The \fIshow\fR command displays a message in a folder, ! 278: \fIprev\fR displays the message preceding the current message, and ! 279: \fInext\fR displays the message following the current message. ! 280: \fIMH\fR lets the user choose the program that displays individual messages. ! 281: A special program, \fImhl\fR, can be used to display messages according ! 282: to the user's preferences. ! 283: The \fIscan\fR command summarizes the messages in a folder, ! 284: normally producing one line per message, showing who the message is from, ! 285: the date, the subject, etc. ! 286: .pp ! 287: The user may move a message from one folder to another with ! 288: the command ! 289: \fIrefile\fR. ! 290: Messages may be removed from a folder ! 291: by means of the command ! 292: \fIrmm\fR. ! 293: In addition, a user may query ! 294: what the current folder is and may specify that a new folder ! 295: become the current folder, through the command ! 296: \fIfolder\fR. ! 297: All folders may be summarized with the \fIfolders\fR command. ! 298: A message folder (or subfolder) may be removed by means of ! 299: the command ! 300: \fIrmf\fR. ! 301: .pp ! 302: A set of messages based on content may be selected by ! 303: use of the command \fIpick\fR. ! 304: This command searches through ! 305: messages in a folder and selects those that match a given ! 306: set of criteria. ! 307: These messages are then bound to a \*(lqsequence\*(rq name for use with other ! 308: \fIMH\fR commands. ! 309: The \fImark\fR command manipulates these sequences. ! 310: .pp ! 311: There are five commands enabling the user to create new ! 312: messages and send them: ! 313: \fIcomp\fR, ! 314: \fIdist\fR, ! 315: \fIforw\fR, ! 316: \fIrepl\fR, ! 317: and ! 318: \fIsend\fR. ! 319: The \fIcomp\fR command ! 320: provides the facility for the user to compose a ! 321: new message; ! 322: \fIdist\fR redistributes mail to additional addressees; ! 323: \fIforw\fR enables the user to forward messages; and ! 324: \fIrepl\fR facilitates the generation of a reply to an incoming message. ! 325: The last three commands may optionally annotate the original message. ! 326: Messages may be arbitrarily annotated with the \fIanno\fR command. ! 327: Once a draft has been constructed by one of the four above composition ! 328: programs, ! 329: a user\-specifiable program is run to query the user as to the disposition of ! 330: the draft prior to sending. ! 331: \fIMH\fR provides the simple \fIwhatnow\fR program to start users off. ! 332: If ! 333: a message is not sent directly by one of these commands, it may ! 334: be sent at a later time using the command ! 335: \fIsend\fR. ! 336: \fIMH\fR allows the use of any UNIX editor when composing a message. ! 337: For rapid entry, a special editor, \fIprompter\fR, is provided. ! 338: For programs, a special mail-sending program, \fImhmail\fR, is provided. ! 339: .pp ! 340: \fIMH\fR supports a personal aliasing facility which gives users the ! 341: capability to considerably shorten address typein ! 342: and use meaningful names for addresses. ! 343: The \fIali\fR program can be used to query \fIMH\fR as to the expansion of a ! 344: list of aliases. ! 345: After composing a message, but prior to sending, the \fIwhom\fR command ! 346: can be used to determine exactly who a message would go to. ! 347: .pp ! 348: \fIMH\fR provides a natural interface for telling the user's shell the names ! 349: of \fIMH\fR messages and folders. ! 350: The \fImhpath\fR program achieves this capability. ! 351: .pp ! 352: @BEGIN: BBOARDS ! 353: Finally, \fIMH\fR supports the UCI BBoards facility. ! 354: \fIbbc\fR can be used to query the status of a group of BBoards, ! 355: while \fImsh\fR can be used to read them. ! 356: BBoard leaders are also well supported, with the \fIbbl\fR program. ! 357: @END: BBOARDS ! 358: The \fIburst\fR command can be used to \*(lqshred\*(rq digests of messages ! 359: into individual messages. ! 360: .pp ! 361: All of the elements summarized above ! 362: are described in more detail in the following sections. ! 363: Many of the ! 364: normal facilities of UNIX provide additional capabilities for ! 365: dealing with messages in various ways. ! 366: For example, it is ! 367: possible to print messages ! 368: on the line-printer without requiring any additional code within ! 369: \fIMH\fR\0. ! 370: Using standard UNIX facilities, any terminal output can be ! 371: redirected to a file for repeated or future viewing. ! 372: In general, ! 373: the flexibility and capabilities of the UNIX interface with the ! 374: user are preserved as a result of the integration of \fIMH\fR into the UNIX ! 375: structure. ! 376: .+c TUTORIAL ! 377: .pp ! 378: This tutorial provides a brief introduction to the \fIMH\fR commands. ! 379: It should be sufficient ! 380: to allow the user to read his mail, do some simple manipulations of ! 381: it, and create and send messages. ! 382: .pp ! 383: A message has two major pieces: the ! 384: header and the body. ! 385: The body consists of the text of the message ! 386: (whatever you care to type in). ! 387: It follows the header and is separated from ! 388: it by an empty line. ! 389: (When you compose a message, the form that appears ! 390: on your terminal shows a line of dashes after the header. ! 391: This is for ! 392: convenience and is replaced by an empty line when the message is ! 393: sent.) The header is composed of several components, including the ! 394: subject of the message and the person to whom it is addressed. ! 395: Each component starts with a name ! 396: and a colon; components must not start with a blank. ! 397: The text of the ! 398: component may take more than one line, but each continuation line must ! 399: start with a blank. ! 400: Messages typically have \*(lqTo:\*(rq, \*(lqcc:\*(rq, and ! 401: \*(lqSubject:\*(rq components. ! 402: When composing a message, you should include ! 403: the \*(lqTo:\*(rq and \*(lqSubject:\*(rq components; ! 404: the \*(lqcc:\*(rq (for people you want to send copies to) is not necessary. ! 405: .pp ! 406: The basic \fIMH\fR commands are ! 407: \fIinc\fR, ! 408: \fIscan\fR, ! 409: \fIshow\fR, ! 410: \fInext\fR, ! 411: \fIprev\fR, ! 412: \fIrmm\fR, ! 413: \fIcomp\fR, ! 414: and ! 415: \fIrepl\fR. ! 416: These are described below. ! 417: ! 418: \fIinc\fR ! 419: .pp ! 420: When you get the message \*(lqYou have mail\*(rq, type the command \fIinc\fR. ! 421: You will get a \*(lqscan listing\*(rq such as: ! 422: ! 423: .nf ! 424: .in +.5i ! 425: .ta \w'7+ 'u +\w'11/26 'u +\w'To:norm 'u ! 426: 7+ \07/13 Cas revival of measurement work ! 427: 8 10/\09 Norm NBS people and publications ! 428: 9 11/26 To:norm question \*(<<Are there any functions ! 429: .re ! 430: .in -.5i ! 431: .fi ! 432: .pp ! 433: This shows the messages you received since the last time you ! 434: executed this command (\fIinc\fR adds these new messages to your inbox folder). ! 435: You can see this list again, plus a list of any ! 436: other messages you have, by using the ! 437: \fIscan\fR command. ! 438: ! 439: \fIscan\fR ! 440: .pp ! 441: The scan listing shows the message number, followed by the ! 442: date and the sender. ! 443: (If you are the sender, the addressee in the \*(lqTo:\*(rq ! 444: component is displayed. ! 445: You may send yourself a message by including ! 446: your name among the \*(lqTo:\*(rq or \*(lqcc:\*(rq addressees.) ! 447: It also shows the message's subject; if ! 448: the subject is short, the first part of the body of the message is ! 449: included after the characters \*(<<. ! 450: ! 451: .ne 5 ! 452: \fIshow\fR ! 453: .pp ! 454: This command shows the current message, that is, ! 455: the first one of the new messages after an ! 456: \fIinc\fR. ! 457: If the message is not ! 458: specified by name (number), it is ! 459: generally the last message referred to by an \fIMH\fR command. ! 460: For example, ! 461: ! 462: ! 463: .ta \w'\fIshow\fR\0|\0\fIlpr\fR 'u ! 464: .ti .5i ! 465: ^\fIshow\fP\05~^will show message 5. ! 466: .re ! 467: ! 468: .pp ! 469: You can use the show command to copy a message or print a ! 470: message. ! 471: ! 472: .(b L ! 473: .in .5i ! 474: .ta \w'\fIshow\fR\0|\0\fIlpr\fR 'u ! 475: ^\fIshow\fR\0>\0\fIx\fR~^will copy the message to file x. ! 476: .br ! 477: ^\fIshow\fR\0|\0\fIlpr\fR~^will print the message, using the \fIlpr\fR command. ! 478: .br ! 479: ^\fInext\fR~^will show the message that follows the current message. ! 480: .br ! 481: ^\fIprev\fR~^will show the message previous to the current message. ! 482: .br ! 483: ^\fIrmm\fR~^will remove the current message. ! 484: .br ! 485: ^\fIrmm\03\fR~^will remove message 3. ! 486: .)b ! 487: ! 488: .ne 5 ! 489: \fIcomp\fR ! 490: .pp ! 491: The ! 492: \fIcomp\fR command puts you in the editor to write or edit a message. ! 493: Fill in or ! 494: delete the \*(lqTo:\*(rq, \*(lqcc:\*(rq, and \*(lqSubject:\*(rq fields, ! 495: as appropriate, and type the body of the message. ! 496: Then ! 497: exit normally from the editor. ! 498: You will be asked ! 499: \*(lqWhat now?\*(rq. ! 500: Type a carriage return to see the options. ! 501: Typing \fBsend\fR ! 502: will cause the message to be sent; typing \fBquit\fR will cause an exit ! 503: from ! 504: \fIcomp\fR, ! 505: with the message draft saved. ! 506: .pp ! 507: If you quit without sending the message, it will be saved in a file ! 508: called <name>/Mail/draft (where <name> is your \fB$HOME\fR directory). ! 509: You can resume editing the message later with \*(lqcomp\0\-use\*(rq; ! 510: or you can send the message later, using the \fIsend\fR command. ! 511: ! 512: .ne 4 ! 513: \fIcomp\0\-editor\0prompter\fR ! 514: .pp ! 515: This command uses a different editor and is useful for preparing ! 516: \*(lqquick and dirty\*(rq messages. ! 517: It prompts you for each component of the ! 518: header. ! 519: Type the information for that component, or type a carriage ! 520: return to omit the component. ! 521: After that, type the body of the ! 522: message. ! 523: Backspacing is the only form of editing allowed with this editor. ! 524: When the body is complete, type a carriage return followed by <EOT> ! 525: (usually <CTRL-D>). ! 526: This completes the initial preparation of the message; from then on, use ! 527: the same procedures as with ! 528: \fIcomp\fR (above). ! 529: ! 530: .ne 5 ! 531: \fIrepl\fR ! 532: .br ! 533: \fIrepl\fR\0n ! 534: .pp ! 535: This command makes up an initial message form with a header ! 536: that is appropriate for ! 537: replying to an existing message. ! 538: The message being answered is the ! 539: current message if no message number is mentioned, or n if a number ! 540: is specified. ! 541: After the header is completed, you can finish the message as in ! 542: \fIcomp\fR (above). ! 543: .pp ! 544: This is enough information to get you going using \fIMH\fR. ! 545: There are more commands, ! 546: and the commands described here have more features. ! 547: Subsequent sections ! 548: explain \fIMH\fR in complete detail. ! 549: The system is quite powerful if you ! 550: want to use its sophisticated features, but the foregoing commands ! 551: suffice for sending and receiving messages. ! 552: .pp ! 553: There are numerous additional capabilities you may wish to explore. ! 554: For example, the ! 555: \fIpick\fR command will select a subset of messages ! 556: based on specified criteria such as sender and/or subject. ! 557: Groups of ! 558: messages may be designated, as described in Sec. IV, ! 559: under \fBMessage Naming\fR. ! 560: The file \fI\&.mh\(ruprofile\fR can be used to tailor your use of ! 561: the message system to your needs and preferences, as described in Sec. IV, ! 562: under \fBThe User Profile\fR. ! 563: In general, you may ! 564: learn additional features of the system selectively, according to your ! 565: requirements, ! 566: by studying the relevant sections of this manual. ! 567: There is no need to ! 568: learn all the details of the system at once. ! 569: .+c "DETAILED DESCRIPTION" ! 570: .pp ! 571: This section describes the \fIMH\fR system in detail, including the components ! 572: of the user profile, the conventions for message naming, and some of ! 573: the other \fIMH\fR conventions. ! 574: Readers who are ! 575: generally familiar with computer systems will be able to follow ! 576: the principal ideas, although some details may be meaningful only to ! 577: those familiar with UNIX. ! 578: .uh "THE USER PROFILE" ! 579: .pp ! 580: The first time an \fIMH\fR command is issued by a new user, the system ! 581: prompts for a \*(lqPath\*(rq and creates an \fIMH\fR \*(lqprofile\*(rq. ! 582: .pp ! 583: Each \fIMH\fR user has a profile which contains tailoring ! 584: information for each individual program. ! 585: Other profile entries control the \fIMH\fR path (where folders and ! 586: special files are kept), folder and message protections, editor ! 587: selection, and default arguments for each \fIMH\fR program. ! 588: Each user of \fIMH\fR also has a context file which contains ! 589: current state information for the \fIMH\fR package ! 590: (the location of the context file is kept in the user's \fIMH\fR directory, ! 591: or may be named in the user profile). ! 592: When a folder becomes ! 593: the current folder, it is recorded in the user's context. ! 594: (Other state information is kept in the context file, ! 595: see the manual entry for \fImh\-profile\0\fR(5) for more details.) ! 596: In general, ! 597: the term \*(lqprofile entry\*(rq refer to entries in either the profile or ! 598: context file. ! 599: Users of \fIMH\fR needn't worry about the distinction, ! 600: \fIMH\fR handles these things automatically. ! 601: .pp ! 602: The \fIMH\fR profile is stored in the file \fI\&.mh\(ruprofile\fR in the ! 603: user's \fB$HOME\fR directory\**. ! 604: .(f ! 605: \** By defining the envariable \fB$MH\fR, ! 606: you can specify an alternate profile to be used by \fIMH\fR commands. ! 607: .)f ! 608: It has the format of a message without ! 609: any body. ! 610: That is, each profile entry is on one line, with a ! 611: keyword followed by a colon (:) followed by text particular to ! 612: the keyword. ! 613: .br ! 614: \(rh\ \ \& ! 615: \fIThis file must not have blank lines.\fR ! 616: .br ! 617: The keywords ! 618: may have any combination of upper and lower case. ! 619: (See the information of \fImh\-mail\fR later on in this manual ! 620: for a description of message formats.) ! 621: .pp ! 622: For the average \fIMH\fR user, the only profile entry of ! 623: importance is \*(lqPath\*(rq. ! 624: Path specifies a directory in which \fIMH\fR ! 625: folders and certain files such as \*(lqdraft\*(rq are found. ! 626: The ! 627: argument to this keyword must be a legal UNIX path that names an ! 628: existing directory. ! 629: If this path is not absolute ! 630: (i.e., does not begin with a \fB/\fR\0), ! 631: it will be presumed to start from the user's \fB$HOME\fR directory. ! 632: All folder and message references within ! 633: \fIMH\fR will relate to this path unless full path names are used. ! 634: .pp ! 635: Message protection defaults to 644, and folder protection to ! 636: 711. ! 637: These may be changed by profile entries \*(lqMsg-Protect\*(rq ! 638: and \*(lqFolder-Protect\*(rq, respectively. ! 639: The argument to these ! 640: keywords is an octal number which is used as the UNIX file mode\**. ! 641: .(f ! 642: \** See \fIchmod\fR\0(1) in the \fIUNIX Programmer's Manual\fR\0[5]. ! 643: .)f ! 644: .pp ! 645: When an \fIMH\fR program starts running, it looks through the ! 646: user's profile for an entry with a keyword matching the program's ! 647: name. ! 648: For example, when ! 649: \fIcomp\fR is run, it looks for a \*(lqcomp\*(rq ! 650: profile entry. ! 651: If one is found, the text of the profile entry is ! 652: used as the default switch setting until all defaults are overridden ! 653: by explicit switches passed to the program as arguments. ! 654: Thus the profile ! 655: entry \*(lqcomp:\0\-form\0standard.list\*(rq would direct ! 656: \fIcomp\fR to use the ! 657: file \*(lqstandard.list\*(rq as the message skeleton. ! 658: If an explicit ! 659: form switch is given to the ! 660: \fIcomp\fR command, it will override the ! 661: switch obtained from the profile. ! 662: .pp ! 663: In UNIX, a program may exist under several names, ! 664: either by linking or aliasing. ! 665: The actual invocation name is used by an \fIMH\fR ! 666: program when scanning for its profile defaults\**. ! 667: .(f ! 668: \** Unfortunately, ! 669: the shell does not preserve aliasing information when calling a program, ! 670: hence if a program is invoked by an alias different than its name, ! 671: the program will examine the profile entry for it's name, ! 672: not the alias that the user invoked it as. ! 673: The correct solution is to create a (soft) link in your \fI$HOME/bin\fR ! 674: directory to the \fIMH\fR program of your choice. ! 675: By giving this link a different name, ! 676: you can use an alternate set of defaults for the command. ! 677: .)f ! 678: Thus, each \fIMH\fR program ! 679: may have several names by which it can be invoked, and each name ! 680: may have a different set of default switches. ! 681: For example, if ! 682: \fIcomp\fR is invoked by the name ! 683: \fIicomp\fR, ! 684: the profile entry ! 685: \*(lqicomp\*(rq will control the default switches for this invocation of ! 686: the ! 687: \fIcomp\fR program. ! 688: This provides a powerful ! 689: definitional facility for commonly used switch settings. ! 690: .pp ! 691: The default editor ! 692: for editing within ! 693: \fIcomp\fR, ! 694: \fIrepl\fR, ! 695: \fIforw\fR, ! 696: and ! 697: \fIdist\fR, ! 698: is usually \fIprompter\fR, ! 699: but might be something else at your site, ! 700: such as \fI/usr/ucb/ex\fR or \fI/bin/e\fR. ! 701: A different editor may be used by specifying ! 702: the profile entry ! 703: \*(lqEditor: \*(rq. ! 704: The argument to \*(lqEditor\*(rq is the name of an ! 705: executable program or shell command file which can be found via ! 706: the user's $PATH defined search path, excluding the current ! 707: directory. ! 708: The \*(lqEditor:\*(rq profile specification ! 709: may in turn be overridden by a `\-editor\0<editor>' ! 710: profile switch associated with ! 711: \fIcomp\fR, ! 712: \fIrepl\fR, ! 713: \fIforw\fR, ! 714: or ! 715: \fIdist\fR. ! 716: Finally, an explicit editor switch specified with any ! 717: of these four commands will have ultimate precedence. ! 718: .pp ! 719: During message composition, more than one editor may be ! 720: used. ! 721: For example, one editor (such as \fIprompter\fR\0) ! 722: may be used ! 723: initially, and a second editor may be invoked later to revise ! 724: the message being composed ! 725: (see the discussion of ! 726: \fIcomp\fR in Section 5 for details). ! 727: A profile entry \*(lq<lasteditor>\-next:\0<editor>\*(rq specifies the name of ! 728: the editor to be used after a particular editor. ! 729: Thus \*(lqcomp:\0\-e\0prompter\*(rq ! 730: causes the initial text to be collected by ! 731: \fIprompter\fR, ! 732: and the profile entry \*(lqprompter\-next:\0ed\*(rq names ed as the ! 733: editor to be invoked for the next round of editing. ! 734: .pp ! 735: Some of the \fIMH\fR commands, such as ! 736: \fIshow\fR, ! 737: can be used on ! 738: message folders owned by others, if those folders are readable. ! 739: However, ! 740: you cannot write in someone else's folder. ! 741: All the \fIMH\fR command ! 742: actions not requiring write permission may be used with ! 743: a \*(lqread-only\*(rq folder. ! 744: .pp ! 745: Table 1 lists examples of some of the currently defined profile ! 746: entries, typical arguments, and the programs that reference the ! 747: entries. ! 748: .bp ! 749: .in .9i ! 750: .ll -.9i ! 751: .ta \w'<program>:\0default switches 'u ! 752: .sp 30p ! 753: .ce ! 754: Table 1 ! 755: .sp 8p ! 756: .ce ! 757: P\s-2ROFILE\s0 C\s-2OMPONENTS\s0 ! 758: .hl \" ~12p preceding + 1v (12p) after ! 759: .nf ! 760: ^^\fIMH\fR Programs that ! 761: ^Keyword and Argument~^\ use Component\h'|\n(.lu-.9i'\v'4p'\l'|0'\v'-4p' \" \l'..' does underlining ! 762: .sp ! 763: ^Path:\0Mail~^All ! 764: ^Current-Folder:\0inbox~^Most ! 765: ^Editor:\0/usr/ucb/ex~^\fIcomp, dist, forw, repl\fR ! 766: ^Msg\-Protect:\0644~^\fIinc\fR ! 767: ^Folder\-Protect:\0711~^\fIinc, pick, refile\fR ! 768: ^<program>:\0default switches~^All ! 769: ^prompter\-next:\0ed~^\fIcomp, dist, forw, repl\fR ! 770: .hl ! 771: .ll +.9i ! 772: .in 0 ! 773: .fi ! 774: .pp ! 775: Path ! 776: .u should ! 777: be present. ! 778: Current\-Folder is maintained ! 779: automatically by many \fIMH\fR commands (see the \fBContext\fR sections of ! 780: the individual commands in Sec. IV). ! 781: All other entries are optional, ! 782: defaulting to the values described above. ! 783: .uh "MESSAGE NAMING" ! 784: .pp ! 785: Messages may be referred to explicitly or implicitly when ! 786: using \fIMH\fR commands. ! 787: A formal syntax of message names is given in Appendix B, but the ! 788: following description should be sufficient for most \fIMH\fR users. ! 789: Some details of message naming that apply only to certain ! 790: commands are included in the description of those ! 791: commands. ! 792: .pp ! 793: Most of the \fIMH\fR commands accept arguments specifying one or ! 794: more folders, and one or more messages to operate on. ! 795: The use of ! 796: the word \*(lqmsg\*(rq as an argument to a command means that exactly one ! 797: message name may be specified. ! 798: A message name may be a number, ! 799: such as 1, 33, or 234, or it may be ! 800: one of the \*(lqreserved\*(rq message names: ! 801: first, last, prev, next, and cur. ! 802: (As a shorthand, a ! 803: period (\&.) is equivalent to cur.) ! 804: The meanings of these names are straightforward: ! 805: \*(lqfirst\*(rq is the first message in the folder; ! 806: \*(lqlast\*(rq is the last message in the folder; ! 807: \*(lqprev\*(rq is the message numerically previous to the current message; ! 808: \*(lqnext\*(rq is the message numerically following the current message; ! 809: \*(lqcur\*(rq (or \*(lq\&.\*(rq) is the current message in the folder. ! 810: In addition, ! 811: \fIMH\fR supports user\-defined\-sequences; ! 812: see the description of the \fImark\fR command for more information. ! 813: .pp ! 814: The default in commands that take a \*(lqmsg\*(rq argument is ! 815: always \*(lqcur\*(rq. ! 816: .pp ! 817: The word \*(lqmsgs\*(rq indicates that several messages may be ! 818: specified. ! 819: Such a specification consists of several message ! 820: designations separated by spaces. ! 821: A message designation is ! 822: either a message name or a message range. ! 823: A message range is a ! 824: specification of the form name1\-name2 or name1:n, where name1 and ! 825: name2 are message names and n is an integer. ! 826: The first form ! 827: designates all the messages from name1 to name2 inclusive; this ! 828: must be a non-empty range. ! 829: The second form specifies up to n ! 830: messages, starting with name1 if name1 is a number, or first, ! 831: cur, or next, and ending with name1 if name1 is last or ! 832: prev. ! 833: This interpretation of n is overridden if n is preceded ! 834: by a plus sign or a minus sign; ! 835: +n always means up to n messages starting with ! 836: name1, and \-n always means up to n messages ending with name1. ! 837: Repeated specifications of the same message have the same effect ! 838: as a single specification of ! 839: the message. ! 840: Examples of ! 841: specifications are: ! 842: ! 843: .(b ! 844: 1 5 7\-11 22 ! 845: first 6 8 next ! 846: first\-10 ! 847: last:5 ! 848: .)b ! 849: .pp ! 850: The message name \*(lqall\*(rq is a shorthand for \*(lqfirst\-last\*(rq, ! 851: indicating all of the messages in the folder. ! 852: .pp ! 853: In commands that accept \*(lqmsgs\*(rq arguments, the default is ! 854: either cur or all, depending on which makes more sense. ! 855: .pp ! 856: In all of the \fIMH\fR commands, a plus sign preceding an argument ! 857: indicates a folder name. ! 858: Thus, \*(lq+inbox\*(rq is the name of the ! 859: user's standard inbox. ! 860: If an explicit folder argument is given ! 861: to an \fIMH\fR command, it will become the current folder (that is, ! 862: the \*(lqCurrent-Folder:\*(rq entry ! 863: in the user's profile will be changed to this folder). ! 864: In the case of the ! 865: \fIrefile\fR command, which ! 866: can have multiple output folders, a new source folder (other than ! 867: the default current folder) is specified by `\-src\0+folder'. ! 868: .uh "OTHER MH CONVENTIONS" ! 869: .pp ! 870: One very powerful feature of \fIMH\fR is that the \fIMH\fR commands may ! 871: be issued from any current directory, and the proper path to ! 872: the appropriate folder(s) will be taken from the user's profile. ! 873: If the \fIMH\fR path is not appropriate for a specific folder or file, ! 874: the automatic prepending of the \fIMH\fR path can be avoided by ! 875: beginning a folder or file name with \fB/\fR, ! 876: or with \fB\&./\fR or \fB\&.\&./\fR component. ! 877: Thus any specific absolute path may be specified along with any path ! 878: relative to the current working directory. ! 879: .pp ! 880: Arguments to the various programs may be given in any order, ! 881: with the exception of a few switches whose arguments must follow ! 882: immediately, such as `\-src\0+folder' for \fIrefile\fR. ! 883: .pp ! 884: Whenever an \fIMH\fR command prompts the user, the valid options ! 885: will be listed in response to a <RETURN>. ! 886: (The first of the ! 887: listed options is the default if end-of-file is encountered, ! 888: such as from a command file.) ! 889: A valid response is any \fIunique\fR abbreviation of one of the listed options. ! 890: .pp ! 891: Standard UNIX documentation conventions are used in this report ! 892: to describe \fIMH\fR command syntax. ! 893: Arguments enclosed in brackets ! 894: ([ ]) are optional; exactly one of the arguments enclosed ! 895: within braces ({ }) must be specified, and all other ! 896: arguments are required. ! 897: The use of ellipsis dots (...) indicates ! 898: zero or more repetitions of the previous item. ! 899: For example, ! 900: \*(lq+folder ...\*(rq would indicate that one or more \*(lq+folder\*(rq ! 901: arguments is required ! 902: and \*(lq[+folder ...]\*(rq indicates that 0 or more ! 903: \*(lq+folder\*(rq arguments may be given. ! 904: .pp ! 905: \fIMH\fR departs from UNIX standards by using switches that consist of ! 906: more than one character, e.g. `\-header'. ! 907: To minimize typing, ! 908: only a unique abbreviation of a switch need be typed; thus, for ! 909: `\-header', `\-hea' is probably sufficient, depending on the ! 910: other switches the command accepts. ! 911: Each \fIMH\fR program ! 912: accepts the switch `\-help' (which \fBmust\fR be spelled out fully) ! 913: and produces a syntax description and a list of switches. ! 914: In the ! 915: list of switches, parentheses indicate required characters. ! 916: For example, all `\-help' switches will appear as \*(lq\-(help)\*(rq, ! 917: indicating that no abbreviation is accepted. ! 918: Furthermore, ! 919: the `\-help' switch tells the version of the \fIMH\fR program you invoked. ! 920: .pp ! 921: Many \fIMH\fR switches have both on and off forms, such as ! 922: `\-format' and `\-noformat'. ! 923: In many of the descriptions which follow, ! 924: only one form is defined; the other form, often used to ! 925: nullify profile switch settings, is assumed to be the opposite. ! 926: .br ! 927: .bp ! 928: .uh "MH COMMANDS" ! 929: .pp ! 930: The \fIMH\fR package comprises several programs: ! 931: .\" I pity the fool who tampers with the next line... ! 932: .ds ZZ -me ! 933: .so mh.me ! 934: .pp ! 935: These programs are described below. ! 936: The form of the descriptions ! 937: conforms to the standard ! 938: form for the description of UNIX commands. ! 939: .if t \{ ! 940: .ll 6.5i ! 941: .lt 6.5i ! 942: \} ! 943: .fo '[mh.6]'MH'UCI version' ! 944: .de SC ! 945: .he '\\$1(\\$2)'-%-'\\$1(\\$2)' ! 946: .bp ! 947: .(x ! 948: .ti .8i ! 949: \\$1 ! 950: .)x ! 951: .. ! 952: .de NA ! 953: .b \\s-2NAME\\s0 ! 954: .ti .5i ! 955: .. ! 956: .de SY ! 957: .sp ! 958: .b \\s-2SYNOPSIS\\s0 ! 959: .in 1i ! 960: .ti .5i ! 961: .na ! 962: .. ! 963: .de DE ! 964: .ad ! 965: .sp ! 966: .in 0 ! 967: .b \\s-2DESCRIPTION\\s0 ! 968: .sp ! 969: .fi ! 970: .in .5i ! 971: .. ! 972: .de Hh ! 973: .ad ! 974: .sp ! 975: .in 0 ! 976: .b "\\s-2Helpful Hints\\s0" ! 977: .sp ! 978: .fi ! 979: .in .5i ! 980: .. ! 981: .de Fi ! 982: .(b L ! 983: .ti 0 ! 984: .b \\s-2Files\\s0 ! 985: .ta \w'@(MHETCPATH)/ExtraBigFileName 'u ! 986: .. ! 987: .de Pr ! 988: .)b ! 989: .(b L F ! 990: .ta \w'ExtraBigProfileName 'u ! 991: .ti 0 ! 992: .b "\\s-2Profile Components\\s0" ! 993: .ti .5i ! 994: .. ! 995: .de Ps ! 996: .ti .5i ! 997: .. ! 998: .de Sa ! 999: .)b ! 1000: .(b L F ! 1001: .ti 0 ! 1002: .b "\\s-2See Also\\s0" ! 1003: .br ! 1004: .. ! 1005: .de De ! 1006: .)b ! 1007: .(b L ! 1008: .in .5i ! 1009: .ti 0 ! 1010: .b \\s-2Defaults\\s0 ! 1011: .. ! 1012: .de Ds ! 1013: .. ! 1014: .de Co ! 1015: .)b ! 1016: .(b L F ! 1017: .ti 0 ! 1018: .b \\s-2Context\\s0 ! 1019: .br ! 1020: .. ! 1021: .de Hi ! 1022: .)b ! 1023: .(b L F ! 1024: .ti 0 ! 1025: .b \\s-2History\\s0 ! 1026: .br ! 1027: .. ! 1028: .de Bu ! 1029: .)b ! 1030: .(b L F ! 1031: .ti 0 ! 1032: .b \\s-2Bugs\\s0 ! 1033: .br ! 1034: .. ! 1035: .de En ! 1036: .)b ! 1037: .in 0 ! 1038: .. ! 1039: .po -.50i ! 1040: .so ali.me ! 1041: .so anno.me ! 1042: @BEGIN: BBOARDS ! 1043: .so bbc.me ! 1044: .so bbl.me ! 1045: .so bbleader.me ! 1046: .so bboards.me ! 1047: @END: BBOARDS ! 1048: .so burst.me ! 1049: @BEGIN: TMA ! 1050: .so cipher.me ! 1051: @END: TMA ! 1052: .so comp.me ! 1053: @BEGIN: TMA ! 1054: .so decipher.me ! 1055: @END: TMA ! 1056: .so dist.me ! 1057: .so folder.me ! 1058: .so forw.me ! 1059: .so inc.me ! 1060: .so mark.me ! 1061: .so mhl.me ! 1062: .so mhmail.me ! 1063: .so mhook.me ! 1064: .so mhpath.me ! 1065: .so msgchk.me ! 1066: .so msh.me ! 1067: .so next.me ! 1068: .so packf.me ! 1069: .so pick.me ! 1070: .so prev.me ! 1071: .so prompter.me ! 1072: .so rcvstore.me ! 1073: .so refile.me ! 1074: .so repl.me ! 1075: .so rmf.me ! 1076: .so rmm.me ! 1077: .so scan.me ! 1078: .so send.me ! 1079: .so show.me ! 1080: .so sortm.me ! 1081: @BEGIN: TMA ! 1082: .so tma.me ! 1083: @END: TMA ! 1084: .so vmh.me ! 1085: .so whatnow.me ! 1086: .so whom.me ! 1087: .po +.50i ! 1088: .he ''-%-'' ! 1089: .fo '''' ! 1090: .br ! 1091: .if t \{ ! 1092: .ll 32P ! 1093: .lt 32P ! 1094: \} ! 1095: .bp ! 1096: .uh "MORE DETAILS" ! 1097: .pp ! 1098: This section describes some of the more intense points of the \fIMH\fR system, ! 1099: by expanding on topics previously discussed. ! 1100: The format presented conforms to the standard form for the description of UNIX ! 1101: documentation. ! 1102: .if t \{ ! 1103: .ll 6.5i ! 1104: .lt 6.5i ! 1105: \} ! 1106: .fo '[mh.6]'MH'UCI version' ! 1107: .po -.50i ! 1108: .so mh-alias.me ! 1109: .so mh-format.me ! 1110: .so mh-mail.me ! 1111: .so mh-profile.me ! 1112: .so ap.me ! 1113: .so conflict.me ! 1114: .so dp.me ! 1115: .so install-mh.me ! 1116: .so post.me ! 1117: .po +.50i ! 1118: .he ''-%-'' ! 1119: .fo '''' ! 1120: .br ! 1121: .if t \{ ! 1122: .ll 32P ! 1123: .lt 32P ! 1124: \} ! 1125: .+c "REPORTING PROBLEMS" ! 1126: .pp ! 1127: If problems are encountered with an \fIMH\fR program, ! 1128: the problems should be reported to the local maintainers of \fIMH\fR. ! 1129: When doing this, ! 1130: the name of the program should be reported, ! 1131: along with the version information for the program. ! 1132: To find out what version of an \fIMH\fR program is being run, ! 1133: invoke the program with the `\-help' switch. ! 1134: In addition to listing the syntax of the command, ! 1135: the program will list information pertaining to its version. ! 1136: This information includes the version of \fIMH\fR, ! 1137: the host it was generated on, ! 1138: and the date the program was loaded. ! 1139: A second line of information, ! 1140: found on versions of \fIMH\fR after #5.380 include \fIMH\fR configuration ! 1141: options. ! 1142: For example, ! 1143: ! 1144: .in +.5i ! 1145: version: MH 6.1 #1[UCI] (nrtc-gremlin) of Wed Nov 6 01:13:53 PST 1985 ! 1146: .br ! 1147: options: [BSD42] [MHE] [NETWORK] [SENDMTS] [MMDFII] [SMTP] [POP] ! 1148: .in -.5i ! 1149: ! 1150: The `6.1 #1[UCI]' indicates that the program is from the UCI \fImh.6\fR ! 1151: version of \fIMH\fR. ! 1152: The program was generated on the host `nrtc-gremlin' on ! 1153: `Wed Nov 6 01:13:53 PST 1985'. ! 1154: It's usually a good idea to send the output of the `\-help' switch along ! 1155: with your report. ! 1156: ! 1157: If there is no local \fIMH\fR maintainer, ! 1158: try the address \fBBug-MH\fR. ! 1159: If that fails, use the Internet mailbox \[email protected]\fR. ! 1160: ! 1161: .+c "ADVANCED FEATURES" ! 1162: .de UH ! 1163: .lp ! 1164: .b "\\$1" ! 1165: .pp ! 1166: .(x ! 1167: .ti .8i ! 1168: \\$1 ! 1169: .)x ! 1170: .. ! 1171: .pp ! 1172: This section describes some features of \fIMH\fR that were included strictly ! 1173: for advanced \fIMH\fR users. ! 1174: These capabilities permit \fIMH\fR to exhibit more powerful behavior for the ! 1175: seasoned \fIMH\fR users. ! 1176: .uh "USER\-DEFINED SEQUENCES" ! 1177: .pp ! 1178: User\-defined sequences allow the \fIMH\fR user a tremendous amount of power ! 1179: in dealing with groups of messages in the same folder ! 1180: by allowing the user to bind a group of messages to a meaningful symbolic ! 1181: name. ! 1182: The user may choose any name for a message sequence, ! 1183: as long as it consists of alphanumeric characters and does not conflict with ! 1184: the standard \fIMH\fR reserved message names ! 1185: (e.g., \*(lqfirst\*(rq, etc). ! 1186: After defining a sequence, ! 1187: it can be used wherever an \fIMH\fR command expects a `msg' or `msgs' ! 1188: argument. ! 1189: Although all \fIMH\fR commands expand user\-defined sequences as appropriate, ! 1190: there are two commands that allow the user to define and manipulate them: ! 1191: \fIpick\fR and \fImark\fR. ! 1192: .UH "Pick and User\-Defined Sequences" ! 1193: .pp ! 1194: Most users of \fIMH\fR will use user\-defined sequences only with ! 1195: the \fIpick\fR command. ! 1196: By giving the `\-sequence\ name' switch to \fIpick\fR ! 1197: (which can occur more than once on the command line), ! 1198: each sequence named is defined as those messages which \fIpick\fR matched ! 1199: according the the selection criteria it was given. ! 1200: Hence, ! 1201: ! 1202: .ti +.5i ! 1203: pick\0\-from\0frated\0\-seq\0fred ! 1204: ! 1205: finds all those messages in the current folder which were from ! 1206: \*(lqfrated\*(rq, ! 1207: creates a sequence called \*(lqfred\*(rq, ! 1208: and then adds them to the sequence. ! 1209: The user could then invoke ! 1210: ! 1211: .ti +.5i ! 1212: scan\0fred ! 1213: ! 1214: to get a \fIscan\fR listing of those messages. ! 1215: Note that by default, ! 1216: \fIpick\fR creates the named sequences ! 1217: before it adds the selected messages to the sequence. ! 1218: Hence, if the named sequence already existed, ! 1219: the sequence is destroyed prior to being re\-defined ! 1220: (nothing happens to the messages that were a part of this sequence, ! 1221: they simply cease to be members of that sequence). ! 1222: By using the `\-nozero' switch, this behavior can be inhibited, ! 1223: as in ! 1224: ! 1225: .in +.5i ! 1226: pick\0\-from\0frated\0\-seq\0sgroup ! 1227: .br ! 1228: pick\0\-from\0fear\0\-seq\0sgroup\0\-nozero ! 1229: .br ! 1230: pick\0\-from\0freida\0\-seq\0sgroup\0\-nozero ! 1231: .in -.5i ! 1232: ! 1233: finds all those messages in the current folder which were from ! 1234: \*(lqfrated\*(rq, \*(lqfear\*(rq, or \*(lqfreida\*(rq, ! 1235: and defines the sequence called \*(lqsgroup\*(rq as exactly those messages. ! 1236: These operations amounted to an \*(lqinclusive\-or\*(rq of three selection ! 1237: criteria, ! 1238: using \fIpick\fR, ! 1239: one can also generate the \*(lqand\*(rq of some selection criteria as well: ! 1240: ! 1241: .in +.5i ! 1242: pick\0\-from\0frated\0\-seq\0fred ! 1243: .br ! 1244: pick\0\-before\0friday\0\-seq\0fred\0fred ! 1245: .in -.5i ! 1246: ! 1247: This example defines the sequence called \*(lqfred\*(rq as exactly those ! 1248: messages from \*(lqfrated\*(rq that were dated prior to \*(lqfriday\*(rq.\** ! 1249: .(f ! 1250: \** Of course, ! 1251: it is much easier to simply use the built\-in boolean operation of ! 1252: \fIpick\fR to get the desired results: ! 1253: ! 1254: .ti +.5i ! 1255: pick\0\-from\0frated\0\-or\0\-from\0fear\0\-or\0\-from\0freida\0\-seq\0sgroup ! 1256: ! 1257: and ! 1258: ! 1259: .ti +.5i ! 1260: pick\0\-from\0frated\0\-and\0\-before\0friday\0\-seq\0fred ! 1261: ! 1262: do exactly the same thing as the five commands listed above. ! 1263: Hence, the `\-nozero' option to \fIpick\fR is only useful to manipulate ! 1264: existing sequences. ! 1265: .)f ! 1266: .pp ! 1267: \fIPick\fR is normally used as a back\-quoted command, ! 1268: for example, ! 1269: ! 1270: .ti +.5i ! 1271: scan\0`pick\0\-from\0postmaster` ! 1272: ! 1273: Now suppose that the user decides that another command should be issued, ! 1274: using exactly those messages. ! 1275: Since, ! 1276: \fIpick\fR wasn't given a `\-sequence\ name' argument in this example, ! 1277: the user would end\-up typing the entire back\-quoted command again. ! 1278: A simpler way is to add a default sequence name to the \&.mh\(ruprofile. ! 1279: For example, ! 1280: ! 1281: .ti +.5i ! 1282: pick:\0\-seq\0select\0\-list ! 1283: ! 1284: will tell \fIpick\fR to always define the sequence \*(lqselect\*(rq whenever ! 1285: it's run. ! 1286: The `-list' is necessary since the `\-sequence\ name' switch sets `\-nolist' ! 1287: whenever the former is encountered. ! 1288: Hence, this profile entry makes \fIpick\fR define the \*(lqselect\*(rq ! 1289: sequence and otherwise behave exactly as if there was no profile entry at all. ! 1290: .UH "Mark and User\-Defined Sequences" ! 1291: .pp ! 1292: The \fImark\fR command lets the user perform low\-level manipulation of ! 1293: sequences, ! 1294: and also provides a well\-needed debug facility to the ! 1295: implementors/developers/maintainers of \fIMH\fR (the \fIMH\fR\-hacks). ! 1296: In the future, a user\-friendly \*(lqfront\-end\*(rq for \fImark\fR will ! 1297: probably be developed to give the \fIMH\fR user a way to take better ! 1298: advantage of the underlying facilities. ! 1299: .UH "Public and Private User\-Defined Sequences" ! 1300: .pp ! 1301: There are two kinds of sequences: \fIpublic\fR sequences, ! 1302: and \fIprivate\fR sequences. ! 1303: \fIPublic\fR sequences of a folder are accessible to any \fIMH\fR user that ! 1304: can read that folder and are kept in the \&.mh\(rusequences file in the folder. ! 1305: \fIPrivate\fR sequences are accessible only to the \fIMH\fR user that defined ! 1306: those sequences and are kept in the user's \fIMH\fR context file. ! 1307: By default, ! 1308: \fIpick\fR (and \fImark\fR\0) create \fIpublic\fR sequences ! 1309: if the folder for which the sequences are being defined is writable by the ! 1310: \fIMH\fR user. ! 1311: Otherwise, \fIprivate\fR sequences are created. ! 1312: This can be overridden with the `\-public' and `\-private' switches. ! 1313: .UH "Sequence Negation" ! 1314: .pp ! 1315: In addition to telling an \fIMH\fR command to use the messages in the sequence ! 1316: \*(lqseen\*(rq, as in ! 1317: ! 1318: .ti +.5i ! 1319: refile\0seen\0+old ! 1320: ! 1321: it would be useful to be easily able to tell an \fIMH\fR command to use all ! 1322: messages \fIexcept\fR those in the sequence. ! 1323: One way of doing this would be to use \fImark\fR and define the sequence ! 1324: explicitly, ! 1325: as in ! 1326: ! 1327: .ti +.5i ! 1328: mark\0\-delete\0\-zero\0seen\0\-seq\0notseen ! 1329: ! 1330: which, ! 1331: owing to \fImark\fR\0's cryptic interpretation of `\-delete' and `\-zero', ! 1332: defines the sequence \*(lqnotseen\*(rq to be all messages not in the sequence ! 1333: \*(lqseen\*(rq. ! 1334: Naturally, ! 1335: anytime the sequence \*(lqseen\*(rq is changed, ! 1336: \*(lqnotseen\*(rq will have to be updated. ! 1337: Another way to achieve this is to define the entry ! 1338: \*(lqSequence\-Negation:\*(rq in the \&.mh\(ruprofile. ! 1339: If the entry was ! 1340: ! 1341: .ti +.5i ! 1342: Sequence\-Negation:\0not ! 1343: ! 1344: then anytime an \fIMH\fR command was given \*(lqnotseen\*(rq as a `msg' or ! 1345: `msgs' argument, ! 1346: it would substitute all messages that are not a member of the sequence ! 1347: \*(lqseen\*(rq. ! 1348: That is, ! 1349: ! 1350: .ti +.5i ! 1351: refile\0notseen\0+new ! 1352: ! 1353: does just that. ! 1354: The value of the \*(lqSequence\-Negation:\*(rq entry in the profile can be ! 1355: any string. ! 1356: Hence, ! 1357: experienced users of \fIMH\fR do not use a word, ! 1358: but rather a special character which their shell does not interpret ! 1359: (users of the \fICShell\fR use a single caret or circumflex (usually shift\-6), ! 1360: while users of the Bourne shell use an exclamation\-mark). ! 1361: This is because there is nothing to prevent a user of \fIMH\fR from defining a ! 1362: sequence with this string as its prefix, ! 1363: if the string is nothing by letters and digits. ! 1364: Obviously, ! 1365: this could lead to confusing behavior ! 1366: if the \*(lqSequence\-Negation:\*(rq entry leads \fIMH\fR to believe that two ! 1367: sequences are opposites by virtue of their names differing by the prefix ! 1368: string. ! 1369: .UH "The Previous Sequence" ! 1370: .pp ! 1371: Many times users find themselves issuing a series of commands on the same ! 1372: sequences of messages. ! 1373: If the user first defined these messages as a sequence, ! 1374: then considerable typing may be saved. ! 1375: If the user doesn't have this foresight, ! 1376: \fIMH\fR provides a handy way of having \fIMH\fR remember the `msgs' or ! 1377: `msg' argument last given to an \fIMH\fR command. ! 1378: If the entry \*(lqPrevious\-Sequence:\*(rq is defined in the ! 1379: \&.mh\(ruprofile, ! 1380: then when the command finishes, ! 1381: it will define the sequence(s) named in the value of this entry as being ! 1382: exactly those messages that were specified. ! 1383: Hence, a profile entry of ! 1384: ! 1385: .ti +.5i ! 1386: Previous\-Sequence:\0pseq ! 1387: ! 1388: directs any \fIMH\fR command that accepts a `msg' or `msgs' argument to ! 1389: define the sequence \*(lqpseq\*(rq as those messages when it finishes. ! 1390: More than one sequence name may be placed in this entry, ! 1391: separated with spaces. ! 1392: The one disadvantage of this approach ! 1393: is that the \fIMH\fR progams have to update the sequence information for ! 1394: the folder each time they run ! 1395: (although most programs read this information, ! 1396: usually only \fIpick\fR and \fImark\fR have to write this information out). ! 1397: .UH "The Unseen Sequence" ! 1398: .pp ! 1399: Finally, some users like to distinguish between messages which have been ! 1400: previously seen by them. ! 1401: Both \fIinc\fR and \fIshow\fR honorthe profile entry ! 1402: \*(lqUnseen\-Sequence\*(rq to support this activity. ! 1403: Whenever \fIinc\fR places new messages in a folder, ! 1404: if the entry \*(lqUnseen\-Sequence\*(rq is defined in the \&.mh\(ruprofile, ! 1405: then when the command finishes, ! 1406: \fIinc\fR will add the new messages to the sequence(s) named in the value of ! 1407: this entry. ! 1408: Hence, a profile entry of ! 1409: ! 1410: .ti +.5i ! 1411: Unseen\-Sequence:\0 unseen ! 1412: ! 1413: directs \fIinc\fR to add new messages to the sequence \*(lqunseen\*(rq. ! 1414: Unlike the behavior of the \*(lqPrevious\-Sequence\*(rq entry in the profile ! 1415: however, ! 1416: the sequence(s) will \fBnot\fR be zero'd. ! 1417: .pp ! 1418: Similarly, ! 1419: whenever \fIshow\fR (or \fInext\fR or \fIprev\fR\0) displays a message, ! 1420: they remove those messages from any sequences named by the ! 1421: \*(lqUnseen\-Sequence\*(rq entry in the profile. ! 1422: .uh "COMPOSITION OF MAIL" ! 1423: .pp ! 1424: There are a number of interesting advanced facilities for the composition of ! 1425: outgoing mail. ! 1426: ! 1427: .UH "The Draft Folder" ! 1428: .pp ! 1429: The \fIcomp\fR, \fIdist\fR, \fIforw\fR, and \fIrepl\fR commands have two ! 1430: switches, `\-draftfolder\0+folder' and `\-draftmessage\0msg'. ! 1431: If `\-draftfolder\0+folder' is used, ! 1432: these commands are directed to construct a draft message in the indicated ! 1433: folder. ! 1434: (The \*(lqDraft\-Folder:\*(rq profile entry may be used to declare a ! 1435: default draft folder for use with ! 1436: \fIcomp\fR, \fIdist\fR, \fIforw\fR, and \fIrepl\fR) ! 1437: If `\-draftmessage\0msg' is not used, it defaults to `new' ! 1438: (unless the user invokes \fIcomp\fR with `\-use', ! 1439: in which case the default is `cur'). ! 1440: Hence, the user may have several message compositions in progress ! 1441: simultaneously. ! 1442: Now, all of the \fIMH\fR tools are available on each of the user's message ! 1443: drafts ! 1444: (e.g., \fIshow\fR, \fIscan\fR, \fIpick\fR, and so on). ! 1445: If the folder does not exist, ! 1446: the user is asked if it should be created (just like with \fIrefile\fR\0). ! 1447: Also, ! 1448: the last draft message the user was composing is known as `cur' in the ! 1449: draft folder. ! 1450: .pp ! 1451: Furthermore, ! 1452: the \fIsend\fR command has these switches as well. ! 1453: Hence, from the shell, ! 1454: the user can send off whatever drafts desired using the ! 1455: standard \fIMH\fR `msgs' convention with `\-draftmessage msgs'. ! 1456: If no `msgs' are given, it defaults to `cur'. ! 1457: .pp ! 1458: In addition, ! 1459: all five programs have a `\-nodraftfolder' switch, ! 1460: which undoes the last occurrence of `\-draftfolder\0folder' ! 1461: (useful if the latter occurs in the user's \fIMH\fR profile). ! 1462: .pp ! 1463: If the user does not give the `\-draftfolder\0+folder' switch, ! 1464: then all these commands act ``normally''. ! 1465: Note that the `\-draft' switch to \fIsend\fR and \fIshow\fR ! 1466: still refers to the file called `draft' in the user's \fIMH\fR ! 1467: directory. ! 1468: In the interests of economy of expression, ! 1469: when using \fIcomp\fR or \fIsend\fR, ! 1470: the user needn't prefix the draft `msg' or `msgs' with ! 1471: `\-draftmessage'. ! 1472: Both of these commands accept a `file' or `files' argument, ! 1473: and they will, if given `\-draftfolder\0+folder' treat these arguments ! 1474: as `msg' or `msgs'.\** ! 1475: .(f ! 1476: \** This may appear to be inconsistent, at first, ! 1477: but it saves a lot of typing. ! 1478: .)f ! 1479: Hence, ! 1480: ! 1481: .ti +.5i ! 1482: send -draftf +drafts first ! 1483: ! 1484: is the same as ! 1485: ! 1486: .ti +.5i ! 1487: send -draftf +drafts -draftm first ! 1488: ! 1489: .pp ! 1490: To make all this a bit more clear, here are some examples. ! 1491: Let's assume that the following entries are in the \fIMH\fR profile: ! 1492: ! 1493: .in +.5i ! 1494: .nf ! 1495: Draft\-Folder: +drafts ! 1496: sendf: -draftfolder +drafts ! 1497: .fi ! 1498: .in -.5i ! 1499: ! 1500: Furthermore, ! 1501: let's assume that the program \fIsendf\fR is a (symbolic) link in the user's ! 1502: \fB$HOME/bin/\fR directory to \fIsend\fR. ! 1503: Then, any of the commands ! 1504: ! 1505: .in +.5i ! 1506: .nf ! 1507: comp ! 1508: dist ! 1509: forw ! 1510: repl ! 1511: .fi ! 1512: .in -.5i ! 1513: ! 1514: constructs the message draft in the `draft' folder using the `new' ! 1515: message number. ! 1516: Furthermore, ! 1517: they each define `cur' in this folder to be that message draft. ! 1518: If the user were to use the \fIquit\fR option at `What now?' level, ! 1519: then later on, ! 1520: if no other draft composition was done, ! 1521: the draft could be sent with simply ! 1522: ! 1523: .ti +.5i ! 1524: sendf ! 1525: ! 1526: Or, ! 1527: if more editing was required, ! 1528: the draft could be edited with ! 1529: ! 1530: .ti +.5i ! 1531: comp -use ! 1532: ! 1533: Instead, ! 1534: if other drafts had been composed in the meantime, ! 1535: so that this message draft was no longer known as `cur' in the `draft' ! 1536: folder, ! 1537: then the user could \fIscan\fR the folder to see which message draft in the ! 1538: folder should be used for editing or sending. ! 1539: Clever users could even employ a back-quoted \fIpick\fR to do the work: ! 1540: ! 1541: .ti +.5i ! 1542: comp -use `pick +drafts -to bug-mh` ! 1543: ! 1544: or ! 1545: ! 1546: .ti +.5i ! 1547: sendf `pick +drafts -to bug-mh` ! 1548: ! 1549: Note that in the \fIcomp\fR example, ! 1550: the output from \fIpick\fR must resolve to a single message draft ! 1551: (it makes no sense to talk about composing two or more drafts with one ! 1552: invocation of \fIcomp\fR\0). ! 1553: In contrast, ! 1554: in the \fIsend\fR example, ! 1555: as many message drafts as desired can appear, ! 1556: since \fIsend\fR doesn't mind sending more than one draft at a time. ! 1557: .pp ! 1558: Note that the argument `\-draftfolder\0+folder' is not ! 1559: included in the profile entry for \fIsend\fR, ! 1560: since when \fIcomp\fR, et. al., invoke \fIsend\fR directly, ! 1561: they supply \fIsend\fR with the UNIX pathname of the message draft, ! 1562: and \fBnot\fR a `draftmessage\0msg' argument. ! 1563: As far as \fIsend\fR is concerned, ! 1564: a \fIdraft folder\fR is not being used. ! 1565: .pp ! 1566: It is important to realize that \fIMH\fR treats the draft folder like a standard ! 1567: \fIMH\fR folder in nearly all respects. ! 1568: There are two exceptions: ! 1569: .u first , ! 1570: under no circumstancs will the `\-draftfolder\0folder' switch cause the ! 1571: named folder to become the current folder.\** ! 1572: .(f ! 1573: \** Obviously, ! 1574: if the folder appeared in the context of a standard `+folder' ! 1575: argument to an \fIMH\fR program, as in ! 1576: ! 1577: .ti +.5i ! 1578: scan +drafts ! 1579: ! 1580: it might become the current folder, depending on the context changes of the ! 1581: \fIMH\fR program in question. ! 1582: .)f ! 1583: .u Second , ! 1584: although conceptually \fIsend\fR deletes the `msgs' named in the draft ! 1585: folder, ! 1586: it does not call `delete-prog' to perform the deletion. ! 1587: ! 1588: .UH "What Happens if the Draft Exists" ! 1589: .pp ! 1590: When the \fIcomp\fR, \fIdist\fR, \fIforw\fR, and \fIrepl\fR commands are ! 1591: invoked and the draft you indicated already exists, ! 1592: these programs will prompt the user for a reponse directing the program's ! 1593: action. ! 1594: The prompt is ! 1595: ! 1596: .ti +.5i ! 1597: Draft ``/usr/src/uci/mh/mhbox/draft'' exists (xx bytes). ! 1598: .ti +.5i ! 1599: Disposition? ! 1600: ! 1601: The appropriate responses and their meanings are: ! 1602: .u replace : ! 1603: deletes the draft and starts afresh; ! 1604: .u list : ! 1605: lists the draft; ! 1606: .u refile : ! 1607: files the draft into a folder and starts afresh; ! 1608: and, ! 1609: .u quit : ! 1610: leaves the draft intact and exits. ! 1611: In addition, if you specified `\-draftfolder\0folder' to the command, ! 1612: then one other response will be accepted: ! 1613: .u new : ! 1614: finds a new draft, ! 1615: just as if `\-draftmessage\0new' had been given. ! 1616: Finally, the \fIcomp\fR command will accept one more response: ! 1617: .u use : ! 1618: re-uses the draft, ! 1619: just as if `\-use' had been given. ! 1620: ! 1621: .UH "The Push Option at What now? Level" ! 1622: .pp ! 1623: The \fIpush\fR option to the \*(lqWhat now?\*(rq query ! 1624: in the \fIcomp\fR, \fIdist\fR, \fIforw\fR, and \fIrepl\fR commands, ! 1625: directs the command to \fIsend\fR the draft ! 1626: in a special detached fashion, ! 1627: with all normal output discarded. ! 1628: If \fIpush\fR is used and the draft can not be sent, ! 1629: then \fIMH\fR will send the user a message, ! 1630: indicating the name of the draft file, ! 1631: and an explanation of the failure. ! 1632: .\" Although using \fIpush\fR calls \fIsend\fR\0(1), ! 1633: .\" the \fIsend\fR command will consult the profile entry for \fIpush\fR. ! 1634: .pp ! 1635: The user can also invoke \fIsend\fR from the shell with the `\-push' ! 1636: switch, ! 1637: which makes \fIsend\fR act like it had been \fIpush\fR\0'd by one of the ! 1638: composition commands. ! 1639: .\" composition commands.\** ! 1640: .\" .(f ! 1641: .\" \** Note that in this case, ! 1642: .\" \fIsend\fR consults the profile entry for whatever name it was invoked as, ! 1643: .\" such as \fIsendf\fR. ! 1644: .\" .)f ! 1645: .pp ! 1646: By using \fIpush\fR, the user can free the shell to do other things, ! 1647: because it appears to the shell that the \fIMH\fR command has finished. ! 1648: As a result the shell will immediately prompt for another command, ! 1649: despite the fact that the command is really still running. ! 1650: Note that if the user indicates that annotations are to be performed ! 1651: (with `\-annotate' to \fIdist\fR, \fIforw\fR, or \fIrepl\fR), ! 1652: the annotations will be performed after the message has been ! 1653: successfully sent. ! 1654: This action will appear to occur asynchronously. ! 1655: Obviously, if one of the messages that is to be annotated is ! 1656: removed before the draft has been successfully sent, ! 1657: then when \fIMH\fR tries to make the annotations, ! 1658: it won't be able to do so. ! 1659: In previous versions of \fIMH\fR, ! 1660: this resulted in an error message mysteriously appearing on the user's ! 1661: terminal. ! 1662: In \fImh.5\fR and later versions, ! 1663: in this special circumstance, no error will be generated. ! 1664: .pp ! 1665: If send is \fIpush\fR\0'd, ! 1666: then the `\-forward' switch is examined if a failure notice is generated. ! 1667: If given, ! 1668: then the draft is forwarded with the failure notice sent to the user. ! 1669: This allows rapid \fIburst\fR\0'ing of the failure notice to retrieve the ! 1670: unsent draft. ! 1671: ! 1672: .UH "Options at What now? Level" ! 1673: .pp ! 1674: By default, ! 1675: the message composition programs call a program called \fIwhatnow\fR before ! 1676: the initial draft composition. ! 1677: The \fIMH\fR user can specify any program for this. ! 1678: Following is some information about the default \*(lqWhat now?\*(rq level. ! 1679: More detailed information can be found in the \fIwhatnow\fR\0(1) manual entry. ! 1680: .pp ! 1681: When using the \fIcomp\fR, \fIdist\fR, \fIforw\fR, and \fIrepl\fR commands at ! 1682: \*(lqWhat now?\*(rq level, ! 1683: the \fIedit\fR, \fIlist\fR, \fIheaders\fR, \fIrefile\fR, ! 1684: and (for the \fIdist\fR and \fIrepl\fR commands) the \fIdisplay\fR options ! 1685: will pass on any additional arguments given them to whatever program they ! 1686: invoke. ! 1687: .pp ! 1688: In \fImh.1\fR (the original Rand \fIMH\fR\0) ! 1689: and \fImh.2\fR (the first UCI version of \fIMH\fR\0), ! 1690: \fIMH\fR used a complicated heuristic to determine if the draft should be ! 1691: deleted or preserved after an unsuccessful edit. ! 1692: In \fImh.3\fR, ! 1693: \fIMH\fR was changed to preserve the draft always, ! 1694: since \fIcomp\fR, et. al., ! 1695: could usually look at a draft, apply another set of heuristics, ! 1696: and decide if it was important or not. ! 1697: With the notion of a \fIdraft folder\fR, ! 1698: in which one by default gets a `new' message draft, ! 1699: the edit deletion/preservation algorithm was re-implemented, ! 1700: to keep the draft folder from being cluttered with aborted edits. ! 1701: .pp ! 1702: Also, ! 1703: note that by default, ! 1704: if the draft cannot be successfully sent, ! 1705: these commands return to \*(lqWhat now?\*(rq level. ! 1706: But, when \fIpush\fR is used, this does not happen (obviously). ! 1707: Hence, ! 1708: if these commands were expected to annotate any messages, ! 1709: this will have to be done by hand, later on, with the \fIanno\fR command. ! 1710: .pp ! 1711: Finally, if the `\-delete' switch is not given to the \fIquit\fR option, ! 1712: then these commands will inform the user of the name of the unsent draft file. ! 1713: ! 1714: .UH "Digests" ! 1715: .pp ! 1716: The \fIforw\fR command has the beginnings of a digestifying facility, ! 1717: with the `\-digest\ list', `\-issue\ number', and `\-volume\ number' switches. ! 1718: ! 1719: If \fIforw\fR is given \*(lqlist\*(rq to the `\-digest' switch ! 1720: as the name of the discussion group, ! 1721: and the `\-issue\ number' switch is not given, ! 1722: then \fIforw\fR looks for an entry in the user's \fIMH\fR context called ! 1723: \*(lq\fIdigest\fR\-issue\-list\*(rq and increments its value to use as the ! 1724: issue number. ! 1725: Similarly, ! 1726: if the `\-volume\ number' switch is not given, ! 1727: then \fIforw\fR looks for \*(lq\fIdigest\fR\-volume\-list\*(rq ! 1728: (but does not increment its value) to use as the volume number. ! 1729: ! 1730: Having calculated the name of the digest and the volume and issue numbers, ! 1731: \fIforw\fR will now process the components file using the same format string ! 1732: mechanism used by \fIrepl\fR. ! 1733: The current `%'\-escapes are: ! 1734: ! 1735: .nf ! 1736: .ta \w'escape 'u +\w'integer 'u ! 1737: \fIescape\fR \fItype\fR \fIsubstitution\fR ! 1738: digest string digest name ! 1739: issue integer issue number ! 1740: volume integer volume number ! 1741: .re ! 1742: .fi ! 1743: ! 1744: In addition, to capture the current date, ! 1745: any of the escapes valid for \fIdp\fR\0(8) are also valid for \fIforw\fR. ! 1746: ! 1747: The default components file used by \fIforw\fR when in digest mode is: ! 1748: ! 1749: .nf ! 1750: .in +.5i ! 1751: .ne 10 ! 1752: .eo ! 1753: .so @(MHETCPATH)/digestcomps ! 1754: .ec ! 1755: .in -.5i ! 1756: .fi ! 1757: ! 1758: Hence, when the `\-digest' switch is present, ! 1759: the first step taken by \fIforw\fR is to expand the format strings in the ! 1760: component file. ! 1761: The next step is to compose the draft using ! 1762: the standard digest encapsulation algorithm ! 1763: (even putting an \*(lqEnd of list Digest\*(rq trailer in the draft). ! 1764: Once the draft is composed by \fIforw\fR, ! 1765: \fIforw\fR writes out the volume and issue profile entries for the digest, ! 1766: and then invokes the editor. ! 1767: ! 1768: Naturally, when composing the draft, ! 1769: \fIforw\fR will honor the `\-filter\ filterfile' switch, ! 1770: which is given to \fImhl\fR to filter each message being forwarded prior to ! 1771: encapsulation in the draft. ! 1772: A good filter file to use, which is called \fImhl.digest\fR, is: ! 1773: ! 1774: .nf ! 1775: .in +.5i ! 1776: .ne 10 ! 1777: .eo ! 1778: .so @(MHETCPATH)/mhl.digest ! 1779: .ec ! 1780: .in -.5i ! 1781: .fi ! 1782: ! 1783: .uh "FOLDER HANDLING" ! 1784: .pp ! 1785: There are two interesting facilities for manipulating folders: ! 1786: relative folder addressing, ! 1787: which allows a user to shorten the typing of long folder names; ! 1788: and ! 1789: the folder\-stack, ! 1790: which permits a user to keep a stack of current folders. ! 1791: ! 1792: .UH "Relative Folder Addressing" ! 1793: .pp ! 1794: By default, when `+folder' is given, ! 1795: and the folder name is not absolute ! 1796: (does not start with \fB/\fR, \fB\&./\fR, or \fB\&.\&./\fR), ! 1797: then the UNIX pathname of the folder is interpreted relative to the user's ! 1798: \fIMH\fR directory. ! 1799: Although this mechanism works fine for top\-level folders and their immediate ! 1800: sub\-folders, ! 1801: once the depth of the sub\-folder tree grows, it becomes rather unwieldly: ! 1802: ! 1803: .ti +.5i ! 1804: scan\0+mh/mh.4/draft/flames ! 1805: ! 1806: is a lot of typing. ! 1807: \fIMH\fR can't do anything if the current folder was \*(lq+inbox\*(rq, ! 1808: but if the current folder was, say, \*(lq+mh/mh.4/draft\*(rq, ! 1809: \fIMH\fR has a short\-hand notation to reference a sub\-folder of the ! 1810: current folder. ! 1811: Using the `@folder' notation, ! 1812: the \fIMH\fR user can direct any \fIMH\fR program which expects a `+folder' ! 1813: argument to look for the folder relative to the current folder instead of the ! 1814: user's \fIMH\fR directory. ! 1815: Hence, if the current folder \fIwas\fR \*(lq+mh/mh.4/draft\*(rq, ! 1816: then ! 1817: ! 1818: .ti +.5i ! 1819: scan\0@flames ! 1820: ! 1821: would do the trick handily. ! 1822: In addition, if the current folder \fIwas\fR \*(lq+mh/mh.4/draft\*(rq, ! 1823: ! 1824: .ti +.5i ! 1825: scan\0@../pick ! 1826: ! 1827: would scan the folder \*(lq+mh/mh.4/pick\*(rq, ! 1828: since, in the UNIX fashion, ! 1829: it references the folder \*(lqpick\*(rq which is a sub\-folder of ! 1830: the folder that is the parent of the current folder. ! 1831: Since most advanced \fIMH\fR users seem to exhibit a large degree of locality ! 1832: in referencing folders when they process mail, ! 1833: this convention should receive a wide range of uses. ! 1834: ! 1835: .UH "The Folder\-Stack" ! 1836: .pp ! 1837: The \fIfolder\-stack\fR mechanism in \fIMH\fR gives the \fIMH\fR user a ! 1838: facility similar to the \fICShell\fR\0's directory\-stack. ! 1839: Simply put, ! 1840: ! 1841: .ti +.5i ! 1842: folder\0\-push\0+foo ! 1843: ! 1844: makes \*(lqfoo\*(rq the current folder, ! 1845: saving the folder that was previously the current folder on the ! 1846: \fIfolder\-stack\fR. ! 1847: As expected, ! 1848: ! 1849: .ti +.5i ! 1850: folder\0\-pop ! 1851: ! 1852: takes the top of the \fIfolder\-stack\fR and makes it the current folder. ! 1853: Each of these switches lists the \fIfolder\-stack\fR when they execute. ! 1854: It is simple to write a \fIpushf\fR command as a shell script. ! 1855: It's one line: ! 1856: ! 1857: .ti +.5i ! 1858: exec\0folder\0\-push\0$@ ! 1859: ! 1860: Probably a better way is to link \fIfolder\fR to the $HOME/bin/ directory under ! 1861: the name of \fIpushf\fR and then add the entry ! 1862: ! 1863: .ti +.5i ! 1864: pushf:\0\-push ! 1865: ! 1866: to the \&.mh\(ruprofile. ! 1867: .pp ! 1868: The manual page for \fIfolder\fR discusses the analogy between the ! 1869: \fICShell\fR directory stack commands and the switches in \fIfolder\fR which ! 1870: manipulate the \fIfolder\-stack\fR. ! 1871: The \fIfolder\fR command uses the context entry `Folder\-Stack:' to keep ! 1872: track of the folders in the user's stack of folders. ! 1873: \" ! 1874: \" On to the Appendices ! 1875: \" ! 1876: .fo ''-%-'' ! 1877: .he '''' ! 1878: .(x ! 1879: .sp ! 1880: Appendix ! 1881: .)x _ ! 1882: .de $c \" Major Heading printer ! 1883: .ce ! 1884: Appendix \\n+(ch ! 1885: .sp 2p ! 1886: .ce ! 1887: .b "\\s12\\$1\\s0" \" 12 Point Bold Header ! 1888: .(x ! 1889: \ \ \ \\n(ch.\\ \\ \\$2 ! 1890: .)x ! 1891: .sp 45p \" 45 points or about 1/2 inch ! 1892: .. ! 1893: .++ A ! 1894: .bp ! 1895: .$c "COMMAND SUMMARY" "Command Summary" ! 1896: .po -.50i ! 1897: .so mh-chart.me ! 1898: .po +.50i ! 1899: .if t \{ ! 1900: .ll 32P ! 1901: .lt 32P ! 1902: \} ! 1903: .bp ! 1904: .$c "MESSAGE NAME BNF" "Message Name BNF" ! 1905: ! 1906: .nf ! 1907: .in 1i ! 1908: .ta \w'signed-number 'u +\w':= 'u +\w'user-defined-sequence 'u ! 1909: msgs := msgspec | ! 1910: msgs msgspec ! 1911: ! 1912: msgspec := msg | ! 1913: msg-range | ! 1914: msg-sequence | ! 1915: user-defined-sequence ! 1916: ! 1917: msg := msg-name | ! 1918: <number> ! 1919: ! 1920: msg-name := \*(lqfirst\*(rq | ! 1921: \*(lqlast\*(rq | ! 1922: \*(lqcur\*(rq | ! 1923: \*(lq\&.\*(rq | ! 1924: \*(lqnext\*(rq | ! 1925: \*(lqprev\*(rq ! 1926: ! 1927: msg-range := msg\*(lq-\*(rqmsg | ! 1928: \*(lqall\*(rq ! 1929: ! 1930: msg-sequence := msg\*(lq:\*(rqsigned-number ! 1931: ! 1932: signed-number := \*(lq+\*(rq<number> | ! 1933: \*(lq-\*(rq<number> | ! 1934: <number> ! 1935: .re ! 1936: .fi ! 1937: .sp ! 1938: .lp ! 1939: Where <number> is a decimal number greater than zero. ! 1940: .lp ! 1941: Msg-range specifies all of the messages in the given range ! 1942: and must not be empty. ! 1943: .lp ! 1944: Msg-sequence specifies up to <number> of messages, beginning ! 1945: with \*(lqmsg\*(rq (in the case of first, cur, next, or <number>), ! 1946: or ending with \*(lqmsg\*(rq (in the case of prev or last). ! 1947: +<number> forces \*(lqstarting with msg\*(rq, and \-<number> forces ! 1948: \*(lqending with number\*(rq. ! 1949: In all cases, \*(lqmsg\*(rq must exist. ! 1950: .lp ! 1951: User\-defined sequences are defined and manipulated with the \fIpick\fR ! 1952: and \fImark\fR commands. ! 1953: .in 0 ! 1954: .bp ! 1955: .ce ! 1956: .b \\s12REFERENCES\\s0 ! 1957: .(x ! 1958: .sp ! 1959: REFERENCES ! 1960: .)x ! 1961: .sp 3 ! 1962: .in .4i ! 1963: .ti 0 ! 1964: 1. Crocker, D. H., J. J. Vittal, K. T. Pogran, and D. A. Henderson, Jr., ! 1965: \*(lqStandard for the Format of ARPA Network Text Messages,\*(rq ! 1966: \fIRFC733\fR, ! 1967: November 1977. ! 1968: ! 1969: .ti 0 ! 1970: 2. Thompson, K., and D. M. Ritchie, \*(lqThe UNIX Time-sharing System,\*(rq ! 1971: \fICommunications of the ACM\fR, Vol. 17, July 1974, pp. 365-375. ! 1972: ! 1973: .ti 0 ! 1974: 3. McCauley, E. J., and P. J. Drongowski, \*(lqKSOS\-The Design of a Secure ! 1975: Operating System,\*(rq \fIAFIPS Conference Proceedings\fR, ! 1976: National Computer Conference, ! 1977: Vol. 48, 1979, pp. 345-353. ! 1978: ! 1979: .ti 0 ! 1980: 4. Crocker, David H., \fIFramework and Functions of the \*(lqMS\*(rq Personal ! 1981: Message System\fR, The Rand Corporation, R-2134-ARPA, December 1977. ! 1982: ! 1983: .ti 0 ! 1984: 5. Thompson, K., and D. M. Ritchie, \fIUNIX Programmer's Manual\fR, 6th ed., ! 1985: Western Electric Company, May 1975 (available only to UNIX licensees). ! 1986: ! 1987: .ti 0 ! 1988: 6. Crocker, D. H., ! 1989: \*(lqStandard for the Format of ARPA Internet Text Messages,\*(rq ! 1990: \fIRFC822\fR, ! 1991: August 1982. ! 1992: .de $c ! 1993: .ce ! 1994: .b "\\s12\\$1\\s0" \" 12 Point Bold Header ! 1995: .(x y ! 1996: .sp ! 1997: \\$1 ! 1998: .)x ! 1999: .sp 3 ! 2000: .. ! 2001: .++ P ! 2002: .bp 1 ! 2003: .fo '''' ! 2004: .he ''-%-'' ! 2005: .+c "READ THIS" ! 2006: .pp ! 2007: Although the \fIMH\fR system was originally developed by the Rand Corporation, ! 2008: and is now in the public domain, ! 2009: the Rand Corporation assumes no responsibility for \fIMH\fR ! 2010: or this particular version of \fIMH\fR. ! 2011: .pp ! 2012: In addition, ! 2013: the Regents of the University of California issue the following ! 2014: \fBdisclaimer\fR in regard to the UCI version of \fIMH\fR: ! 2015: .sp 1 ! 2016: .in +.5i ! 2017: \*(lqAlthough each program has been tested by its contributor, ! 2018: no warranty, express or implied, ! 2019: is made by the contributor or the University of California, ! 2020: as to the accuracy and functioning of the program ! 2021: and related program material, ! 2022: nor shall the fact of distribution constitute any such warranty, ! 2023: and no responsibility is assumed by the contributor ! 2024: or the University of California in connection herewith.\*(rq ! 2025: .in -.5i ! 2026: .pp ! 2027: This version of \fIMH\fR is in the public domain, ! 2028: and as such, ! 2029: there are no real restrictions on its use. ! 2030: The \fIMH\fR source code and documentation have no licensing restrictions ! 2031: whatsoever. ! 2032: As a courtesy, ! 2033: the authors ask only that you provide appropriate credit to the Rand ! 2034: Corporation and the University of California for having developed the software. ! 2035: .pp ! 2036: \fIMH\fR is a software package that is supported neither by the Rand ! 2037: Corporation nor the University of California. ! 2038: However, ! 2039: since we do use the software ourselves and plan to continue using ! 2040: (and improving) \fIMH\fR, ! 2041: bug reports and their associated fixes should be reported back to us so that ! 2042: we may include them in future releases. ! 2043: The current computer mailbox for \fIMH\fR is \fBBug\[email protected]\fR ! 2044: (in the ARPA Internet), ! 2045: and \fB...!ucbvax!ucivax!bug\-mh\fR (UUCP). ! 2046: Presently, ! 2047: there are two Internet discussion groups, ! 2048: \fBMH\[email protected]\fR and \fBMH\[email protected]\fR. ! 2049: If there is sufficient interest, ! 2050: corresponding Usenet news groups may be established along with the ! 2051: appropriate gateways. ! 2052: .+c FOREWORD ! 2053: .pp ! 2054: This document describes the Rand \fIMH\fR Message Handling System. ! 2055: Its primary purpose is to serve as a user's manual. ! 2056: It has been heavily based on a previous version of the manual, ! 2057: prepared by Bruce Borden, Stockton Gaines, and Norman Shapiro. ! 2058: .pp ! 2059: \fIMH\fR is a particularly novel system, ! 2060: and thus it is often more prone to change than other pieces of production ! 2061: software. ! 2062: As such, some specific points in this manual may not be correct in the ! 2063: future. ! 2064: In all cases, the on\-line sections of this manual, ! 2065: available through the UNIX\** \fIman\fR command, ! 2066: should present the most current information. ! 2067: .(f ! 2068: \** UNIX is a trademark of AT&T Bell Laboratories. ! 2069: .)f ! 2070: .pp ! 2071: When reading this document as a user's manual, ! 2072: certain sections are more interesting than others. ! 2073: The Preface and Summary are not particularly interesting to those ! 2074: interested in learning \fIMH\fR. ! 2075: The Introduction is slightly more interesting, ! 2076: as it touches upon the organization of the remainder of this document. ! 2077: The most useful sections are the Overview, Tutorial, and Detailed ! 2078: Description. ! 2079: The Overview should be read by all \fIMH\fR users, regardless of their ! 2080: expertise (beginning, novice, advanced, or hacker). ! 2081: The Tutorial should be read by all beginning and novice \fIMH\fR users, ! 2082: as it presents a nice description of the \fIMH\fR system. ! 2083: The Detailed Description should be read by the day\-to\-day user of \fIMH\fR, ! 2084: as it spells out all of the realities of the \fIMH\fR system. ! 2085: The Advanced Features section discusses some powerful \fIMH\fR capabilities for ! 2086: advanced users. ! 2087: Appendix A is particularly useful for novices, ! 2088: as it summarizes the invocation syntax of all the \fIMH\fR commands. ! 2089: .pp ! 2090: There are also several other documents which may be useful to you: ! 2091: \fIThe Rand MH Message Handling System: Tutorial\fR, ! 2092: which is a tutorial for \fIMH\fR; ! 2093: \fIThe Rand MH Message Handling System: The UCI BBoards Facility\fR, ! 2094: which describes the BBoards handling under \fIMH\fR; ! 2095: \fIMH.5: How to process 200 messages a day and still get some real work ! 2096: done\fR, ! 2097: which was presented at the 1985 Summer Usenix Conference and ! 2098: Exhibition in Portland, Oregon; ! 2099: \fIMH: A Multifarious User Agent\fR, ! 2100: which has been accepted for publication by Computer Networks; ! 2101: \fIMZnet: Mail Service for Personal Micro\-Computer Systems\fR, ! 2102: which was presented at the First International Symposium on Computer Message ! 2103: Systems in Nottingham, U.K.; ! 2104: and, ! 2105: \fIDesign of the TTI Prototype Trusted Mail Agent\fR, ! 2106: which describes a proprietary \*(lqtrusted\*(rq mail system built on \fIMH\fR. ! 2107: All of these documents exist in the \fImh.6\fR distribution sent to your ! 2108: site. ! 2109: There's also a document, ! 2110: \fIChanges to the Rand MH Message Handling System: MH.6\fR, ! 2111: which describes user\-visible changes made to \fIMH\fR since the last major ! 2112: release. ! 2113: .pp ! 2114: This manual is very large, as it describes a large, powerful system in ! 2115: gruesome detail. ! 2116: The important thing to remember is: ! 2117: .sp 2 ! 2118: .ce ! 2119: .b "\s+4DON'T PANIC\s0\**" ! 2120: .sp 2 ! 2121: As explained in the tutorial, you really need to know only 5 commands to ! 2122: handle most of your mail. ! 2123: .(f ! 2124: \** Note the large, \fIfriendly\fR letters. ! 2125: .)f ! 2126: .pp ! 2127: Very advanced users may wish to consult ! 2128: \fIThe Rand MH Message Handling System: Administrator's Guide\fR, ! 2129: which is also present in the \fImh.6\fR distribution sent to your site. ! 2130: .+c ACKNOWLEDGMENTS ! 2131: .pp ! 2132: The \fIMH\fR system described herein is based on the original Rand \fIMH\fR ! 2133: system. ! 2134: It has been extensively developed (perhaps too much so) by Marshall T. Rose and ! 2135: John L. Romine at the University of California, Irvine. ! 2136: Einar A. Stefferud, Jerry N. Sweet, and Terry P. Domae provided numerous ! 2137: suggestions to improve the UCI version of \fIMH\fR. ! 2138: Of course, ! 2139: a large number of people have helped \fIMH\fR along. ! 2140: The list of ``\fIMH\fR immortals'' is too long to list here. ! 2141: However, Van Jacobson deserves a special acknowledgement for his tireless ! 2142: work in improving the performance of \fIMH\fR. ! 2143: Some programs have been speeded-up by a factor of 10 or 20. ! 2144: All of users of \fIMH\fR, everywhere, owe a special thanks to Van. ! 2145: .pp ! 2146: This manual is based on the original \fIMH\fR manual written at Rand by ! 2147: Bruce Borden, Stockton Gaines, and Norman Shapiro. ! 2148: .+c PREFACE ! 2149: .pp ! 2150: This report describes a system for dealing with messages transmitted on a ! 2151: computer. Such messages might originate with other users of the same ! 2152: computer or might come from an outside source through a network to which the user's ! 2153: computer is connected. Such computer-based message systems are ! 2154: becoming increasingly widely used, both within and outside the Department ! 2155: of Defense. ! 2156: .pp ! 2157: The message handling system \fIMH\fR was developed for two reasons. ! 2158: One was to investigate some ! 2159: research ideas concerning how a message system might take advantage of ! 2160: the architecture of the UNIX time-sharing operating system for ! 2161: Digital Equipment Corporation PDP-11 and VAX computers, and the special ! 2162: features of UNIX's command-level interface with the user (the ! 2163: \*(lqshell\*(rq). The other reason was to provide a better and more ! 2164: adaptable base than that of conventional designs ! 2165: on which to build a command and control message system. ! 2166: The effort has succeeded in both ! 2167: regards, although this report mainly describes the message system itself ! 2168: and how it fits in with UNIX. ! 2169: .pp ! 2170: The present report should be of interest to three groups of readers. First, ! 2171: it is a complete reference manual for the users of \fIMH\fR. ! 2172: Second, it should be ! 2173: of interest to those who have a general knowledge of computer-based ! 2174: message systems, both in civilian and military applications. Finally, ! 2175: it should be of interest to those who build large subsystems that ! 2176: interface with users, since it illustrates a new approach to such ! 2177: interfaces. ! 2178: .pp ! 2179: The original \fIMH\fR system was developed by Bruce Borden, ! 2180: using an approach suggested by Stockton Gaines and Norman Shapiro. ! 2181: Valuable assistance was provided by Phyllis Kantar in the later ! 2182: stages of the system's implementation. ! 2183: Several colleagues ! 2184: contributed to the ideas included in this system, particularly ! 2185: Robert Anderson and David Crocker. ! 2186: In addition, valuable experience ! 2187: in message systems, and a valuable source of ideas, was available ! 2188: to us in the form of a previous message system for UNIX called ! 2189: MS, designed at Rand by David Crocker. ! 2190: .pp ! 2191: This report was originally prepared as part of the Rand project entitled ! 2192: \*(lqData Automation Research\*(rq, sponsored by Project AIR FORCE. ! 2193: .+c SUMMARY ! 2194: .pp ! 2195: Electronic communication of text messages is becoming ! 2196: commonplace. Computer-based message systems\-software ! 2197: packages that provide tools for dealing with messages\-are used in many ! 2198: contexts. In particular, message systems are becoming ! 2199: increasingly important in command and control and intelligence ! 2200: applications. ! 2201: .pp ! 2202: This report describes a message handling system called \fIMH\fR. ! 2203: This system provides the user ! 2204: with tools to compose, send, receive, store, retrieve, forward, and ! 2205: reply to messages. \fIMH\fR has been built on the UNIX time-sharing system, ! 2206: a popular operating system developed for the DEC PDP-11 and VAX classes of ! 2207: computers. ! 2208: .pp ! 2209: A complete description of \fIMH\fR is given for users of ! 2210: the system. For those who do not intend to use the system, this description ! 2211: gives a general idea of what a message system is like. The system involves ! 2212: some new ideas about how large subsystems can be constructed. ! 2213: .pp ! 2214: The interesting and unusual features of \fIMH\fR include the ! 2215: following: The user command interface to \fIMH\fR is the UNIX \*(lqshell\*(rq ! 2216: (the standard UNIX command interpreter). Each separable ! 2217: component of message handling, such as message composition or ! 2218: message display, is a separate command. Each program is driven from ! 2219: and updates a private user environment, which is stored as a file ! 2220: between program invocations. This private environment also contains ! 2221: information to \*(lqcustom tailor\*(rq \fIMH\fR to the individual's tastes. ! 2222: \fIMH\fR stores each message as a separate file under UNIX, and it utilizes the ! 2223: tree-structured UNIX file system to organize groups of files within ! 2224: separate directories or \*(lqfolders\*(rq. All of the UNIX facilities ! 2225: for dealing with files and directories, such as ! 2226: renaming, copying, deleting, cataloging, off-line printing, etc., are ! 2227: applicable to messages and directories of messages (folders). Thus, ! 2228: important capabilities needed in a message system are available in \fIMH\fR ! 2229: without the need (often seen in other message systems) for code that ! 2230: duplicates the facilities of the supporting operating system. ! 2231: It also allows users familiar with the shell to use \fIMH\fR with minimal ! 2232: effort. ! 2233: .he '''' ! 2234: .fo '''' ! 2235: .bp ! 2236: .ce ! 2237: .b \\s12CONTENTS\\s0 ! 2238: .sp 3 ! 2239: .xp y ! 2240: .xp x ! 2241: .bp ! 2242: .\" And now the COVER sheet ! 2243: .po +.325i ! 2244: .ll 32P ! 2245: .nf ! 2246: ! 2247: .sp 1.5in ! 2248: .ps 24 ! 2249: .vs 32 ! 2250: .ft B ! 2251: .ce 4 ! 2252: THE RAND MH ! 2253: MESSAGE HANDLING ! 2254: SYSTEM: ! 2255: USER'S MANUAL ! 2256: .ft R ! 2257: .sp .8i ! 2258: .ps 20 ! 2259: .vs 24 ! 2260: .ce ! 2261: UCI Version ! 2262: .sp 0.7i ! 2263: .ce 2 ! 2264: Marshall T. Rose ! 2265: John L. Romine ! 2266: .sp 0.5i ! 2267: .ce 2 ! 2268: Based on the original manual by ! 2269: Borden, Gaines, and Shapiro ! 2270: .vs ! 2271: .sp 1i ! 2272: .ps 18 ! 2273: .vs 22 ! 2274: .ce 2 ! 2275: \*(td ! 2276: \*(MH
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.