Reworked the man page system and some man page contents (mmh-intro).
[mmh] / man / mh-format.man
diff --git a/man/mh-format.man b/man/mh-format.man
deleted file mode 100644 (file)
index 80021df..0000000
+++ /dev/null
@@ -1,624 +0,0 @@
-.\"
-.\" THIS FILE HAS BEEN AUTOMATICALLY GENERATED.  DO NOT EDIT.
-.\"
-.TH MH-FORMAT %manext5% "%nmhdate%" MH.6.8 [%nmhversion%]
-.SH NAME
-mh-format \- format file for nmh message system
-.SH DESCRIPTION
-Several
-.B nmh
-commands utilize either a
-.I format
-string or a
-.I format
-file during their execution.  For example,
-.B scan
-uses a format string which directs it how to generate the scan listing
-for each message;
-.B repl
-uses a format file which directs it
-how to generate the reply to a message, and so on.
-.PP
-There are a few alternate scan listing formats available
-in
-.IR nmh/etc/scan.time ,
-.IR nmh/etc/scan.size ,
-and
-.IR nmh/etc/scan.timely .
-Look in
-.I nmh/etc
-for other
-.B scan
-and
-.B repl
-format files which may have been written at your site.
-.PP
-It suffices to have your local
-.B nmh
-expert actually write new format
-commands or modify existing ones.  This manual section explains how to
-do that.  Note: familiarity with the C
-.B printf
-routine is assumed.
-.PP
-A format string consists of ordinary text, and special multi-character
-escape sequences which begin with `%'.  When specifying a format
-string, the usual C backslash characters are honored: `\\b', `\\f',
-`\\n', `\\r', and `\\t'.  Continuation lines in format files end with
-`\\' followed by the newline character.
-
-.\" TALK ABOUT SYNTAX FIRST, THEN SEMANTICS
-.SS SYNTAX
-Format strings are built around
-.IR "escape sequences" .
-There are three types of escape sequences: header
-.IR components ,
-built-in
-.IR functions ,
-and flow
-.IR control .
-Comments may be inserted in most places where a function argument is
-not expected.  A comment begins with `%;' and ends with a (non-escaped)
-newline.
-.PP
-A
-.I component
-escape is specified as
-.RI `%{ component }',
-and
-exists for each header found in the message being processed.  For example
-.RI `%{ date }'
-refers to the \*(lqDate:\*(rq field of the appropriate message.
-All component escapes have a string value.  Normally, component values are
-compressed by converting any control characters (tab and newline included)
-to spaces, then eliding any leading or multiple spaces.  However, commands
-may give different interpretations to some component escapes; be sure
-to refer to each command's manual entry for complete details.
-.PP
-A
-.I function
-escape is specified as
-.RI `%( function )'.
-All functions are built-in, and most have a string or numeric value.
-A function escape may have an
-.IR argument .
-The argument follows the function escape: separating
-whitespace is discarded:
-.RI `%( function " " argument )'.
-.PP
-In addition to literal numbers or strings,
-the argument to a function escape can be another function, a component,
-or a control escape.  When the argument is a function or a
-component, they are listed without a leading `%'.  When control escapes
-are used as function arguments, they written as normally, with
-a leading `%';
-
-.SS "Control escapes"
-.PP
-A
-.I control
-escape is one of: `%<', `%?', `%|', or `%>'.
-These are combined into the conditional execution construct:
-.PP
-.RS 5
-.nf
-.RI "%< " condition " " "format-text"
-.RI "%? " condition " " "format-text"
-    \&...
-.RI "%| " "format-text"
-%>
-.fi
-.RE
-.PP
-Extra white space is shown here only for clarity.  These
-constructs may be nested without ambiguity.  They form a general
-.B if\-elseif\-else\-endif
-block where only one of the
-format-texts
-is interpreted.  In other
-words, `%<' is like the "if", `%?' is like the "elseif", `%|' is like
-"else", and `%>' is like "endif".
-.PP
-A `%<' or `%?' control escape causes its condition to be evaluated.
-This condition is a
-.I component
-or
-.IR function .
-For integer valued functions or components, the condition is true
-if the function return or component value is non-zero, and false if zero.
-For string valued functions or components, the condition is true
-if the function return or component value is
-a non-empty string, and false for an empty string.
-
-.PP
-The `%?' control escape is optional, and may there may be more
-than one `%?' control escape in a conditional block.
-The `%|' control escape
-is also optional, but may be included at most once.
-
-.SS "Function escapes"
-Functions expecting an argument generally
-require an argument of a particular type.
-In addition to the number and string types,
-these include:
-.PP
-.RS 5
-.nf
-.ta +\w'Argument 'u +\w'An optional component, 'u
-.I Argument    Description     Example Syntax
-literal        A literal number        %(\fIfunc\fR 1234)
-       or string               %(\fIfunc\fR text string)
-comp   Any component           %(\fIfunc\fR\^{\fIin-reply-to\fR\^})
-date   A date component        %(\fIfunc\fR\^{\fIdate\fR\^})
-addr   An address component    %(\fIfunc\fR\^{\fIfrom\fR\^})
-expr   Nothing %(\fIfunc\fR)
-       or a subexpression      %(\fIfunc\fR\^(\fIfunc2\fR\^))
-       or control escape       %(\fIfunc\fR %<{\fIreply-to\fR\^}%|%{\fIfrom\fR\^}%>)
-.fi
-.RE
-.PP
-The types
-.I date
-and
-.I addr
-have the same syntax as
-.IR comp ,
-but require that the header component be a date string, or address
-string, respectively.
-.PP
-Most arguments not of type
-.IR expr
-are required.
-When escapes are nested (via expr arguments), evaluation is done from inner-most to outer-most.
-As noted above, for the
-expr
-argument type,
-functions and components are written without a
-leading `%'.
-Control escape arguments must use a leading `%', preceded by a space.
-.PP
-For example,
-.PP
-.RS 5
-.nf
-%<(mymbox{from}) To: %{to}%>
-.fi
-.RE
-.PP
-writes  the  value of the header component \*(lqFrom:\*(rq to the
-internal register named str; then (\fImymbox\fR\^) reads str and
-writes its result to the internal register named
-.IR num ;
-then the control escape evaluates
-.IR num .
-If
-.IR num
-is non-zero, the
-string \*(lqTo:\*(rq is printed  followed  by  the  value  of  the
-header component \*(lqTo:\*(rq.
-.SS Evaluation
-The evaluation of format strings is performed
-by a small virtual machine.
-The machine is capable of evaluating nested expressions
-as described above, and in addition
-has an integer register
-.IR num ,
-and a text string register
-.IR str .
-When a function escape that
-accepts an optional argument is processed,
-and the argument is not present, the current value of either
-.I num
-or
-.I str
-is used as the argument: which register is
-used depends on the function, as listed below.
-.PP
-Component escapes write the value of their message header in
-.IR str .
-Function escapes write their return value in
-.I num
-for functions returning integer or boolean values, and in
-.I str
-for functions returning string values.  (The boolean type is a subset
-of integers with usual values 0=false and 1=true.)  Control escapes
-return a boolean value, setting
-.I num
-to 1 if the last explicit condition
-evaluated by a `%<' or `%?' control
-succeeded, and 0 otherwise.
-.PP
-All component escapes, and those function escapes which return an
-integer or string value, evaluate to their value as well as setting
-.I str
-or
-.IR num .
-Outermost escape expressions in
-these forms will print
-their value, but outermost escapes which return a boolean value
-do not result in printed output.
-.SS Functions
-The function escapes may be roughly grouped into a few categories.
-.PP
-.RS 5
-.nf
-.ta \w'Fformataddr 'u +\w'Aboolean 'u +\w'Rboolean 'u
-.I Function    Argument   Result       Description
-msg            integer message number
-cur            integer message is current (0 or 1)
-unseen         integer message is unseen (0 or 1)
-size           integer size of message
-strlen         integer length of \fIstr\fR
-width          integer output buffer size in bytes
-charleft               integer bytes left in output buffer
-timenow                integer seconds since the UNIX epoch
-me             string  the user's mailbox
-eq     literal boolean \fInum\fR == \fIarg\fR
-ne     literal boolean \fInum\fR != \fIarg\fR
-gt     literal boolean \fInum\fR > \fIarg\fR
-match  literal boolean \fIstr\fR contains \fIarg\fR
-amatch literal boolean \fIstr\fR starts with \fIarg\fR
-plus   literal integer \fIarg\fR plus \fInum\fR
-minus  literal integer \fIarg\fR minus \fInum\fR
-divide literal integer \fInum\fR divided by \fIarg\fR
-modulo literal integer \fInum\fR modulo \fIarg\fR
-num    literal integer Set \fInum\fR to \fIarg\fR.
-num            integer Set \fInum\fR to zero.
-lit    literal string  Set \fIstr\fR to \fIarg\fR.
-lit            string  Clear \fIstr\fR.
-getenv         literal string  Set \fIstr\fR to environment value of \fIarg\fR
-profile        literal string  Set \fIstr\fR to profile component \fIarg\fR
-                       value
-.\" dat        literal int     return value of dat[arg]
-nonzero        expr    boolean \fInum\fR is non-zero
-zero   expr    boolean \fInum\fR is zero
-null   expr    boolean \fIstr\fR is empty
-nonnull        expr    boolean \fIstr\fR is non-empty
-void   expr            Set \fIstr\fR or \fInum\fR
-comp   comp    string  Set \fIstr\fR to component text
-compval        comp    integer Set \fInum\fR to \*(lq\fBatoi\fR(\fIcomp\fR\^)\*(rq
-.\" compflag   comp    integer Set \fInum\fR to component flags bits (internal)
-.\" decodecomp comp    string  Set \fIstr\fR to RFC-2047 decoded component text
-decode expr    string  decode \fIstr\fR as RFC-2047 (MIME-encoded)
-                       component
-unquote        expr    string  remove RFC-2822 quotes from \fIstr\fR
-trim   expr            trim trailing white-space from \fIstr\fR
-putstr expr            print \fIstr\fR
-putstrf        expr            print \fIstr\fR in a fixed width
-putnum expr            print \fInum\fR
-putnumf        expr            print \fInum\fR in a fixed width
-.\" addtoseq literal    add msg to sequence (LBL option)
-nodate string  integer Argument not a date string (0 or 1)
-formataddr     expr            append \fIarg\fR to \fIstr\fR as a
-                       (comma separated) address list
-putaddr        literal         print \fIstr\fR address list with
-                       \fIarg\fR as optional label;
-                       get line width from \fInum\fR
-.fi
-.RE
-.PP
-The following functions require a date component as an argument:
-.PP
-.RS 5
-.nf
-.ta \w'Fformataddr 'u +\w'Aboolean 'u +\w'Rboolean 'u
-.I Function    Argument        Return  Description
-sec    date    integer seconds of the minute
-min    date    integer minutes of the hour
-hour   date    integer hours of the day (0-23)
-wday   date    integer day of the week (Sun=0)
-day    date    string  day of the week (abbrev.)
-weekday        date    string  day of the week
-sday   date    integer day of the week known?
-                       (1=explicit,0=implicit,\-1=unknown)
-mday   date    integer day of the month
-yday   date    integer day of the year
-mon    date    integer month of the year
-month  date    string  month of the year (abbrev.)
-lmonth date    string  month of the year
-year   date    integer year (may be > 100)
-zone   date    integer timezone in hours
-tzone  date    string  timezone string
-szone  date    integer timezone explicit?
-                       (1=explicit,0=implicit,\-1=unknown)
-date2local     date            coerce date to local timezone
-date2gmt       date            coerce date to GMT
-dst    date    integer daylight savings in effect? (0 or 1)
-clock  date    integer seconds since the UNIX epoch
-rclock date    integer seconds prior to current time
-tws    date    string  official 822 rendering
-pretty date    string  user-friendly rendering
-.fi
-.RE
-.PP
-These functions require an address component as an argument.
-The return value of functions noted with `*' is computed from
-the first address present in the header component.
-.PP
-.RS 5
-.nf
-.ta \w'Fformataddr 'u +\w'Aboolean 'u +\w'Rboolean 'u
-.I Function    Argument        Return  Description
-proper addr    string  official 822 rendering
-friendly       addr    string  user-friendly rendering
-addr   addr    string  mbox@host or host!mbox rendering*
-pers   addr    string  the personal name*
-note   addr    string  commentary text*
-mbox   addr    string  the local mailbox*
-mymbox addr    integer List has the user's address? (0 or 1)
-host   addr    string  the host domain*
-nohost addr    integer no host was present (0 or 1)*
-type   addr    integer host type* (0=local,1=network,
-                       \-1=uucp,2=unknown)
-path   addr    string  any leading host route*
-ingrp  addr    integer address was inside a group (0 or 1)*
-gname  addr    string  name of group*
-.fi
-.RE
-.PP
-(A clarification on (\fImymbox\fR\^{\fIcomp\fR\^}) is in order.
-This function checks each of the addresses in the header component
-\*(lq\fIcomp\fR\*(rq against the user's mailbox name and any
-.RI \*(lq Alternate-Mailboxes \*(rq.
-It returns true if any address matches,
-however, it also returns true if the \*(lq\fIcomp\fR\*(rq header is not
-present in the message.  If needed, the (\fInull\fR\^) function can be
-used to explicitly test for this case.)
-.SS Formatting
-When a function or component escape is interpreted and the result will
-be immediately printed, an optional field width can be specified to
-print the field in exactly a given number of characters.  For example, a
-numeric escape like %4(\fIsize\fR\^) will print at most 4 digits of the
-message size; overflow will be indicated by a `?' in the first position
-(like `?234').  A string escape like %4(\fIme\fR\^) will print the first 4
-characters and truncate at the end.  Short fields are padded at the right
-with the fill character (normally, a blank).  If the field width argument
-begins with a leading zero, then the fill character is set to a zero.
-.PP
-The functions (\fIputnumf\fR\^) and (\fIputstrf\fR\^)
-print their result in exactly the number of characters
-specified by their leading field width argument.  For example,
-%06(\fIputnumf\fR\^(\fIsize\fR\^)) will print the message
-size in a field six characters wide filled with leading zeros;
-%14(\fIputstrf\^\fR{\fIfrom\^\fR}) will print the \*(lqFrom:\*(rq header
-component in fourteen characters with trailing spaces added as needed.
-For \fIputstrf\fR, using a negative value for the field width causes
-right-justification of the string within the field, with padding on
-the left up to the field width.
-The functions (\fIputnum\fR\^) and
-(\fIputstr\fR\^) are somewhat special: they print their result in the minimum number of characters
-required, and ignore any leading field width argument.
-.PP
-The available output width is kept in an internal register; any output
-past this width will be truncated.
-.SS Examples
-With all this in mind,
-here's the default format string for
-.BR scan .
-It's been divided into several pieces for readability.
-The first part is:
-.PP
-.RS
-.nf
-%4(msg)%<(cur)+%| %>%<{replied}\-%?{encrypted}E%| %>
-.fi
-.RE
-.PP
-which says that the message number should be printed in four digits.
-If the message is the current message then a `+' else a space should
-be printed; if a \*(lqReplied:\*(rq field is present then a `\-'
-else if an \*(lqEncrypted:\*(rq field is present then an `E' otherwise
-a space should be printed.  Next:
-.PP
-.RS
-.nf
-%02(mon{date})/%02(mday{date})
-.fi
-.RE
-.PP
-the month and date are printed in two digits (zero filled) separated by
-a slash. Next,
-.PP
-.RS 5
-.nf
-%<{date} %|*%>
-.fi
-.RE
-.PP
-If a \*(lqDate:\*(rq field was present,
-then a space is printed, otherwise a `*'.
-Next,
-.PP
-.RS 5
-.nf
-%<(mymbox{from})%<{to}To:%14(decode(friendly{to}))%>%>
-.fi
-.RE
-.PP
-if the message is from me, and there is a \*(lqTo:\*(rq header,
-print \*(lqTo:\*(rq followed by a \*(lquser-friendly\*(rq rendering of the
-first address in the \*(lqTo:\*(rq field; any MIME-encoded
-characters are decoded into the actual characters.
-Continuing,
-.PP
-.RS 5
-.nf
-%<(zero)%17(decode(friendly{from}))%>
-.fi
-.RE
-.PP
-if either of the above two tests failed,
-then the \*(lqFrom:\*(rq address is printed
-in a mime-decoded, \*(lquser-friendly\*(rq format.
-And finally,
-.PP
-.RS 5
-.nf
-%(decode{subject})%<{body}<<%{body}>>%>
-.fi
-.RE
-.PP
-the mime-decoded subject and initial body (if any) are printed.
-.PP
-For a more complicated example, next consider
-a possible
-.I replcomps
-format file.
-.PP
-.RS 5
-.nf
-%(lit)%(formataddr %<{reply-to}
-.fi
-.RE
-.PP
-This clears
-.I str
-and formats the \*(lqReply-To:\*(rq header
-if present.  If not present, the else-if clause is executed.
-.PP
-.RS 5
-.nf
-%?{from}%?{sender}%?{return-path}%>)\\
-.fi
-.RE
-.PP
-This formats the
-\*(lqFrom:\*(rq, \*(lqSender:\*(rq and \*(lqReturn-Path:\*(rq
-headers, stopping as soon as one of them is present.  Next:
-.PP
-.RS 5
-.nf
-%<(nonnull)%(void(width))%(putaddr To: )\\n%>\\
-.fi
-.RE
-.PP
-If the \fIformataddr\fR result is non-null, it is printed as
-an address (with line folding if needed) in a field \fIwidth\fR
-wide with a leading label of \*(lqTo:\*(rq.
-.PP
-.RS 5
-.nf
-%(lit)%(formataddr{to})%(formataddr{cc})%(formataddr(me))\\
-.fi
-.RE
-.PP
-.I str
-is cleared, and the \*(lqTo:\*(rq and \*(lqCc:\*(rq headers, along with the user's
-address (depending on what was specified with
-the \*(lq\-cc\*(rq switch to \fIrepl\fR\^) are formatted.
-.PP
-.RS 5
-.nf
-%<(nonnull)%(void(width))%(putaddr cc: )\\n%>\\
-.fi
-.RE
-.PP
-If the result is non-null, it is printed as above with a
-leading label of \*(lqcc:\*(rq.
-.PP
-.RS 5
-.nf
-%<{fcc}Fcc: %{fcc}\\n%>\\
-.fi
-.RE
-.PP
-If a
-.B \-fcc
-.I folder
-switch was given to
-.B repl
-(see
-.BR repl (1)
-for more details about %{\fIfcc\fR\^}),
-an \*(lqFcc:\*(rq header is output.
-.PP
-.RS 5
-.nf
-%<{subject}Subject: Re: %{subject}\\n%>\\
-.fi
-.RE
-.PP
-If a subject component was present,
-a suitable reply subject is output.
-.PP
-.RS 5
-.nf
-%<{message-id}In-Reply-To: %{message-id}\\n%>\\
-%<{message-id}References: %<{references} %{references}%>\\
-%{message-id}\\n%>
-\-\-\-\-\-\-\-\-
-.fi
-.RE
-.PP
-If a message-id component was present, an \*(lqIn-Reply-To:\*(rq header is
-output including the message-id, followed by a \*(lqReferences:\*(rq
-header with references, if present, and the message-id.
-As with all
-plain-text, the row of dashes are output as-is.
-.PP
-This last part is a good example for a little more elaboration.
-Here's that part again in pseudo-code:
-.PP
-.RS 5
-.nf
-.ta .5i 1i 1.5i 2i
-if (comp_exists(message-id))  then
-       print (\*(lqIn-reply-to: \*(rq)
-       print (message-id.value)
-       print (\*(lq\\n\*(rq)
-endif
-if (comp_exists(message-id)) then
-       print (\*(lqReferences: \*(rq)
-       if (comp_exists(references)) then
-             print(references.value);
-       endif
-       print (message-id.value)
-       print (\*(lq\\n\*(rq)
-endif
-.fi
-.RE
-.PP
-.\" (Note that this pseudocode begs the question ``why not just
-.\" support this syntax?''  MH has been hacked on for a long time...)
-.\".PP
-One more example: Currently,
-.B nmh
-supports very
-large message numbers, and it is not uncommon for a folder
-to have far more than 10000 messages.
-.\" (Indeed, the original MH
-.\" tutorial document by Rose and Romine is entitled "How to
-.\" process 200 messages a day and still get some real work
-.\" done."  The authors apparently only planned to get
-.\" real work done for about 50 days per folder.)
-Nontheless (as noted above)
-the various scan format strings are inherited
-from older MH versions, and are generally hard-coded to 4
-digits of message number before formatting problems
-start to occur.
-The nmh format strings can be modified to behave more sensibly with larger
-message numbers:
-.PP
-.RS
-.nf
-%(void(msg))%<(gt 9999)%(msg)%|%4(msg)%>
-.fi
-.RE
-.PP
-The current message number is placed in \fInum\fP.
-(Note that
-.RI ( msg )
-is an int function, not a component.)
-The
-.RI ( gt )
-conditional
-is used to test whether the message number
-has 5
-or more digits.
-If so, it is printed at full width: otherwise
-at 4 digits.
-.SH "SEE ALSO"
-scan(1), repl(1), ap(8), dp(8)
-
-.SH CONTEXT
-None