Dropped old show(1) and renamed mhshow(1) to show(1).
authormarkus schnalke <meillo@marmaro.de>
Mon, 30 Apr 2012 14:33:55 +0000 (16:33 +0200)
committermarkus schnalke <meillo@marmaro.de>
Mon, 30 Apr 2012 14:33:55 +0000 (16:33 +0200)
If you do want to display non-MIME messages the old way, you can use:
mhl `mhpath ...`
The choice of renaming was hard to decide because I will introduce confusion
and breaks the interface (mmh broke it already!). I though renamed, because
the new situation is what we actually want: One program to display messages
in a sane way. We used to type `show' and silently got `mhshow' when it
contained non-trivial MIME content. That was a workaround and clearly not
straight-forward. The improve the situation show(1) needed to be dropped.
Because users don't want to type `mhshow', I decided to renamed it to `show'.
Hope I won't introduce too many inconveniences with this decision.

18 files changed:
INSTALL
config/config.c
docs/COMPLETION-BASH
docs/COMPLETION-ZSH
man/Makefile.in
man/mh-profile.man5
man/mh-sequence.man7
man/mhbuild.man1
man/mhlist.man1
man/mhshow.man1 [deleted file]
man/mhstore.man1
man/mmh-intro.man7
man/send.man1
man/show.man1
uip/Makefile.in
uip/mhshow.c
uip/mhshowsbr.c
uip/show.c [deleted file]

diff --git a/INSTALL b/INSTALL
index 78e1390..7b375cf 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -52,7 +52,7 @@ need an ANSI C compiler such as gcc.
 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>.
index 1caea47..d6677d2 100644 (file)
@@ -117,7 +117,7 @@ char *listproc = "show -file";
 
 /*
 ** 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";
index 28aa29f..70ac3b2 100644 (file)
@@ -74,10 +74,6 @@ _nmh()
             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)
             ;;
@@ -87,10 +83,6 @@ _nmh()
                     -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)
             ;;
@@ -111,8 +103,9 @@ _nmh()
                     -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
@@ -157,4 +150,4 @@ _nmh()
     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
index 2b47557..70cc287 100644 (file)
@@ -152,10 +152,8 @@ compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \
   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
index acd3072..27d3622 100644 (file)
@@ -51,7 +51,7 @@ SEDMAN = $(SED) -f man.sed $< > $@
 # 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.
index 083222b..df825fb 100644 (file)
@@ -102,7 +102,6 @@ Names the sequence or sequences which shall contain any unread messages.
 The commands
 .BR inc ,
 .BR rcvstore ,
-.BR mhshow ,
 and
 .B show
 will add or remove messages from these
@@ -156,7 +155,7 @@ to page the
 .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.
@@ -530,7 +529,7 @@ a character set that doesn't match
 .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
index 1633b07..874f63e 100644 (file)
@@ -231,7 +231,6 @@ The commands
 .BR inc ,
 .BR rcvstore ,
 .BR show ,
-.BR mhshow ,
 and
 .B flist
 honor the sequence.
@@ -253,7 +252,6 @@ be zeroed by
 .PP
 Similarly, whenever
 .BR show ,
-.BR mhshow ,
 .BR next ,
 or
 .B prev
index 9c68f36..4fa75b5 100644 (file)
@@ -532,7 +532,7 @@ line         ::=     "##" text EOL
 .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),
index f42498b..395d838 100644 (file)
@@ -147,7 +147,7 @@ multipart content (of any subtype listed above) is always acted upon.
 .fi
 
 .SH "SEE ALSO"
-mhbuild(1), mhshow(1), mhstore(1), sendfiles(1)
+mhbuild(1), show(1), mhstore(1), sendfiles(1)
 
 .SH DEFAULTS
 .nf
diff --git a/man/mhshow.man1 b/man/mhshow.man1
deleted file mode 100644 (file)
index d3326ac..0000000
+++ /dev/null
@@ -1,401 +0,0 @@
-.\"
-.\" %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.
index 54495d7..ea37037 100644 (file)
@@ -335,7 +335,7 @@ installation.
 .fi
 
 .SH "SEE ALSO"
-mhbuild(1), mhlist(1), mhshow(1), sendfiles(1)
+mhbuild(1), mhlist(1), show(1), sendfiles(1)
 
 .SH DEFAULTS
 .nf
index d2fe715..8e408e3 100644 (file)
@@ -198,7 +198,6 @@ commands:
 ^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
@@ -217,7 +216,7 @@ commands:
 ^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
index a61fc37..ef0695e 100644 (file)
@@ -50,7 +50,7 @@ The body of each attachment header field is interpreted as a file name,
 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.
index b467122..8e34f71 100644 (file)
@@ -3,7 +3,7 @@
 .\"
 .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
@@ -14,16 +14,16 @@ prev \- show the previous message
 .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
@@ -38,10 +38,21 @@ is equivalent to
 .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
@@ -50,98 +61,348 @@ perform a
 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"
@@ -152,79 +413,26 @@ from each sequence named by the profile entry.
 ^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
index 66db186..6b1469f 100644 (file)
@@ -49,7 +49,7 @@ SETGID_MAIL    = @SETGID_MAIL@
 # 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
 
@@ -72,7 +72,7 @@ SRCS = ali.c aliasbr.c anno.c ap.c burst.c comp.c \
        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
@@ -152,7 +152,7 @@ mhparam: mhparam.o $(LOCALLIBS)
 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)
@@ -211,9 +211,6 @@ sendfiles: sendfiles.sh
        cp $(srcdir)/sendfiles.sh sendfiles
        chmod +x sendfiles
 
-show: show.o $(LOCALLIBS)
-       $(LINK) show.o $(LINKLIBS)
-
 slocal: slocal.o $(LOCALLIBS)
        $(LINK) slocal.o $(LINKLIBS)
 
index fa7f256..54aa78d 100644 (file)
@@ -156,7 +156,7 @@ main(int argc, char **argv)
 
                        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]))
@@ -191,7 +191,7 @@ main(int argc, char **argv)
                        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);
                }
index 13a65e4..2a8bbf9 100644 (file)
@@ -233,13 +233,13 @@ show_content(CT ct, int alternate)
        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);
 
@@ -504,13 +504,13 @@ show_text(CT ct, int alternate)
        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);
 
@@ -545,13 +545,13 @@ show_multi(CT ct, int alternate)
        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);
 
@@ -850,13 +850,13 @@ show_message_rfc822(CT ct, int alternate)
        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);
 
diff --git a/uip/show.c b/uip/show.c
deleted file mode 100644 (file)
index 34fa826..0000000
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
-** 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;
-               }
-       }
-}