4) Edit the file `mhn.defaults' (installed in the mmh `etc' directory).
This file contains the default profile entries for the mmh commands
- mhlist/mhstore/mhshow. The syntax of this file is described in section
+ mhlist/mhstore/show. The syntax of this file is described in section
9.4 of the book "MH & xmh: Email for Users and Programmers", 3rd edition,
by Jerry Peek, on the Internet at
<http://rand-mh.sourceforge.net/book/mh/confmhn.html>.
/*
** This is used by mhl as a front-end. It is also used
-** by mhshow as the default method of displaying message bodies
+** by show(1) as the default method of displaying message bodies
** or message parts of type text/plain.
*/
char *defaultpager = "more";
options=(-sequence -add -delete -list -public -nopublic
-zero -nozero -version -help)
;;
- next )
- options=(-showmimeproc -header -noheader -checkmime
- -nocheckmime -version -help)
- ;;
packf )
options=(-file -version -help)
;;
-sequence -public -nopublic -zero -nozero -list -nolist
-version -help)
;;
- prev )
- options=(-showproc -showmimeproc -header -noheader -checkmime
- -nocheckmime -version -help)
- ;;
refile )
options=(-link -nolink -src -file -version -help)
;;
-width -file -version -help )
;;
show )
- options=(-showproc -showmimeproc -header -noheader
- -checkmime -nocheckmime -version -help)
+ next )
+ prev )
+ options=(-file -part -type -form -version -help)
;;
sortm )
options=(-datefield -textfield -notextfield -limit -nolimit
COMPREPLY=( $( compgen -W "${options[*]}" -- $current ) )
return 0
}
-[ "$have" ] && complete -F _nmh ali anno burst comp dist flist flists folder folders forw inc mark mhbuild mhl mhlist mhmail mhparam mhpath mhshow mhstore msgchk next packf pick prev prompter rcvdist rcvpack rcvstore refile repl rmf rmm scan send sendfiles show slocal sortm whatnow
+[ "$have" ] && complete -F _nmh ali anno burst comp dist flist flists folder folders forw inc mark mhbuild mhl mhlist mhmail mhparam mhpath mhstore msgchk next packf pick prev prompter rcvdist rcvpack rcvstore refile repl rmf rmm scan send sendfiles show slocal sortm whatnow
file help width)" - 'c[-1,-file]' -f - 'c[-1,-form]' -K mhfile -- scan
compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \
- 's[-]' -k "(draft form moreproc header noheader \
- showproc width help)" - 'C[-1,-(show|more)proc]' -c - \
- 'c[-1,-file]' -f - 'c[-1,-form]' -K mhfile - \
- 'c[-1,-width]' -s '$COLUMNS' -- show next prev
+ 's[-]' -k "(file form part type help)" - \
+ 'c[-1,-file]' -f - 'c[-1,-form]' -K mhfile - -- show next prev
compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' \
-k "(help)" -- rmm
# man pages to install in $(mandir)/$(manext1)
MAN1SRC = ali. anno. burst. comp. dist. flist. flists. folder. folders. \
forw. inc. mark. mhbuild. mhl. mhlist. mmh. mmhwrap. \
- mhmail. mhparam. mhpath. mhshow. mhstore. msgchk. new. fnext. \
+ mhmail. mhparam. mhpath. mhstore. msgchk. new. fnext. \
fprev. unseen. next. packf. pick. prev. prompter. rcvdist. rcvpack. \
rcvstore. refile. repl. rmf. rmm. scan. send. sendfiles. \
show. slocal. sortm. whatnow.
The commands
.BR inc ,
.BR rcvstore ,
-.BR mhshow ,
and
.B show
will add or remove messages from these
.B mhl
formatted message when displaying to a terminal. It is also the default
program used by
-.B mhshow
+.B show
to display message bodies (or message parts) of type text/plain.
This profile entry overrides the $PAGER environment variable, but gets
overridden by the $MMHPAGER environment variable.
.BR $MM_CHARSET .
This variable is
checked by
-.B mhshow
+.B show
for matches against the charset parameter
of text contents to decide it the text content can be displayed
without modifications to your terminal. This variable is checked by
.BR inc ,
.BR rcvstore ,
.BR show ,
-.BR mhshow ,
and
.B flist
honor the sequence.
.PP
Similarly, whenever
.BR show ,
-.BR mhshow ,
.BR next ,
or
.B prev
.fi
.SH "SEE ALSO"
-mhlist(1), mhshow(1), mhstore(1),
+mhlist(1), show(1), mhstore(1),
.br
.I "Proposed Standard for Message Encapsulation"
(RFC\-934),
.fi
.SH "SEE ALSO"
-mhbuild(1), mhshow(1), mhstore(1), sendfiles(1)
+mhbuild(1), show(1), mhstore(1), sendfiles(1)
.SH DEFAULTS
.nf
+++ /dev/null
-.\"
-.\" %nmhwarning%
-.\"
-.TH MHSHOW %manext1% "%nmhdate%" MH.6.8 [%nmhversion%]
-.SH NAME
-mhshow \- display MIME messages
-.SH SYNOPSIS
-.HP 5
-.na
-.B mhshow
-.RI [ +folder ]
-.RI [ msgs ]
-.RB [ \-file
-.IR file ]
-.RB [ \-part
-.IR number ]
-\&...
-.RB [ \-type
-.IR content ]
-\&...
-.RB [ \-form
-.IR formfile ]
-.RB [ \-version ]
-.RB [ \-help ]
-.ad
-.SH DESCRIPTION
-The
-.B mhshow
-command display contents of a MIME (multi-media)
-message or collection of messages.
-.PP
-.B mhshow
-manipulates multi-media messages as specified in
-RFC\-2045 thru RFC\-2049. Currently
-.B mhshow
-only supports
-encodings in message bodies, and does not support the encoding of
-message headers as specified in RFC\-2047.
-.PP
-By default
-.B mhshow
-will display all parts of a multipart
-message. By using the
-.B \-part
-and
-.B \-type
-switches, you may
-limit the scope of
-.B mhshow
-to particular subparts (of a
-multipart content) and/or particular content types.
-.PP
-The option
-.B \-file
-.I file
-directs
-.B mhshow
-to use the specified file as
-the source message, rather than a message from a folder. If you specify
-this file as \*(lq-\*(rq, then
-.B mhshow
-will accept the source message
-on the standard input. Note that the file, or input from standard input
-should be a validly formatted message, just like any other
-.B nmh
-message. It should
-.B NOT
-be in mail drop format (to convert a file in
-mail drop format to a folder of
-.B nmh
-messages, see
-.BR inc (1)).
-.PP
-When displaying multiple messages,
-.B mhshow
-prepends each of them with a `>>> Message nnn' header,
-and separates the messages with two lines of space.
-This is similar to the way
-.B mhl
-acts on multiple files.
-.PP
-A part specification consists of a series of numbers separated by dots.
-For example, in a multipart content containing three parts, these
-would be named as 1, 2, and 3, respectively. If part 2 was also a
-multipart content containing two parts, these would be named as 2.1 and
-2.2, respectively. Note that the
-.B \-part
-switch is effective for only
-messages containing a multipart content. If a message has some other
-kind of content, or if the part is itself another multipart content, the
-.B \-part
-switch will not prevent the content from being acted upon.
-.PP
-A content specification consists of a content type and a subtype.
-The initial list of \*(lqstandard\*(rq content types and subtypes can
-be found in RFC\-2046.
-.PP
-A list of commonly used contents is briefly reproduced here:
-.PP
-.RS 5
-.nf
-.ta \w'application 'u
-Type Subtypes
----- --------
-text plain, enriched
-multipart mixed, alternative, digest, parallel
-message rfc822, partial, external-body
-application octet-stream, postscript
-image jpeg, gif, png
-audio basic
-video mpeg
-.fi
-.RE
-.PP
-A legal MIME message must contain a subtype specification.
-.PP
-To specify a content, regardless of its subtype, just use the
-name of the content, e.g., \*(lqaudio\*(rq. To specify a specific
-subtype, separate the two with a slash, e.g., \*(lqaudio/basic\*(rq.
-Note that regardless of the values given to the `\-type' switch, a
-multipart content (of any subtype listed above) is always acted upon.
-.SS "Unseen Sequence"
-If the profile entry \*(lqUnseen\-Sequence\*(rq is present and
-non\-empty, then
-.B mhshow
-will remove each of the messages shown
-from each sequence named by the profile entry.
-.SS "Showing the Contents"
-.B Mhshow
-prints messages in a convenient representation.
-If
-.B mhshow
-is outputting to a terminal, then
-a pager will be placed between the terminal and
-.BR mhshow .
-.PP
-The headers of each message are displayed with
-.B mhl
-using the standard format file
-.IR mhl.headers .
-You may specify an alternate format file with the
-.B \-form
-.I formfile
-switch. If the format file
-.I mhl.null
-is specified, then the display
-of the message headers is suppressed.
-.PP
-Next, the contents are extracted from the message and are stored in
-a temporary file. Usually, the name of the temporary file is the
-word \*(lqmhshow\*(rq followed by a string of characters. Occasionally,
-the method used to display a content (described next), requires that
-the file end in a specific suffix. For example, the
-.B soffice
-command (part of the StarOffice package) can be used to display
-Microsoft Word content, but it uses the suffix to determine how to display
-the file. If no suffix is present, the file is not correctly loaded.
-Similarily, older versions of the
-.B gs
-command append a \*(lq.ps\*(rq suffix to
-the filename if one was missing. As a result, these cannot be used to read
-the default temporary file.
-.PP
-To get around this, your profile can contain lines of the forms:
-.PP
-.RS 5
-.nf
-mhshow-suffix-<type>/<subtype>: <suffix>
-mhshow-suffix-<type>: <suffix>
-.fi
-.RE
-.PP
-to specify a suffix which can be automatically added to the temporary
-file created for a specific content type. For example, the following
-lines might appear in your profile:
-.PP
-.RS 5
-.nf
-mhshow-suffix-text: .txt
-mhshow-suffix-application/msword: .doc
-mhshow-suffix-application/PostScript: .ps
-.fi
-.RE
-.PP
-to automatically append a suffix to the temporary files.
-.PP
-The method used to display the different contents in the messages bodies
-will be determined by a \*(lqdisplay string\*(rq. To find the display
-string,
-.B mhshow
-will first search your profile for an entry of the form:
-.PP
-.RS 5
-mhshow-show-<type>/<subtype>
-.RE
-.PP
-to determine the display string. If this isn't found,
-.B mhshow
-will search for an entry of the form:
-.PP
-.RS 5
-mhshow-show-<type>
-.RE
-.PP
-to determine the display string.
-.PP
-If a display string is found, any escapes (given below) will be expanded.
-The result will be executed under
-\*(lq/bin/sh\*(rq, with the standard input
-set to the content.
-.PP
-The display string may contain the following escapes:
-.PP
-.RS 5
-.nf
-.ta \w'%F 'u
-%l Display listing prior to displaying content
-%f Insert filename containing content
-%F %f, but stdin is terminal not content
-%a Insert parameters from Content-Type field
-%s Insert content subtype
-%c Insert foreign charset
-%d Insert content description
-%% The character %
-.fi
-.RE
-.PP
-.B Mhshow
-processes the MIME parts serially, i.e. the next display process
-is executed after the previous one has terminated.
-.PP
-Further, when
-.B mhshow
-is display a content, typing QUIT (usually
-control-\\) will tell
-.B mhshow
-to wrap things up immediately.
-.PP
-Note that if the content being displayed is multipart, but not one of
-the subtypes listed above, then the f- and F-escapes expand to multiple
-filenames, one for each subordinate content. Further, stdin is not
-redirected from the terminal to the content.
-.PP
-If a display string is not found,
-.B mhshow
-has the following default values:
-.PP
-.RS 5
-.nf
-mhshow-show-text/plain: %liconv -f <source-charset>
-mhshow-show-message/rfc822: %lshow \-file %F
-.fi
-.RE
-.PP
-If a subtype of type text doesn't have a profile entry, it will be
-treated as text/plain.
-.PP
-.B mhshow
-has default methods for handling multipart messages of subtype
-mixed, alternative, parallel, and digest. Any unknown subtype of type
-multipart (without a profile entry), will be treated as multipart/mixed.
-.PP
-If none of these apply, then
-.B mhshow
-will complain.
-.PP
-Example entries might be:
-.PP
-.RS 5
-.nf
-mhshow-show-audio/basic: raw2audio 2>/dev/null | play
-mhshow-show-image: xv %f
-mhshow-show-application/PostScript: lpr -Pps
-.fi
-.RE
-.PP
-When expanding %f and %F escapes, the file names get wrapped in
-single-quotes automatically.
-.PP
-Finally,
-.B mhshow
-will process each message serially \- it won't start
-showing the next message until all the commands executed to display the
-current message have terminated. Although a multipart content may
-contain advice to display the parts in parallel,
-.B mhshow
-will never do so.
-.SS "Showing Alternate Character Sets"
-Because a content of type text might be in a non-ASCII character
-set, when
-.B mhshow
-encounters a \*(lqcharset\*(rq parameter for
-this content, it checks if your terminal can display this character
-set natively.
-.B mhshow
-checks this by first examining the the environment
-variable
-.B $MM_CHARSET
-and if not set, taking the character encoding of the current locale.
-.PP
-If the character set of text/plain cannot be displayed natively, then
-the default display method converts the content automatically by
-piping it through:
-.PP
-.RS 5
-iconv -f '<foreign-charset>'
-.RE
-.PP
-Note that if you have a custom `mhshow-show-*' display string, you
-need to care yourself for converting the encodings.
-(The foreign charset is available through the %c escape.)
-.PP
-The tool
-.B iconv
-needs to be available.
-.PP
-`mhshow-charset-*' profile entries are not supported anymore.
-.SS "Messages of Type message/partial"
-.B mhshow
-cannot directly display messages of type partial.
-You must reassemble them first into a normal message using
-.BR mhstore .
-Check the man page for
-.BR mhstore (1)
-for details.
-.SS "External Access"
-.B Mhshow
-does not automatically retrieve message/external-body parts (anymore),
-but prints the relevant information to enable the user to retrieve
-the files manually.
-.SS "User Environment"
-Because the display environment in which
-.B mhshow
-operates may vary for
-different machines,
-.B mhshow
-will look for the environment variable
-.BR $MHSHOW .
-If present, this specifies the name of an additional
-user profile which should be read. Hence, when a user logs in on a
-particular display device, this environment variable should be set to
-refer to a file containing definitions useful for the given display device.
-Normally, only entries that deal with the methods to display different
-content type and subtypes
-.PP
-.RS 5
-.nf
-mhshow-show-<type>/<subtype>
-mhshow-show-<type>
-.fi
-.RE
-.PP
-need be present in this additional profile. Finally,
-.B mhshow
-will attempt to consult one other additional user profile,
-e.g.,
-.PP
-.RS 5
-%etcdir%/mhn.defaults
-.RE
-.PP
-which is created automatically during
-.B nmh
-installation.
-
-.SH FILES
-.fc ^ ~
-.nf
-.ta \w'%etcdir%/ExtraBigFileName 'u
-^$HOME/.mmh/profile~^The user profile
-^$MHSHOW~^Additional profile entries
-^%etcdir%/mhn.defaults~^System default MIME profile entries
-^%etcdir%/mhl.headers~^The headers template
-.fi
-
-.SH "PROFILE COMPONENTS"
-.fc ^ ~
-.nf
-.ta 2.4i
-.ta \w'ExtraBigProfileName 'u
-^Path:~^To determine the user's mail storage
-^Current\-Folder:~^To find the default current folder
-^Unseen\-Sequence:~^To name sequences denoting unseen messages
-^mhshow-show-<type>*~^Template for displaying contents
-^Pager:~^Program to use as interactive front\-end
-.fi
-
-.SH "SEE ALSO"
-mhbuild(1), mhl(1), mhlist(1), mhstore(1), sendfiles(1)
-
-.SH DEFAULTS
-.nf
-.RB ` +folder "' defaults to the current folder"
-.RB ` msgs "' defaults to cur"
-.RB ` \-form \ mhl.headers'
-.RB ` \-noverbose '
-.fi
-
-.SH CONTEXT
-If a folder is given, it will become the current folder. The last
-message selected will become the current message.
.fi
.SH "SEE ALSO"
-mhbuild(1), mhlist(1), mhshow(1), sendfiles(1)
+mhbuild(1), mhlist(1), show(1), sendfiles(1)
.SH DEFAULTS
.nf
^mhmail(1)~^\- send mail (mailx replacement)
^mhparam(1)~^\- print mmh profile components
^mhpath(1)~^\- print full pathnames of mmh messages and folders
-^mhshow(1)~^\- display MIME messages
^mhstore(1)~^\- store contents of MIME messages into files
^mmh(1)~^\- initialize the mmh environment
^msgchk(1)~^\- check for messages
^scan(1)~^\- produce a one line per message scan listing
^send(1)~^\- send a message
^sendfiles(1)~^\- send multiple files and directories in MIME message
-^show(1)~^\- show(display) messages
+^show(1)~^\- display MIME messages
^slocal(1)~^\- asynchronously filter and deliver new mail
^sortm(1)~^\- sort messages
^whatnow(1)~^\- prompting front\-end for send
and each file named is included as a separate part in the MIME message.
.PP
For file names with dot suffixes, the context is scanned for a
-.I mhshow-suffix-
+.I show-suffix-
entry for that suffix.
The content-type for the part is taken from that context entry if a match is
found.
.\"
.TH SHOW %manext1% "%nmhdate%" MH.6.8 [%nmhversion%]
.SH NAME
-show \- show (display) messages
+show \- display (MIME) messages
.PP
next \- show the next message
.PP
.B show
.RI [ +folder ]
.RI [ msgs ]
-.RB [ \-showproc
-.IR program ]
-.RB [ \-showmimeproc
-.IR program ]
-.RB [ \-header " | " \-noheader ]
-.RB [ \-checkmime " | " \-nocheckmime ]
-[switches\ for
-.I showproc
-or
-.IR showmimeproc ]
+.RB [ \-file
+.IR file ]
+.RB [ \-part
+.IR number ]
+\&...
+.RB [ \-type
+.IR content ]
+\&...
+.RB [ \-form
+.IR formfile ]
.RB [ \-version ]
.RB [ \-help ]
.PP
.B show p
.ad
+.SH NOTE
+This (i.e. mmh's) version of
+.B show
+is a modified version of nmh's
+.B mhshow
+program.
+The old (non-MIME)
+.B show
+program was removed from mmh.
+
.SH DESCRIPTION
-.B Show
-lists each of the specified messages to the standard output
-(typically, the terminal).
+The
+.B show
+command display contents of a MIME (multi-media)
+message or collection of messages.
.B Next
and
.B prev
on the next or previous message in the specified
(or current) folder, respectively.
.PP
-By default, text (non-MIME) messages are filtered and displayed by
-the
-.B nmh
-command
-.BR mhl .
-This command will display text
-messages in a nice, uniform format. It also allows you to configure
-the format of the displayed messages and which headers fields are
-shown. See the
-.BR mhl (1)
-manual page for the details about this
-command. Any switches not recognized by
-.B show
-are
-passed along to that program. To override the default, use the
-.B \-showproc
-.I program
-switch. For example,
-.B \-showproc
-.I more
-will cause the
-.B more
-program to list the messages with no reformatting.
-.PP
-By default, MIME messages are processed and displayed by the
-.B nmh
-command
-.BR mhshow .
-See the
-.BR mhshow (1)
-manual page for details
-about this command.
-Any switches not recognized
-by
-.B show
-are passed along to that program. To override this
-default, use the
-.B \-showmimeproc
-.I program
-switch.
-.PP
-Note that,
-.B show
-will invoke the
-.I showmimeproc
-even for textual contents if the message has a MIME-Version header.
+.B show
+manipulates multi-media messages as specified in
+RFC\-2045 thru RFC\-2049. Currently
+.B show
+only supports
+encodings in message bodies, and does not support the encoding of
+message headers as specified in RFC\-2047.
+.PP
+By default
+.B show
+will display all parts of a multipart
+message. By using the
+.B \-part
+and
+.B \-type
+switches, you may
+limit the scope of
+.B show
+to particular subparts (of a
+multipart content) and/or particular content types.
.PP
The option
-.B \-checkmime
-(set by default) instructs
-.B show
-to check if any of the messages contains a MIME-Version header.
-If so, they are displayed by the
-.IR showmimeproc ,
-else they are displayed by the
-.BR showproc .
-The option
-.B \-nocheckmime
-disables this test and instructs
+.B \-file
+.I file
+directs
.B show
-to use
-.IR showproc ,
-regardless of whether
-any of the messages are MIME messages.
+to use the specified file as
+the source message, rather than a message from a folder. If you specify
+this file as \*(lq-\*(rq, then
+.B show
+will accept the source message
+on the standard input. Note that the file, or input from standard input
+should be a validly formatted message, just like any other
+.B nmh
+message. It should
+.B NOT
+be in mail drop format (to convert a file in
+mail drop format to a folder of
+.B nmh
+messages, see
+.BR inc (1)).
.PP
-The
-.B \-header
-switch tells
+When displaying multiple messages,
.B show
-to display a one\-line
-description of the message being shown. This description includes
-the folder and the message number.
+prepends each of them with a `>>> Message nnn' header,
+and separates the messages with two lines of space.
+This is similar to the way
+.B mhl
+acts on multiple files.
+.PP
+A part specification consists of a series of numbers separated by dots.
+For example, in a multipart content containing three parts, these
+would be named as 1, 2, and 3, respectively. If part 2 was also a
+multipart content containing two parts, these would be named as 2.1 and
+2.2, respectively. Note that the
+.B \-part
+switch is effective for only
+messages containing a multipart content. If a message has some other
+kind of content, or if the part is itself another multipart content, the
+.B \-part
+switch will not prevent the content from being acted upon.
.PP
-If no `msgs' are specified, the current message is used.
+A content specification consists of a content type and a subtype.
+The initial list of \*(lqstandard\*(rq content types and subtypes can
+be found in RFC\-2046.
+.PP
+A list of commonly used contents is briefly reproduced here:
+.PP
+.RS 5
+.nf
+.ta \w'application 'u
+Type Subtypes
+---- --------
+text plain, enriched
+multipart mixed, alternative, digest, parallel
+message rfc822, partial, external-body
+application octet-stream, postscript
+image jpeg, gif, png
+audio basic
+video mpeg
+.fi
+.RE
.PP
-If the standard output is a terminal, output will be piped through
-a pager.
-If the standard output is not a terminal, no queries are made, and
-each file is listed with a one\-line header and two lines of
-separation.
+A legal MIME message must contain a subtype specification.
.PP
+To specify a content, regardless of its subtype, just use the
+name of the content, e.g., \*(lqaudio\*(rq. To specify a specific
+subtype, separate the two with a slash, e.g., \*(lqaudio/basic\*(rq.
+Note that regardless of the values given to the `\-type' switch, a
+multipart content (of any subtype listed above) is always acted upon.
+.SS "Unseen Sequence"
If the profile entry \*(lqUnseen\-Sequence\*(rq is present and
non\-empty, then
.B show
will remove each of the messages shown
from each sequence named by the profile entry.
+.SS "Showing the Contents"
+.B Mhshow
+prints messages in a convenient representation.
+If
+.B show
+is outputting to a terminal, then
+a pager will be placed between the terminal and
+.BR show .
+.PP
+The headers of each message are displayed with
+.B mhl
+using the standard format file
+.IR mhl.headers .
+You may specify an alternate format file with the
+.B \-form
+.I formfile
+switch. If the format file
+.I mhl.null
+is specified, then the display
+of the message headers is suppressed.
+.PP
+Next, the contents are extracted from the message and are stored in
+a temporary file. Usually, the name of the temporary file is the
+word \*(lqshow\*(rq followed by a string of characters. Occasionally,
+the method used to display a content (described next), requires that
+the file end in a specific suffix. For example, the
+.B soffice
+command (part of the StarOffice package) can be used to display
+Microsoft Word content, but it uses the suffix to determine how to display
+the file. If no suffix is present, the file is not correctly loaded.
+Similarily, older versions of the
+.B gs
+command append a \*(lq.ps\*(rq suffix to
+the filename if one was missing. As a result, these cannot be used to read
+the default temporary file.
+.PP
+To get around this, your profile can contain lines of the forms:
+.PP
+.RS 5
+.nf
+mhshow-suffix-<type>/<subtype>: <suffix>
+mhshow-suffix-<type>: <suffix>
+.fi
+.RE
+.PP
+to specify a suffix which can be automatically added to the temporary
+file created for a specific content type. For example, the following
+lines might appear in your profile:
+.PP
+.RS 5
+.nf
+mhshow-suffix-text: .txt
+mhshow-suffix-application/msword: .doc
+mhshow-suffix-application/PostScript: .ps
+.fi
+.RE
+.PP
+to automatically append a suffix to the temporary files.
+.PP
+The method used to display the different contents in the messages bodies
+will be determined by a \*(lqdisplay string\*(rq. To find the display
+string,
+.B show
+will first search your profile for an entry of the form:
+.PP
+.RS 5
+mhshow-show-<type>/<subtype>
+.RE
+.PP
+to determine the display string. If this isn't found,
+.B show
+will search for an entry of the form:
+.PP
+.RS 5
+mhshow-show-<type>
+.RE
+.PP
+to determine the display string.
+.PP
+If a display string is found, any escapes (given below) will be expanded.
+The result will be executed under
+\*(lq/bin/sh\*(rq, with the standard input
+set to the content.
+.PP
+The display string may contain the following escapes:
+.PP
+.RS 5
+.nf
+.ta \w'%F 'u
+%l Display listing prior to displaying content
+%f Insert filename containing content
+%F %f, but stdin is terminal not content
+%a Insert parameters from Content-Type field
+%s Insert content subtype
+%c Insert foreign charset
+%d Insert content description
+%% The character %
+.fi
+.RE
+.PP
+.B Mhshow
+processes the MIME parts serially, i.e. the next display process
+is executed after the previous one has terminated.
+.PP
+Further, when
+.B show
+is display a content, typing QUIT (usually
+control-\\) will tell
+.B show
+to wrap things up immediately.
+.PP
+Note that if the content being displayed is multipart, but not one of
+the subtypes listed above, then the f- and F-escapes expand to multiple
+filenames, one for each subordinate content. Further, stdin is not
+redirected from the terminal to the content.
+.PP
+If a display string is not found,
+.B show
+has the following default values:
+.PP
+.RS 5
+.nf
+mhshow-show-text/plain: %liconv -f <source-charset>
+mhshow-show-message/rfc822: %lshow \-file %F
+.fi
+.RE
+.PP
+If a subtype of type text doesn't have a profile entry, it will be
+treated as text/plain.
+.PP
+.B show
+has default methods for handling multipart messages of subtype
+mixed, alternative, parallel, and digest. Any unknown subtype of type
+multipart (without a profile entry), will be treated as multipart/mixed.
+.PP
+If none of these apply, then
+.B show
+will complain.
+.PP
+Example entries might be:
+.PP
+.RS 5
+.nf
+mhshow-show-audio/basic: raw2audio 2>/dev/null | play
+mhshow-show-image: xv %f
+mhshow-show-application/PostScript: lpr -Pps
+.fi
+.RE
+.PP
+When expanding %f and %F escapes, the file names get wrapped in
+single-quotes automatically.
+.PP
+Finally,
+.B show
+will process each message serially \- it won't start
+showing the next message until all the commands executed to display the
+current message have terminated. Although a multipart content may
+contain advice to display the parts in parallel,
+.B show
+will never do so.
+.SS "Showing Alternate Character Sets"
+Because a content of type text might be in a non-ASCII character
+set, when
+.B show
+encounters a \*(lqcharset\*(rq parameter for
+this content, it checks if your terminal can display this character
+set natively.
+.B show
+checks this by first examining the the environment
+variable
+.B $MM_CHARSET
+and if not set, taking the character encoding of the current locale.
+.PP
+If the character set of text/plain cannot be displayed natively, then
+the default display method converts the content automatically by
+piping it through:
+.PP
+.RS 5
+iconv -f '<source-charset>'
+.RE
+.PP
+Note that if you have a custom `mhshow-show-*' display string, you
+need to care yourself for converting the encodings.
+(The foreign charset is available through the %c escape.)
+.PP
+The tool
+.B iconv
+needs to be available.
+.PP
+`mhshow-charset-*' profile entries are not supported anymore.
+.SS "Messages of Type message/partial"
+.B show
+cannot directly display messages of type partial.
+You must reassemble them first into a normal message using
+.BR mhstore .
+Check the man page for
+.BR mhstore (1)
+for details.
+.SS "External Access"
+.B Mhshow
+does not automatically retrieve message/external-body parts (anymore),
+but prints the relevant information to enable the user to retrieve
+the files manually.
+.SS "User Environment"
+Because the display environment in which
+.B show
+operates may vary for
+different machines,
+.B show
+will look for the environment variable
+.BR $MHSHOW .
+If present, this specifies the name of an additional
+user profile which should be read. Hence, when a user logs in on a
+particular display device, this environment variable should be set to
+refer to a file containing definitions useful for the given display device.
+Normally, only entries that deal with the methods to display different
+content type and subtypes
+.PP
+.RS 5
+.nf
+mhshow-show-<type>/<subtype>
+mhshow-show-<type>
+.fi
+.RE
+.PP
+need be present in this additional profile. Finally,
+.B show
+will attempt to consult one other additional user profile,
+e.g.,
+.PP
+.RS 5
+%etcdir%/mhn.defaults
+.RE
+.PP
+which is created automatically during
+.B nmh
+installation.
.SH FILES
.fc ^ ~
.nf
.ta \w'%etcdir%/ExtraBigFileName 'u
^$HOME/.mmh/profile~^The user profile
+^$MHSHOW~^Additional profile entries
+^%etcdir%/mhn.defaults~^System default MIME profile entries
+^%etcdir%/mhl.headers~^The headers template
.fi
.SH "PROFILE COMPONENTS"
^Path:~^To determine the user's mail storage
^Current\-Folder:~^To find the default current folder
^Unseen\-Sequence:~^To name sequences denoting unseen messages
+^mhshow-show-<type>*~^Template for displaying contents
+^Pager:~^Program to use as interactive front\-end
.fi
.SH "SEE ALSO"
-mhl(1), mhshow(1), more(1), scan(1)
+mhbuild(1), mhl(1), mhlist(1), mhstore(1), sendfiles(1)
.SH DEFAULTS
.nf
.RB ` +folder "' defaults to the current folder"
.RB ` msgs "' defaults to cur"
-.RB ` \-checkmime '
-.RB ` \-header '
+.RB ` \-form \ mhl.headers'
+.RB ` \-noverbose '
.fi
.SH CONTEXT
If a folder is given, it will become the current folder. The last
-message shown will become the current message.
+message selected will become the current message.
.SH BUGS
-The
-.B \-header
-switch doesn't work when `msgs' expands to more than
-one message. If the
-.I showproc
-is
-.BR mhl ,
-then this problem can
-be circumvented by referencing the \*(lqmessagename\*(rq field in the
-.B mhl
-format file.
-.PP
-.B Show
-updates the user's context before showing the message.
-Hence
-.B show
-will mark messages as seen prior to the user actually
-seeing them. This is generally not a problem, unless the user relies
-on the \*(lqunseen\*(rq messages mechanism, and interrupts
-.B show
-while it is showing \*(lqunseen\*(rq messages.
-.PP
-If your
-.I showproc
-is the pager
-.BR more ,
-then avoid running
-.B show
-in the background with only its standard output piped to
-another process, as in
-.PP
-.RS 5
-show | imprint &
-.RE
-.PP
-Due to a bug in
-.BR more ,
-show will go into a \*(lqtty input\*(rq state.
-To avoid this problem, re\-direct
-.BR show 's
-diagnostic output as well.
-For users of
-.BR csh :
-.PP
-.RS 5
-show |& imprint &
-.RE
-.PP
-For users of
-.BR sh :
-.PP
-.RS 5
-show 2>&1 | imprint &
-.RE
-.PP
.B Next
and
.B prev
# commands to build
CMDS = ali anno burst comp dist flist folder forw mmh mark \
mhbuild mhl \
- mhlist mhmail mhparam mhpath mhshow mhstore msgchk new packf pick \
+ mhlist mhmail mhparam mhpath mhstore msgchk new packf pick \
print-mimetype prompter rcvdist rcvpack rcvstore refile repl rmf \
rmm scan send sendfiles show slocal sortm spost whatnow
msgchk.c new.c packf.c pick.c print-mimetype.sh \
prompter.c rcvdist.c rcvpack.c rcvstore.c \
refile.c repl.c rmf.c rmm.c scan.c scansbr.c send.c \
- sendfiles.sh show.c slocal.c sortm.c spost.c termsbr.c \
+ sendfiles.sh slocal.c sortm.c spost.c termsbr.c \
whatnow.c whatnowproc.c
# auxiliary files
mhpath: mhpath.o $(LOCALLIBS)
$(LINK) mhpath.o $(LINKLIBS)
-mhshow: mhshow.o mhparse.o mhshowsbr.o mhlistsbr.o mhmisc.o mhfree.o termsbr.o $(LOCALLIBS)
+show: mhshow.o mhparse.o mhshowsbr.o mhlistsbr.o mhmisc.o mhfree.o termsbr.o $(LOCALLIBS)
$(LINK) mhshow.o mhparse.o mhshowsbr.o mhlistsbr.o mhmisc.o mhfree.o termsbr.o $(LINKLIBS) $(TERMLIB)
mhstore: mhstore.o mhparse.o mhshowsbr.o mhlistsbr.o mhmisc.o mhfree.o termsbr.o $(LOCALLIBS)
cp $(srcdir)/sendfiles.sh sendfiles
chmod +x sendfiles
-show: show.o $(LOCALLIBS)
- $(LINK) show.o $(LINKLIBS)
-
slocal: slocal.o $(LOCALLIBS)
$(LINK) slocal.o $(LINKLIBS)
case FILESW:
if (mode != SHOW) {
- adios(NULL, "Either call mhshow as `%s' or use -file", invo_name);
+ adios(NULL, "Either call show as `%s' or use -file", invo_name);
}
if (!(cp = *argp++) || (*cp == '-' && cp[1]))
else
folder = getcpy(expandfol(cp));
} else if (mode != SHOW) {
- adios(NULL, "Either call mhshow as `%s' or give message arguments", invo_name);
+ adios(NULL, "Either call show as `%s' or give message arguments", invo_name);
} else {
app_msgarg(&msgs, cp);
}
CI ci = &ct->c_ctinfo;
/* Check for mhshow-show-type/subtype */
- snprintf(buffer, sizeof(buffer), "%s-show-%s/%s",
- invo_name, ci->ci_type, ci->ci_subtype);
+ snprintf(buffer, sizeof(buffer), "mhshow-show-%s/%s",
+ ci->ci_type, ci->ci_subtype);
if ((cp = context_find(buffer)) && *cp != '\0')
return show_content_aux(ct, alternate, cp, NULL);
/* Check for mhshow-show-type */
- snprintf(buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type);
+ snprintf(buffer, sizeof(buffer), "mhshow-show-%s", ci->ci_type);
if ((cp = context_find(buffer)) && *cp != '\0')
return show_content_aux(ct, alternate, cp, NULL);
CI ci = &ct->c_ctinfo;
/* Check for mhshow-show-type/subtype */
- snprintf(buffer, sizeof(buffer), "%s-show-%s/%s",
- invo_name, ci->ci_type, ci->ci_subtype);
+ snprintf(buffer, sizeof(buffer), "mhshow-show-%s/%s",
+ ci->ci_type, ci->ci_subtype);
if ((cp = context_find(buffer)) && *cp != '\0')
return show_content_aux(ct, alternate, cp, NULL);
/* Check for mhshow-show-type */
- snprintf(buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type);
+ snprintf(buffer, sizeof(buffer), "mhshow-show-%s", ci->ci_type);
if ((cp = context_find(buffer)) && *cp != '\0')
return show_content_aux(ct, alternate, cp, NULL);
CI ci = &ct->c_ctinfo;
/* Check for mhshow-show-type/subtype */
- snprintf(buffer, sizeof(buffer), "%s-show-%s/%s",
- invo_name, ci->ci_type, ci->ci_subtype);
+ snprintf(buffer, sizeof(buffer), "mhshow-show-%s/%s",
+ ci->ci_type, ci->ci_subtype);
if ((cp = context_find(buffer)) && *cp != '\0')
return show_multi_aux(ct, alternate, cp);
/* Check for mhshow-show-type */
- snprintf(buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type);
+ snprintf(buffer, sizeof(buffer), "mhshow-show-%s", ci->ci_type);
if ((cp = context_find(buffer)) && *cp != '\0')
return show_multi_aux(ct, alternate, cp);
CI ci = &ct->c_ctinfo;
/* Check for mhshow-show-type/subtype */
- snprintf(buffer, sizeof(buffer), "%s-show-%s/%s",
- invo_name, ci->ci_type, ci->ci_subtype);
+ snprintf(buffer, sizeof(buffer), "mhshow-show-%s/%s",
+ ci->ci_type, ci->ci_subtype);
if ((cp = context_find(buffer)) && *cp != '\0')
return show_content_aux(ct, alternate, cp, NULL);
/* Check for mhshow-show-type */
- snprintf(buffer, sizeof(buffer), "%s-show-%s", invo_name, ci->ci_type);
+ snprintf(buffer, sizeof(buffer), "mhshow-show-%s", ci->ci_type);
if ((cp = context_find(buffer)) && *cp != '\0')
return show_content_aux(ct, alternate, cp, NULL);
+++ /dev/null
-/*
-** show.c -- show/list messages
-**
-** This code is Copyright (c) 2002, by the authors of nmh. See the
-** COPYRIGHT file in the root directory of the nmh distribution for
-** complete copyright information.
-*/
-
-#include <h/mh.h>
-#include <h/mime.h>
-#include <h/utils.h>
-
-static struct swit switches[] = {
-#define CHECKMIMESW 0
- { "checkmime", 0 },
-#define NOCHECKMIMESW 1
- { "nocheckmime", 0 },
-#define HEADSW 2
- { "header", 0 },
-#define NHEADSW 3
- { "noheader", 0 },
-#define FORMSW 4
- { "form formfile", 0 },
-#define SHOWSW 5
- { "showproc program", 0 },
-#define SHOWMIMESW 6
- { "showmimeproc program", 0 },
-#define FILESW 7
- { "file file", -4 }, /* interface from whatnow (listproc) */
-#define VERSIONSW 8
- { "version", 0 },
-#define HELPSW 9
- { "help", 0 },
- { NULL, 0 }
-};
-
-/*
-** static prototypes
-*/
-static int is_mime(char *);
-
-#define SHOW 0
-#define NEXT 1
-#define PREV 2
-
-char *showproc = "mhl";
-char *showmimeproc = "mhshow";
-
-int
-main(int argc, char **argv)
-{
- int headersw = 1, msgp = 0;
- int checkmime = 1, mime;
- int vecp = 1, procp = 1, mode = SHOW, msgnum;
- char *cp, *file = NULL, *folder = NULL, *proc;
- char buf[BUFSIZ], **argp, **arguments;
- char *msgs[MAXARGS], *vec[MAXARGS];
- struct msgs *mp = NULL;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = mhbasename(argv[0]);
-
- /* read user profile/context */
- context_read();
-
- if (!mh_strcasecmp(invo_name, "next")) {
- mode = NEXT;
- } else if (!mh_strcasecmp(invo_name, "prev")) {
- mode = PREV;
- }
- arguments = getarguments(invo_name, argc, argv, 1);
- argp = arguments;
-
- while ((cp = *argp++)) {
- if (*cp == '-') {
- switch (smatch(++cp, switches)) {
- case AMBIGSW:
- ambigsw(cp, switches);
- done(1);
- case UNKWNSW:
- vec[vecp++] = --cp;
- continue;
-
- case HELPSW:
- snprintf(buf, sizeof(buf), "%s [+folder] %s[switches] [switches for showproc]", invo_name, mode == SHOW ? "[msgs] ": "");
- print_help(buf, switches, 1);
- done(1);
- case VERSIONSW:
- print_version(invo_name);
- done(1);
-
- case FILESW:
- if (mode != SHOW)
-usage:
- adios(NULL, "usage: %s [+folder] [switches] [switches for showproc]", invo_name);
-
- if (file)
- adios(NULL, "only one file at a time!");
- if (!(cp = *argp++) || *cp == '-')
- adios(NULL, "missing argument to %s", argp[-2]);
- file = getcpy(expanddir(cp));
- continue;
-
- case HEADSW:
- headersw++;
- continue;
- case NHEADSW:
- headersw = 0;
- continue;
-
- case FORMSW:
- vec[vecp++] = --cp;
- if (!(cp = *argp++) || *cp == '-')
- adios(NULL, "missing argument to %s",
- argp[-2]);
- vec[vecp++] = getcpy(etcpath(cp));
- continue;
-
- case SHOWSW:
- if (!(showproc = *argp++) || *showproc == '-')
- adios(NULL, "missing argument to %s",
- argp[-2]);
- continue;
-
- case SHOWMIMESW:
- if (!(showmimeproc = *argp++) ||
- *showmimeproc == '-')
- adios(NULL, "missing argument to %s",
- argp[-2]);
- continue;
- case CHECKMIMESW:
- checkmime++;
- continue;
- case NOCHECKMIMESW:
- checkmime = 0;
- continue;
- }
- }
- if (*cp == '+' || *cp == '@') {
- if (folder)
- adios(NULL, "only one folder at a time!");
- else
- folder = getcpy(expandfol(cp));
- } else if (mode != SHOW) {
- goto usage;
- } else {
- msgs[msgp++] = cp;
- }
- }
- procp = vecp;
-
- if (file) {
- if (msgp)
- adios(NULL, "only one file at a time!");
- vec[vecp++] = file;
- goto go_to_it;
- }
-
- if (!msgp) {
- switch (mode) {
- case NEXT:
- msgs[msgp++] = seq_next;
- break;
- case PREV:
- msgs[msgp++] = seq_prev;
- break;
- default:
- msgs[msgp++] = seq_cur;
- break;
- }
- }
-
- if (!folder)
- folder = getcurfol();
-
- /* read folder and create message structure */
- if (!(mp = folder_read(folder)))
- adios(NULL, "unable to read folder %s", folder);
-
- /* check for empty folder */
- if (mp->nummsg == 0)
- adios(NULL, "no messages in %s", folder);
-
- /* parse all the message ranges/sequences and set SELECTED */
- for (msgnum = 0; msgnum < msgp; msgnum++)
- if (!m_convert(mp, msgs[msgnum]))
- done(1);
-
- /*
- ** Set the SELECT_UNSEEN bit for all the SELECTED messages,
- ** since we will use that as a tag to know which messages
- ** to remove from the "unseen" sequence.
- */
- for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++)
- if (is_selected(mp, msgnum))
- set_unseen(mp, msgnum);
-
- seq_setprev(mp); /* set the Previous-Sequence */
- seq_setunseen(mp, 0); /* unset unseen seqs for shown msgs */
-
- if (mp->numsel > MAXARGS - 2)
- adios(NULL, "more than %d messages for show exec",
- MAXARGS - 2);
-
- for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++)
- if (is_selected(mp, msgnum))
- vec[vecp++] = getcpy(m_name(msgnum));
-
- seq_setcur(mp, mp->hghsel); /* update current message */
- seq_save(mp); /* synchronize sequences */
- context_replace(curfolder, folder); /* update current folder */
- context_save(); /* save the context file */
-
- if (headersw && vecp == 2)
- printf("(Message %s:%s)\n", folder, vec[1]);
-
-go_to_it: ;
- fflush(stdout);
-
- vec[vecp] = NULL;
-
- /*
- ** Decide which "proc" to use
- */
- mime = 0;
- /* check if any messages are non-text MIME messages */
- if (checkmime) {
- if (file) {
- if (is_mime(vec[vecp - 1])) {
- mime = 1;
- }
- } else {
- for (msgnum = mp->lowsel; msgnum <= mp->hghsel;
- msgnum++) {
- if (!is_selected(mp, msgnum)) {
- continue;
- }
- snprintf(buf, sizeof buf, "%s/%d",
- toabsdir(folder), msgnum);
- if (is_mime(buf)) {
- mime = 1;
- break;
- }
- }
- }
- }
-
- /* Set the "proc" */
- proc = (mime) ? showmimeproc : showproc;
-
- /* Special-cased because mhshow takes msg not files args. */
- if (strcmp(mhbasename(proc), "mhshow")==0) {
- if (file) {
- vec[vecp] = vec[vecp - 1];
- vec[vecp - 1] = "-file";
- vec[++vecp] = NULL;
- }
- vec[vecp++] = concat("+", folder, NULL);
- vec[vecp] = NULL;
- vec[0] = mhbasename(proc);
- execvp(proc, vec);
- adios(proc, "unable to exec");
- }
-
- /* Add the path to the message names. */
- if (!file) {
- for (msgnum = procp; msgnum < vecp; msgnum++) {
- vec[msgnum] = concat(mp->foldpath, "/",
- vec[msgnum], NULL);
- }
- }
-
- vec[0] = mhbasename(proc);
- execvp(proc, vec);
- adios(proc, "unable to exec");
- return 0; /* dead code to satisfy the compiler */
-}
-
-/*
-** Check if a message or file contains MIME.
-*/
-static int
-is_mime(char *msgnam)
-{
- int state = FLD;
- char buf[BUFSIZ], name[NAMESZ];
- FILE *fp;
-
- if ((fp = fopen(msgnam, "r")) == NULL)
- return 0;
-
- while (1) {
- switch (state = m_getfld(state, name, buf, sizeof(buf), fp)) {
- case FLD:
- case FLDPLUS:
- case FLDEOF:
- /* Does it have a Mime-Version header? */
- if (mh_strcasecmp(name, VRSN_FIELD)==0) {
- fclose(fp);
- return 1;
- }
-
- /* else skip the rest of this header field and go on */
- while (state == FLDPLUS) {
- state = m_getfld(state, name, buf, sizeof(buf),
- fp);
- }
- break;
-
- default:
- /* We've passed the header, so message is just text */
- fclose(fp);
- return 0;
- }
- }
-}