<<< Date Index >>>     <<< Thread Index >>>

Re: What should go into 1.5.7?



Thomas Roessler <roessler@xxxxxxxxxxxxxxxxxx> wrote:
> If there are any patches you want to see included with 1.5.7, please
> re-submit them to mutt-dev by Thursday evening.

My "notalternates" patch would be nice; the original thread was here:
http://marc.theaimsgroup.com/?l=mutt-dev&m=108558865804202&w=2

I'll attach an updated diff from a while ago -- if this doesn't apply cleanly,
I can do a new diff against CVS.

Charles

-- 
-----------------------------------------------------------------------
Charles Cazabon                          <muttdev@xxxxxxxxxxxxxxxxxxxx>
-----------------------------------------------------------------------
diff -urN mutt.20041014.orig/alias.c mutt.20041014/alias.c
--- mutt.20041014.orig/alias.c  Sun Feb  1 11:10:43 2004
+++ mutt.20041014/alias.c       Thu Oct 14 13:45:01 2004
@@ -568,8 +568,12 @@
 
   if (mutt_match_rx_list (addr->mailbox, Alternates))
   {
-    dprint (5, (debugfile, "mail_addr_is_user: yes, %s matched by 
alternates.\n", addr->mailbox));
-    return 1;
+    if (!mutt_match_rx_list (addr->mailbox, Notalternates))
+    {
+      dprint (5, (debugfile, "mail_addr_is_user: yes, %s matched by alternates 
and not by notalternates.\n", addr->mailbox));
+      return 1;
+    }
+    dprint (5, (debugfile, "mail_addr_is_user: not yet, %s matched by both 
alternates and notalternates.\n", addr->mailbox));
   }
   
   dprint (5, (debugfile, "mail_addr_is_user: no, all failed.\n"));
diff -urN mutt.20041014.orig/doc/manual.sgml.head 
mutt.20041014/doc/manual.sgml.head
--- mutt.20041014.orig/doc/manual.sgml.head     Mon Jul 19 15:39:28 2004
+++ mutt.20041014/doc/manual.sgml.head  Thu Oct 14 13:45:01 2004
@@ -1192,7 +1192,23 @@
 receive e-mail.
 
 To remove a regular expression from this list, use the
-<tt/unalternates/ command.
+<tt/unalternates/ command.  To exclude otherwise matching addresses,
+see the <tt/notalternates/ command.
+
+<sect1>Excluding alternative addresses<label id="notalternates">
+<p>
+Usage: <tt/&lsqb;un&rsqb;notalternates/ <em/regexp/ &lsqb; <em/regexp/ ... 
&rsqb;<newline>
+
+Many users receive e-mail under a number of different addresses. To
+fully use mutt's features here, the program must be able to
+recognize what e-mail addresses you receive mail under. That's the
+purpose of the <tt/notalternates/ command: It takes a list of regular
+expressions, each of which can identify an address under which you do not
+receive e-mail.  Use this to exclude an address which mutt would otherwise
+consider an alternate address because of the <tt/alternates/ command.
+
+To remove a regular expression from this list, use the
+<tt/unnotalternates/ command.
 
 <sect1>Mailing lists<label id="lists">
 <p>
@@ -1876,8 +1892,8 @@
 ~n [MIN]-[MAX]  messages with a score in the range MIN to MAX *)
 ~N              new messages
 ~O              old messages
-~p              message is addressed to you (consults alternates)
-~P              message is from you (consults alternates)
+~p              message is addressed to you (consults alternates and 
notalternates)
+~P              message is from you (consults alternates and notalternates)
 ~Q              messages which have been replied to
 ~R              read messages
 ~r [MIN]-[MAX]  messages with ``date-received'' in a Date range
@@ -3085,6 +3101,10 @@
 <tt><ref id="alternates" name="alternates"></tt> <em/regexp/ &lsqb; 
<em/regexp/ ... &rsqb;
 <item>
 <tt><ref id="alternates" name="unalternates"></tt> &lsqb; * | <em/regexp/ ... 
&rsqb;
+<item>
+<tt><ref id="notalternates" name="notalternates"></tt> <em/regexp/ &lsqb; 
<em/regexp/ ... &rsqb;
+<item>
+<tt><ref id="notalternates" name="unnotalternates"></tt> &lsqb; * | 
<em/regexp/ ... &rsqb;
 <item>
 <tt><ref id="alternative_order" name="alternative&lowbar;order"></tt> 
<em/mimetype/ &lsqb; <em/mimetype/ ... &rsqb;
 <item>
diff -urN mutt.20041014.orig/doc/manual.sgml.head.orig 
mutt.20041014/doc/manual.sgml.head.orig
--- mutt.20041014.orig/doc/manual.sgml.head.orig        Wed Dec 31 18:00:00 1969
+++ mutt.20041014/doc/manual.sgml.head.orig     Mon Jul 19 15:39:28 2004
@@ -0,0 +1,3182 @@
+<!doctype linuxdoc system>
+
+<article>
+
+<title>The Mutt E-Mail Client
+<author>by Michael Elkins <htmlurl url="mailto:me@xxxxxxxxxx"; 
name="&lt;me@xxxxxxxxxx&gt;">
+<date>version @VERSION@
+<abstract>
+``All mail clients suck.  This one just sucks less.'' -me, circa 1995
+</abstract>
+
+<toc>
+
+<sect>Introduction
+<p>
+<bf/Mutt/ is a small but very powerful text-based MIME mail client.  Mutt is
+highly configurable, and is well suited to the mail power user with advanced
+features like key bindings, keyboard macros, mail threading, regular
+expression searches and a powerful pattern matching language for selecting
+groups of messages.
+
+<sect1>Mutt Home Page
+<p>
+<htmlurl url="http://www.mutt.org/";
+name="http://www.mutt.org/";>
+
+<sect1>Mailing Lists
+<p>
+To subscribe to one of the following mailing lists, send a message with the
+word <em/subscribe/ in the body to
+<tt/list-name/<em/-request/<tt/@mutt.org/.
+
+<itemize>
+<item><htmlurl url="mailto:mutt-announce-request@xxxxxxxx";
+name="mutt-announce@xxxxxxxx"> -- low traffic list for announcements
+<item><htmlurl url="mailto:mutt-users-request@xxxxxxxx";
+name="mutt-users@xxxxxxxx"> -- help, bug reports and feature requests
+<item><htmlurl url="mailto:mutt-dev-request@xxxxxxxx"; 
name="mutt-dev@xxxxxxxx"> -- development mailing list
+</itemize>
+
+<bf/Note:/ all messages posted to <em/mutt-announce/ are automatically
+forwarded to <em/mutt-users/, so you do not need to be subscribed to both
+lists.
+
+<sect1>Software Distribution Sites
+<p>
+<itemize>
+<item><htmlurl url="ftp://ftp.mutt.org/mutt/";
+name="ftp://ftp.mutt.org/mutt/";>
+</itemize>
+<p>
+For a list of mirror sites, please refer to <htmlurl
+url="http://www.mutt.org/download.html";
+name="http://www.mutt.org/download.html";>.
+
+<sect1>IRC
+<p>
+Visit channel <em/#mutt/ on <htmlurl
+url="http://www.openprojects.net"; name="OpenProjects.Net
+(www.openprojects.net)"> to chat with other people interested in Mutt.
+
+<sect1>USENET
+<p>
+See the newsgroup <htmlurl url="news:comp.mail.mutt"; name="comp.mail.mutt">.
+
+<sect1>Copyright
+<p>
+Mutt is Copyright (C) 1996-2000 Michael R. Elkins
+&lt;me@xxxxxxxxxx&gt; and others
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+
+<sect>Getting Started
+<p>
+
+This section is intended as a brief overview of how to use Mutt.  There are
+many other features which are described elsewhere in the manual.  There
+is even more information available in the Mutt FAQ and various web
+pages.  See the <htmlurl url="http://www.mutt.org/mutt/";
+name="Mutt Page"> for more details.
+
+The keybindings described in this section are the defaults as distributed.
+Your local system administrator may have altered the defaults for your site.
+You can always type ``?'' in any menu to display the current bindings.
+
+The first thing you need to do is invoke mutt, simply by typing mutt
+at the command line.  There are various command-line options, see 
+either the mutt man page or the <ref id="commandline" name="reference">.
+
+<sect1>Moving Around in Menus
+<p>
+
+Information is presented in menus, very similar to ELM.  Here is a table
+showing the common keys used to navigate menus in Mutt.
+
+<tscreen><verb>
+j or Down       next-entry      move to the next entry
+k or Up         previous-entry  move to the previous entry
+z or PageDn     page-down       go to the next page
+Z or PageUp     page-up         go to the previous page
+= or Home       first-entry     jump to the first entry
+* or End        last-entry      jump to the last entry
+q               quit            exit the current menu
+?               help            list all keybindings for the current menu
+</verb></tscreen>
+
+<sect1>Editing Input Fields<label id="editing">
+<p>
+Mutt has a builtin line editor which is used as the primary way to input
+textual data such as email addresses or filenames.  The keys used to move
+around while editing are very similar to those of Emacs.
+
+<tscreen><verb>
+^A or <Home>    bol             move to the start of the line
+^B or <Left>    backward-char   move back one char
+Esc B          backward-word   move back one word
+^D or <Delete>  delete-char     delete the char under the cursor
+^E or <End>     eol             move to the end of the line
+^F or <Right>   forward-char    move forward one char
+Esc F          forward-word    move forward one word
+<Tab>           complete        complete filename or alias
+^T              complete-query  complete address with query
+^K              kill-eol        delete to the end of the line
+ESC d          kill-eow        delete to the end ot the word
+^W              kill-word       kill the word in front of the cursor
+^U              kill-line       delete entire line
+^V              quote-char      quote the next typed key
+<Up>            history-up      recall previous string from history
+<Down>          history-down    recall next string from history
+<BackSpace>     backspace       kill the char in front of the cursor
+Esc u          upcase-word     convert word to upper case
+Esc l          downcase-word   convert word to lower case
+Esc c          capitalize-word capitalize the word
+^G              n/a             abort
+<Return>        n/a             finish editing
+</verb></tscreen>
+
+You can remap the <em/editor/ functions using the <ref id="bind" name="bind">
+command.  For example, to make the <em/Delete/ key delete the character in
+front of the cursor rather than under, you could use
+
+<tt/bind editor &lt;delete&gt; backspace/
+
+<sect1>Reading Mail - The Index and Pager
+<p>
+
+Similar to many other mail clients, there are two modes in which mail is
+read in Mutt.  The first is the index of messages in the mailbox, which is
+called the ``index'' in Mutt.  The second mode is the display of the
+message contents.  This is called the ``pager.''
+
+The next few sections describe the functions provided in each of these
+modes.
+
+<sect2>The Message Index
+<p>
+
+<tscreen><verb>
+c               change to a different mailbox
+ESC c           change to a folder in read-only mode
+C               copy the current message to another mailbox
+ESC C           decode a message and copy it to a folder
+ESC s           decode a message and save it to a folder
+D               delete messages matching a pattern
+d               delete the current message
+F               mark as important
+l               show messages matching a pattern
+N               mark message as new
+o               change the current sort method
+O               reverse sort the mailbox
+q               save changes and exit
+s               save-message
+T               tag messages matching a pattern
+t               toggle the tag on a message
+ESC t           toggle tag on entire message thread
+U               undelete messages matching a pattern
+u               undelete-message
+v               view-attachments
+x               abort changes and exit
+<Return>        display-message
+<Tab>           jump to the next new message
+@               show the author's full e-mail address
+$               save changes to mailbox
+/               search
+ESC /           search-reverse
+^L              clear and redraw the screen
+^T              untag messages matching a pattern
+</verb></tscreen>
+
+<sect3>Status Flags
+<p>
+
+In addition to who sent the message and the subject, a short summary of
+the disposition of each message is printed beside the message number.
+Zero or more of the following ``flags'' may appear, which mean:
+
+<p>
+<descrip>
+<tag/D/ message is deleted (is marked for deletion)
+<tag/d/ message have attachments marked for deletion
+<tag/K/ contains a PGP public key
+<tag/N/ message is new
+<tag/O/ message is old
+<tag/P/ message is PGP encrypted
+<tag/r/ message has been replied to
+<tag/S/ message is signed, and the signature is succesfully verified
+<tag/s/ message is signed
+<tag/!/ message is flagged
+<tag/*/ message is tagged
+</descrip>
+
+Some of the status flags can be turned on or off using
+<itemize>
+<item><bf/set-flag/ (default: w)
+<item><bf/clear-flag/ (default: W)
+</itemize>
+
+<p>
+Furthermore, the following flags reflect who the message is addressed
+to.  They can be customized with the
+<ref id="to_chars" name="&dollar;to&lowbar;chars"> variable.
+
+<p>
+<descrip>
+<tag/+/ message is to you and you only
+<tag/T/ message is to you, but also to or cc'ed to others
+<tag/C/ message is cc'ed to you
+<tag/F/ message is from you
+<tag/L/ message is sent to a subscribed mailing list
+</descrip>
+
+<sect2>The Pager
+<p>
+
+By default, Mutt uses its builtin pager to display the body of messages.
+The pager is very similar to the Unix program <em/less/ though not nearly as
+featureful.
+
+<tscreen><verb>
+<Return>        go down one line
+<Space>         display the next page (or next message if at the end of a 
message)
+-               go back to the previous page
+n               search for next match
+S               skip beyond quoted text
+T               toggle display of quoted text
+?               show keybindings
+/               search for a regular expression (pattern)
+ESC /           search backwards for a regular expression
+\               toggle search pattern coloring
+^               jump to the top of the message
+</verb></tscreen>
+
+In addition, many of the functions from the <em/index/ are available in
+the pager, such as <em/delete-message/ or <em/copy-message/ (this is one
+advantage over using an external pager to view messages).
+
+Also, the internal pager supports a couple other advanced features. For
+one, it will accept and translate the ``standard'' nroff sequences for
+bold and underline. These sequences are a series of either the letter,
+backspace (^H), the letter again for bold or the letter, backspace,
+``&lowbar;'' for denoting underline. Mutt will attempt to display these
+in bold and underline respectively if your terminal supports them. If
+not, you can use the bold and underline <ref id="color" name="color">
+objects to specify a color or mono attribute for them.
+
+Additionally, the internal pager supports the ANSI escape sequences for
+character attributes.  Mutt translates them into the correct color and
+character settings.  The sequences Mutt supports are:
+
+<p>
+<tscreen><verb>
+ESC [ Ps;Ps;Ps;...;Ps m
+where Ps =
+0    All Attributes Off
+1    Bold on
+4    Underline on
+5    Blink on
+7    Reverse video on
+3x   Foreground color is x
+4x   Background color is x
+
+Colors are
+0    black
+1    red
+2    green
+3    yellow
+4    blue
+5    magenta
+6    cyan
+7    white
+</verb></tscreen>
+
+Mutt uses these attributes for handling text/enriched messages, and they
+can also be used by an external <ref id="auto_view" name="autoview">
+script for highlighting purposes.  <bf/Note:/ If you change the colors for your
+display, for example by changing the color associated with color2 for
+your xterm, then that color will be used instead of green.
+
+<sect2>Threaded Mode<label id="threads">
+<p>
+When the mailbox is <ref id="sort" name="sorted"> by <em/threads/, there are
+a few additional functions available in the <em/index/ and <em/pager/ modes.
+
+<tscreen><verb>
+^D      delete-thread           delete all messages in the current thread
+^U      undelete-thread         undelete all messages in the current thread
+^N      next-thread             jump to the start of the next thread
+^P      previous-thread         jump to the start of the previous thread
+^R      read-thread             mark the current thread as read
+ESC d   delete-subthread        delete all messages in the current subthread
+ESC u   undelete-subthread      undelete all messages in the current subthread
+ESC n   next-subthread          jump to the start of the next subthread
+ESC p   previous-subthread      jump to the start of the previous subthread
+ESC r   read-subthread          mark the current subthread as read
+ESC t   tag-thread              toggle the tag on the current thread
+ESC v  collapse-thread         toggle collapse for the current thread
+ESC V  collapse-all            toggle collapse for all threads
+P       parent-message          jump to parent message in thread
+</verb></tscreen>
+
+<bf/Note:/ Collapsing a thread displays only the first message
+in the thread and hides the others. This is useful when threads
+contain so many messages that you can only see a handful of threads on
+the screen. See %M in <ref 
id="index_format"name="&dollar;index&lowbar;format">.
+For example, you could use "&percnt;?M?(#&percnt;03M)&amp;(&percnt;4l)?" in 
<ref
+id="index_format"name="&dollar;index&lowbar;format"> to optionally
+display the number of hidden messages if the thread is collapsed.
+
+See also: <ref id="strict_threads" name="&dollar;strict&lowbar;threads">.
+
+<sect2>Miscellaneous Functions
+<p><bf/create-alias/<label id="create-alias"> (default: a)<newline>
+
+Creates a new alias based upon the current message (or prompts for a
+new one).  Once editing is complete, an <ref id="alias" name="alias">
+command is added to the file specified by the <ref id="alias_file"
+name="&dollar;alias&lowbar;file"> variable for future use. <bf/Note:/
+Specifying an <ref id="alias_file" name="&dollar;alias&lowbar;file">
+does not add the aliases specified there-in, you must also <ref
+id="source" name="source"> the file.
+
+<p><bf/check-traditional-pgp/<label id="check-traditional-pgp"> (default: ESC 
P)<newline>
+
+This function will search the current message for content signed or
+encrypted with PGP the "traditional" way, that is, without proper
+MIME tagging.  Technically, this function will temporarily change
+the MIME content types of the body parts containing PGP data; this
+is similar to the <ref id="edit-type" name="edit-type"> function's
+effect.
+
+
+<p><bf/display-toggle-weed/<label id="display-toggle-weed"> (default: 
h)<newline>
+
+Toggles the weeding of message header fields specified by <ref id="ignore"
+name="ignore"> commands.
+
+<p><bf/edit/<label id="edit"> (default: e)<newline>
+
+This command (available in the ``index'' and ``pager'') allows you to
+edit the raw current message as it's present in the mail folder.
+After you have finished editing, the changed message will be
+appended to the current folder, and the original message will be
+marked for deletion.
+
+<p><bf/edit-type/<label id="edit-type"><newline>
+(default: ^E on the attachment menu, and in the pager and index menus; ^T on 
the
+compose menu)
+
+This command is used to temporarily edit an attachment's content
+type to fix, for instance, bogus character set parameters.  When
+invoked from the index or from the pager, you'll have the
+opportunity to edit the top-level attachment's content type.  On the
+<ref id="attach_menu" name="attachment menu">, you can change any
+attachment's content type. These changes are not persistent, and get
+lost upon changing folders.
+
+Note that this command is also available on the <ref
+id="compose_menu" name="compose menu">.  There, it's used to
+fine-tune the properties of attachments you are going to send.
+
+<p><bf/enter-command/<label id="enter-command"> (default: ``:'')<newline>
+
+This command is used to execute any command you would normally put in a
+configuration file.  A common use is to check the settings of variables, or
+in conjunction with <ref id="macro" name="macros"> to change settings on the
+fly.
+
+<p><bf/extract-keys/<label id="extract-keys"> (default: ^K)<newline>
+
+This command extracts PGP public keys from the current or tagged
+message(s) and adds them to your PGP public key ring.
+
+<p><bf/forget-passphrase/<label id="forget-passphrase"> (default:
+^F)<newline> 
+
+This command wipes the passphrase(s) from memory. It is useful, if
+you misspelled the passphrase.
+
+<p><bf/list-reply/<label id="list-reply"> (default: L)<newline>
+
+Reply to the current or tagged message(s) by extracting any addresses which
+match the addresses given by the <ref id="lists" name="lists or subscribe">
+commands, but also honor any <tt/Mail-Followup-To/ header(s) if the
+<ref id="honor_followup_to" name="&dollar;honor&lowbar;followup&lowbar;to">
+configuration variable is set.  Using this when replying to messages posted
+to mailing lists helps avoid duplicate copies being sent to the author of
+the message you are replying to.
+
+<bf/pipe-message/<label id="pipe-message"> (default: |)<newline>
+
+Asks for an external Unix command and pipes the current or
+tagged message(s) to it.  The variables <ref id="pipe_decode"
+name="&dollar;pipe&lowbar;decode">, <ref id="pipe_split"
+name="&dollar;pipe&lowbar;split">, <ref id="pipe_sep"
+name="&dollar;pipe&lowbar;sep"> and <ref id="wait_key"
+name="&dollar;wait&lowbar;key"> control the exact behaviour of this
+function.
+
+<bf/resend-message/<label id="resend-message"> (default: ESC e)<newline>
+
+With resend-message, mutt takes the current message as a template for a
+new message.  This function is best described as "recall from arbitrary
+folders".  It can conveniently be used to forward MIME messages while
+preserving the original mail structure. Note that the amount of headers
+included here depends on the value of the <ref id="weed" name="&dollar;weed">
+variable.
+
+This function is also available from the attachment menu. You can use this
+to easily resend a message which was included with a bounce message
+as a message/rfc822 body part.
+
+<bf/shell-escape/<label id="shell-escape"> (default: !)<newline>
+
+Asks for an external Unix command and executes it.  The <ref
+id="wait_key" name="&dollar;wait&lowbar;key"> can be used to control
+whether Mutt will wait for a key to be pressed when the command returns
+(presumably to let the user read the output of the command), based on
+the return status of the named command.
+
+<bf/toggle-quoted/<label id="toggle-quoted"> (default: T)<newline>
+
+The <em/pager/ uses the <ref id="quote_regexp"
+name="&dollar;quote&lowbar;regexp"> variable to detect quoted text when
+displaying the body of the message.  This function toggles the display
+of the quoted material in the message.  It is particularly useful when
+are interested in just the response and there is a large amount of
+quoted text in the way.
+
+<bf/skip-quoted/<label id="skip-quoted"> (default: S)<newline>
+
+This function will go to the next line of non-quoted text which come
+after a line of quoted text in the internal pager.
+
+<sect1>Sending Mail
+<p>
+
+The following bindings are available in the <em/index/ for sending
+messages.
+
+<tscreen><verb>
+m       compose         compose a new message
+r       reply           reply to sender
+g       group-reply     reply to all recipients
+L       list-reply      reply to mailing list address
+f       forward         forward message
+b       bounce          bounce (remail) message
+ESC k   mail-key        mail a PGP public key to someone
+</verb></tscreen>
+
+Bouncing a message sends the message as is to the recipient you
+specify.  Forwarding a message allows you to add comments or
+modify the message you are forwarding.  These items are discussed
+in greater detail in the next chapter <ref id="forwarding_mail"
+name="``Forwarding and Bouncing Mail''">.
+
+Mutt will then enter the <em/compose/ menu and prompt you for the
+recipients to place on the ``To:'' header field.  Next, it will ask
+you for the ``Subject:'' field for the message, providing a default if
+you are replying to or forwarding a message.  See also <ref id="askcc"
+name="&dollar;askcc">, <ref id="askbcc" name="&dollar;askbcc">, <ref
+id="autoedit" name="&dollar;autoedit">, <ref id="bounce"
+name="&dollar;bounce">, and <ref id="fast_reply"
+name="&dollar;fast&lowbar;reply"> for changing how Mutt asks these
+questions.
+
+Mutt will then automatically start your <ref id="editor"
+name="&dollar;editor"> on the message body.  If the <ref id="edit_headers"
+name="&dollar;edit&lowbar;headers"> variable is set, the headers will be at
+the top of the message in your editor.  Any messages you are replying
+to will be added in sort order to the message, with appropriate <ref
+id="attribution" name="&dollar;attribution">, <ref id="indent_string"
+name="&dollar;indent&lowbar;string"> and <ref id="post_indent_string"
+name="&dollar;post&lowbar;indent&lowbar;string">.  When forwarding a
+message, if the <ref id="mime_forward" name="&dollar;mime&lowbar;forward">
+variable is unset, a copy of the forwarded message will be included.  If
+you have specified a <ref id="signature" name="&dollar;signature">, it
+will be appended to the message.
+
+Once you have finished editing the body of your mail message, you are
+returned to the <em/compose/ menu.  The following options are available:
+
+<tscreen><verb>
+a       attach-file             attach a file
+A      attach-message          attach message(s) to the message
+ESC k   attach-key              attach a PGP public key
+d       edit-description        edit description on attachment
+D       detach-file             detach a file
+t       edit-to                 edit the To field
+ESC f   edit-from               edit the From field
+r       edit-reply-to           edit the Reply-To field
+c       edit-cc                 edit the Cc field
+b       edit-bcc                edit the Bcc field
+y       send-message            send the message
+s       edit-subject            edit the Subject
+S       smime-menu              select S/MIME options
+f       edit-fcc                specify an ``Fcc'' mailbox
+p       pgp-menu                select PGP options
+P       postpone-message        postpone this message until later
+q       quit                    quit (abort) sending the message
+w      write-fcc               write the message to a folder
+i       ispell                  check spelling (if available on your system)
+^F      forget-passphrase       wipe passphrase(s) from memory
+</verb></tscreen>
+
+<bf/Note:/ The attach-message function will prompt you for a folder to
+attach messages from. You can now tag messages in that folder and they
+will be attached to the message you are sending. Note that certain
+operations like composing a new mail, replying, forwarding, etc. are
+not permitted when you are in that folder. The %r in <ref
+id="status_format" name="&dollar;status&lowbar;format"> will change to
+a 'A' to indicate that you are in attach-message mode.
+
+<sect2>Editing the message header
+<p>
+When editing the header of your outgoing message, there are a couple of
+special features available.
+
+If you specify<newline>
+<tt/Fcc:/ <em/filename/<newline>
+Mutt will pick up <em/filename/
+just as if you had used the <em/edit-fcc/ function in the <em/compose/ menu.
+
+You can also attach files to your message by specifying<newline>
+<tt/Attach:/ <em/filename/  &lsqb; <em/description/ &rsqb;<newline>
+where <em/filename/ is the file to attach and <em/description/ is an
+optional string to use as the description of the attached file.
+
+When replying to messages, if you remove the <em/In-Reply-To:/ field from
+the header field, Mutt will not generate a <em/References:/ field, which
+allows you to create a new message thread.
+
+Also see <ref id="edit_headers" name="edit&lowbar;headers">.
+
+<sect2>Using Mutt with PGP
+
+<p>
+If you want to use PGP, you can specify 
+
+<tt/Pgp:/ &lsqb; <tt/E/ | <tt/S/ | <tt/S/<em/&lt;id&gt;/ &rsqb; <newline>
+
+``E'' encrypts, ``S'' signs and
+``S&lt;id&gt;'' signs with the given key, setting <ref
+id="pgp_sign_as" name="&dollar;pgp&lowbar;sign&lowbar;as"> permanently.
+
+If you have told mutt to PGP encrypt a message, it will guide you
+through a key selection process when you try to send the message.
+Mutt will not ask you any questions about keys which have a
+certified user ID matching one of the message recipients' mail
+addresses.  However, there may be situations in which there are
+several keys, weakly certified user ID fields, or where no matching
+keys can be found.
+
+In these cases, you are dropped into a menu with a list of keys from
+which you can select one.  When you quit this menu, or mutt can't
+find any matching keys, you are prompted for a user ID.  You can, as
+usually, abort this prompt using <tt/^G/.  When you do so, mutt will
+return to the compose screen.
+
+Once you have successfully finished the key selection, the message
+will be encrypted using the selected public keys, and sent out.
+
+Most fields of the entries in the key selection menu (see also <ref
+id="pgp_entry_format" name="&dollar;pgp&lowbar;entry&lowbar;format">) 
+have obvious meanings.  But some explanations on the capabilities, flags, 
+and validity fields are in order.
+
+The flags sequence (&percnt;f) will expand to one of the following flags:
+<tscreen><verb>
+R            The key has been revoked and can't be used.
+X            The key is expired and can't be used.
+d            You have marked the key as disabled.
+c            There are unknown critical self-signature 
+             packets.
+</verb></tscreen>
+
+The capabilities field (&percnt;c) expands to a two-character sequence
+representing a key's capabilities.  The first character gives
+the key's encryption capabilities: A minus sign (<bf/-/) means 
+that the key cannot be used for encryption.  A dot (<bf/./) means that
+it's marked as a signature key in one of the user IDs, but may 
+also be used for encryption.  The letter <bf/e/ indicates that 
+this key can be used for encryption.
+ 
+The second character indicates the key's signing capabilities.  Once 
+again, a ``<bf/-/'' implies ``not for signing'', ``<bf/./'' implies
+that the key is marked as an encryption key in one of the user-ids, and
+``<bf/s/'' denotes a key which can be used for signing.
+
+Finally, the validity field (%t) indicates how well-certified a user-id
+is.  A question mark (<bf/?/) indicates undefined validity, a minus 
+character (<bf/-/) marks an untrusted association, a space character 
+means a partially trusted association, and a plus character (<bf/+/) 
+indicates complete validity.
+
+<sect2>Sending anonymous messages via mixmaster.
+
+<p>
+You may also have configured mutt to co-operate with Mixmaster, an
+anonymous remailer.  Mixmaster permits you to send your messages
+anonymously using a chain of remailers. Mixmaster support in mutt is for 
+mixmaster version 2.04 (beta 45 appears to be the latest) and 2.03. 
+It does not support earlier versions or the later so-called version 3 betas, 
+of which the latest appears to be called 2.9b23.
+
+To use it, you'll have to obey certain restrictions.  Most
+important, you cannot use the <tt/Cc/ and <tt/Bcc/ headers.  To tell
+Mutt to use mixmaster, you have to select a remailer chain, using
+the mix function on the compose menu.  
+
+The chain selection screen is divided into two parts.  In the
+(larger) upper part, you get a list of remailers you may use.  In
+the lower part, you see the currently selected chain of remailers.
+
+You can navigate in the chain using the <tt/chain-prev/ and
+<tt/chain-next/ functions, which are by default bound to the left
+and right arrows and to the <tt/h/ and <tt/l/ keys (think vi
+keyboard bindings).  To insert a remailer at the current chain
+position, use the <tt/insert/ function.  To append a remailer behind
+the current chain position, use <tt/select-entry/ or <tt/append/.
+You can also delete entries from the chain, using the corresponding
+function.  Finally, to abandon your changes, leave the menu, or
+<tt/accept/ them pressing (by default) the <tt/Return/ key.
+
+Note that different remailers do have different capabilities,
+indicated in the &percnt;c entry of the remailer menu lines (see
+<ref id="mix_entry_format"
+name="&dollar;mix&lowbar;entry&lowbar;format">).  Most important is
+the ``middleman'' capability, indicated by a capital ``M'': This
+means that the remailer in question cannot be used as the final
+element of a chain, but will only forward messages to other
+mixmaster remailers.  For details on the other capabilities, please
+have a look at the mixmaster documentation.
+
+<sect1>Forwarding and Bouncing Mail<label id="forwarding_mail">
+<p>
+
+Bouncing and forwarding let you send an existing message to recipients
+that you specify.  Bouncing a message uses the <ref id="sendmail"
+name="sendmail"> command to send a copy to alternative addresses as if
+they were the message's original recipients.  Forwarding a message, on
+the other hand, allows you to modify the message before it is resent
+(for example, by adding your own comments).
+
+The following keys are bound by default:
+
+<tscreen><verb>
+f       forward         forward message
+b       bounce          bounce (remail) message
+</verb></tscreen>
+
+Forwarding can be done by including the original message in the new
+message's body (surrounded by indicating lines) or including it as a MIME
+attachment, depending on the value of the <ref id="mime_forward"
+name="&dollar;mime&lowbar;forward"> variable.  Decoding of attachments,
+like in the pager, can be controlled by the <ref id="forward_decode"
+name="&dollar;forward&lowbar;decode"> and <ref id="mime_forward_decode"
+name="&dollar;mime&lowbar;forward&lowbar;decode"> variables,
+respectively.  The desired forwarding format may depend on the content,
+therefore <em/&dollar;mime&lowbar;forward/ is a quadoption which, for
+example, can be set to ``ask-no''.
+
+The inclusion of headers is controlled by the current setting of the
+<ref id="weed" name="&dollar;weed"> variable, unless <ref
+id="mime_forward" name="mime&lowbar;forward"> is set.
+
+Editing the message to forward follows the same procedure as sending or
+replying to a message does.
+
+<sect1>Postponing Mail<label id="postponing_mail">
+<p>
+
+At times it is desirable to delay sending a message that you have
+already begun to compose.  When the <em/postpone-message/ function is
+used in the <em/compose/ menu, the body of your message and attachments
+are stored in the mailbox specified by the <ref id="postponed"
+name="&dollar;postponed"> variable.  This means that you can recall the
+message even if you exit Mutt and then restart it at a later time.
+
+Once a message is postponed, there are several ways to resume it.  From the
+command line you can use the ``-p'' option, or if you <em/compose/ a new
+message from the <em/index/ or <em/pager/ you will be prompted if postponed
+messages exist.  If multiple messages are currently postponed, the
+<em/postponed/ menu will pop up and you can select which message you would
+like to resume.
+
+<bf/Note:/ If you postpone a reply to a message, the reply setting of
+the message is only updated when you actually finish the message and
+send it.  Also, you must be in the same folder with the message you
+replied to for the status of the message to be updated.
+
+See also the <ref id="postpone" name="&dollar;postpone"> quad-option.
+
+<sect>Configuration
+<p>
+
+While the default configuration (or ``preferences'') make Mutt
+usable right out of the box, it is often desirable to tailor Mutt to
+suit your own tastes. When Mutt is first invoked, it will attempt to
+read the ``system'' configuration file (defaults set by your local
+system administrator), unless the ``-n'' <ref id="commandline"
+name="command line"> option is specified.  This file is typically
+<tt>/usr/local/share/mutt/Muttrc</tt> or <tt>/etc/Muttrc</tt>. Mutt
+will next look for a file named <tt>.muttrc</tt> in your home
+directory.  If this file does not exist and your home directory has
+a subdirectory named <tt/.mutt/, mutt try to load a file named
+<tt>.mutt/muttrc</tt>. 
+
+<tt>.muttrc</tt> is the file where you will usually place your <ref
+ id="commands" name="commands"> to configure Mutt.
+
+In addition, mutt supports version specific configuration files that are
+parsed instead of the default files as explained above.  For instance, if
+your system has a <tt/Muttrc-0.88/ file in the system configuration
+directory, and you are running version 0.88 of mutt, this file will be
+sourced instead of the <tt/Muttrc/ file.  The same is true of the user
+configuration file, if you have a file <tt/.muttrc-0.88.6/ in your home
+directory, when you run mutt version 0.88.6, it will source this file
+instead of the default <tt/.muttrc/ file.  The version number is the
+same which is visible using the ``-v'' <ref id="commandline"
+name="command line"> switch or using the <tt/show-version/ key (default:
+V) from the index menu.
+
+<sect1>Syntax of Initialization Files<label id="muttrc-syntax">
+<p>
+
+An initialization file consists of a series of <ref id="commands"
+name="commands">.  Each line of the file may contain one or more commands.
+When multiple commands are used, they must be separated by a semicolon (;).
+<tscreen><verb>
+set realname='Mutt user' ; ignore x-
+</verb></tscreen>
+The hash mark, or pound sign
+(``&num;''), is used as a ``comment'' character. You can use it to
+annotate your initialization file. All text after the comment character
+to the end of the line is ignored. For example,
+
+<tscreen><verb>
+my_hdr X-Disclaimer: Why are you listening to me? &num; This is a comment
+</verb></tscreen>
+
+Single quotes (') and double quotes (&dquot;) can be used to quote strings
+which contain spaces or other special characters.  The difference between
+the two types of quotes is similar to that of many popular shell programs,
+namely that a single quote is used to specify a literal string (one that is
+not interpreted for shell variables or quoting with a backslash &lsqb;see
+next paragraph&rsqb;), while double quotes indicate a string for which
+should be evaluated.  For example, backtics are evaluated inside of double
+quotes, but <bf/not/ for single quotes.
+
+&bsol; quotes the next character, just as in shells such as bash and zsh.
+For example, if want to put quotes ``&dquot;'' inside of a string, you can use
+``&bsol;'' to force the next character to be a literal instead of interpreted
+character.
+<tscreen><verb>
+set realname="Michael \"MuttDude\" Elkins"
+</verb></tscreen>
+
+``&bsol;&bsol;'' means to insert a literal ``&bsol;'' into the line.
+``&bsol;n'' and ``&bsol;r'' have their usual C meanings of linefeed and
+carriage-return, respectively.
+
+A &bsol; at the end of a line can be used to split commands over
+multiple lines, provided that the split points don't appear in the
+middle of command names.
+
+It is also possible to substitute the output of a Unix command in an
+initialization file.  This is accomplished by enclosing the command in
+backquotes (``).  For example,
+<tscreen><verb>
+my_hdr X-Operating-System: `uname -a`
+</verb></tscreen>
+The output of the Unix command ``uname -a'' will be substituted before the
+line is parsed.  Note that since initialization files are line oriented, only
+the first line of output from the Unix command will be substituted.
+
+UNIX environments can be accessed like the way it is done in shells like
+sh and bash: Prepend the name of the environment by a ``&dollar;''.  For
+example,
+<tscreen><verb>
+set record=+sent_on_$HOSTNAME
+</verb></tscreen>
+
+The commands understood by mutt are explained in the next paragraphs.
+For a complete list, see the <ref id="commands" name="command reference">.
+
+<sect1>Defining/Using aliases<label id="alias">
+<p>
+
+Usage: <tt/alias/ <em/key/ <em/address/ &lsqb; , <em/address/, ... &rsqb;
+
+It's usually very cumbersome to remember or type out the address of someone
+you are communicating with.  Mutt allows you to create ``aliases'' which map
+a short string to a full address.
+
+<bf/Note:/ if you want to create an alias for a group (by specifying more than
+one address), you <bf/must/ separate the addresses with a comma (``,'').
+
+To remove an alias or aliases (``*'' means all aliases):
+
+<tt/unalias/ &lsqb; * | <em/key/ <em/.../ &rsqb;
+
+<tscreen><verb>
+alias muttdude me@xxxxxxxxxx (Michael Elkins)
+alias theguys manny, moe, jack
+</verb></tscreen>
+
+Unlike other mailers, Mutt doesn't require aliases to be defined
+in a special file.  The <tt/alias/ command can appear anywhere in
+a configuration file, as long as this file is <ref id="source"
+name="sourced">.  Consequently, you can have multiple alias files, or
+you can have all aliases defined in your muttrc.
+
+On the other hand, the <ref id="create-alias" name="create-alias">
+function can use only one file, the one pointed to by the <ref
+id="alias_file" name="&dollar;alias&lowbar;file"> variable (which is
+<tt>&tilde;/.muttrc</tt> by default). This file is not special either,
+in the sense that Mutt will happily append aliases to any file, but in
+order for the new aliases to take effect you need to explicitly <ref
+id="source" name="source"> this file too.
+
+For example:
+
+<tscreen><verb>
+source /usr/local/share/Mutt.aliases
+source ~/.mail_aliases
+set alias_file=~/.mail_aliases
+</verb></tscreen>
+
+To use aliases, you merely use the alias at any place in mutt where mutt
+prompts for addresses, such as the <em/To:/ or <em/Cc:/ prompt.  You can
+also enter aliases in your editor at the appropriate headers if you have the
+<ref id="edit_headers" name="&dollar;edit&lowbar;headers"> variable set.
+
+In addition, at the various address prompts, you can use the tab character
+to expand a partial alias to the full alias.  If there are multiple matches,
+mutt will bring up a menu with the matching aliases.  In order to be
+presented with the full list of aliases, you must hit tab with out a partial
+alias, such as at the beginning of the prompt or after a comma denoting
+multiple addresses.
+
+In the alias menu, you can select as many aliases as you want with the
+<em/select-entry/ key (default: RET), and use the <em/exit/ key
+(default: q) to return to the address prompt.
+
+<sect1>Changing the default key bindings<label id="bind">
+<p>
+Usage: <tt/bind/ <em/map/ <em/key/ <em/function/
+
+This command allows you to change the default key bindings (operation
+invoked when pressing a key).
+
+<em/map/ specifies in which menu the binding belongs.  Multiple maps may
+be specified by separating them with commas (no additional whitespace is
+allowed). The currently defined maps are:
+
+<label id="maps">
+<descrip>
+<tag/generic/
+This is not a real menu, but is used as a fallback for all of the other
+menus except for the pager and editor modes.  If a key is not defined in
+another menu, Mutt will look for a binding to use in this menu.  This allows
+you to bind a key to a certain function in multiple menus instead of having
+multiple bind statements to accomplish the same task.
+<tag/alias/
+The alias menu is the list of your personal aliases as defined in your
+muttrc.  It is the mapping from a short alias name to the full email
+address(es) of the recipient(s).
+<tag/attach/
+The attachment menu is used to access the attachments on received messages.
+<tag/browser/
+The browser is used for both browsing the local directory structure, and for
+listing all of your incoming mailboxes.
+<tag/editor/
+The editor is the line-based editor the user enters text data.
+<tag/index/
+The index is the list of messages contained in a mailbox.
+<tag/compose/
+The compose menu is the screen used when sending a new message.
+<tag/pager/
+The pager is the mode used to display message/attachment data, and help
+listings.
+<tag/pgp/
+The pgp menu is used to select the OpenPGP keys used for encrypting outgoing
+messages.
+<tag/postpone/
+The postpone menu is similar to the index menu, except is used when
+recalling a message the user was composing, but saved until later.
+</descrip>
+
+<em/key/ is the key (or key sequence) you wish to bind.  To specify a
+control character, use the sequence <em/&bsol;Cx/, where <em/x/ is the
+letter of the control character (for example, to specify control-A use
+``&bsol;Ca'').  Note that the case of <em/x/ as well as <em/&bsol;C/ is
+ignored, so that <em/&bsol;CA/, <em/&bsol;Ca/, <em/&bsol;cA/ and <em/&bsol;ca/ 
are all
+equivalent.  An alternative form is to specify the key as a three digit
+octal number prefixed with a ``&bsol;'' (for example <em/&bsol;177/ is
+equivalent to <em/&bsol;c?/).
+
+In addition, <em/key/ may consist of:
+
+<tscreen><verb>
+\t              tab
+<tab>           tab
+\r              carriage return
+\n              newline
+\e              escape
+<esc>           escape
+<up>            up arrow
+<down>          down arrow
+<left>          left arrow
+<right>         right arrow
+<pageup>        Page Up
+<pagedown>      Page Down
+<backspace>     Backspace
+<delete>        Delete
+<insert>        Insert
+<enter>         Enter
+<return>        Return
+<home>          Home
+<end>           End
+<space>         Space bar
+<f1>            function key 1
+<f10>           function key 10
+</verb></tscreen>
+
+<em/key/ does not need to be enclosed in quotes unless it contains a
+space (`` '').
+
+<em/function/ specifies which action to take when <em/key/ is pressed.
+For a complete list of functions, see the <ref id="functions"
+name="reference">.  The special function <tt/noop/ unbinds the specified key
+sequence.
+
+<sect1>Defining aliases for character sets <label id="charset-hook">
+<p>
+Usage: <tt/charset-hook/ <em/alias/ <em/charset/<newline>
+Usage: <tt/iconv-hook/ <em/charset/ <em/local-charset/
+
+The <tt/charset-hook/ command defines an alias for a character set.
+This is useful to properly display messages which are tagged with a
+character set name not known to mutt.
+
+The <tt/iconv-hook/ command defines a system-specific name for a
+character set.  This is helpful when your systems character
+conversion library insists on using strange, system-specific names
+for character sets.
+
+
+<sect1>Setting variables based upon mailbox<label id="folder-hook">
+<p>
+Usage: <tt/folder-hook/ &lsqb;!&rsqb;<em/regexp/ <em/command/
+
+It is often desirable to change settings based on which mailbox you are
+reading.  The folder-hook command provides a method by which you can execute
+any configuration command.  <em/regexp/ is a regular expression specifying
+in which mailboxes to execute <em/command/ before loading.  If a mailbox
+matches multiple folder-hook's, they are executed in the order given in the
+muttrc.
+
+<bf/Note:/ if you use the ``!'' shortcut for <ref id="spoolfile"
+name="&dollar;spoolfile"> at the beginning of the pattern, you must place it
+inside of double or single quotes in order to distinguish it from the
+logical <em/not/ operator for the expression.
+
+Note that the settings are <em/not/ restored when you leave the mailbox.
+For example, a command action to perform is to change the sorting method
+based upon the mailbox being read:
+
+<tscreen><verb>
+folder-hook mutt set sort=threads
+</verb></tscreen>
+
+However, the sorting method is not restored to its previous value when
+reading a different mailbox.  To specify a <em/default/ command, use the
+pattern ``.'':
+
+<p>
+<tscreen><verb>
+folder-hook . set sort=date-sent
+</verb></tscreen>
+
+<sect1>Keyboard macros<label id="macro">
+<p>
+Usage: <tt/macro/ <em/menu/ <em/key/ <em/sequence/ &lsqb; <em/description/ 
&rsqb;
+
+Macros are useful when you would like a single key to perform a series of
+actions.  When you press <em/key/ in menu <em/menu/, Mutt will behave as if
+you had typed <em/sequence/.  So if you have a common sequence of commands
+you type, you can create a macro to execute those commands with a single
+key.
+
+<em/menu/ is the <ref id="maps" name="map"> which the macro will be bound.
+Multiple maps may be specified by separating multiple menu arguments by
+commas. Whitespace may not be used in between the menu arguments and the
+commas separating them.
+
+<em/key/ and <em/sequence/ are expanded by the same rules as the <ref
+id="bind" name="key bindings">.  There are some additions however.  The
+first is that control characters in <em/sequence/ can also be specified
+as <em/&circ;x/.  In order to get a caret (`&circ;'') you need to use
+<em/&circ;&circ;/.  Secondly, to specify a certain key such as <em/up/
+or to invoke a function directly, you can use the format
+<em/&lt;key name&gt;/ and <em/&lt;function name&gt;/.  For a listing of key
+names see the section on <ref id="bind" name="key bindings">.  Functions
+are listed in the <ref id="functions" name="function reference">.
+
+The advantage with using function names directly is that the macros will
+work regardless of the current key bindings, so they are not dependent on
+the user having particular key definitions.  This makes them more robust
+and portable, and also facilitates defining of macros in files used by more
+than one user (eg. the system Muttrc).
+
+Optionally you can specify a descriptive text after <em/sequence/,
+which is shown in the help screens.
+
+<bf/Note:/ Macro definitions (if any) listed in the help screen(s), are
+silently truncated at the screen width, and are not wrapped.   
+
+<sect1>Using color and mono video attributes<label id="color">
+<p>
+Usage: <tt/color/ <em/object/ <em/foreground/ <em/background/ &lsqb; 
<em/regexp/ &rsqb;<newline>
+Usage: <tt/color/ index <em/foreground/ <em/background/ <em/pattern/<newline>
+Usage: <tt/uncolor/ index <em/pattern/ &lsqb; <em/pattern/ ...  &rsqb;<newline>
+
+If your terminal supports color, you can spice up Mutt by creating your own
+color scheme.  To define the color of an object (type of information), you
+must specify both a foreground color <bf/and/ a background color (it is not
+possible to only specify one or the other).
+
+<em/object/ can be one of:
+
+<itemize>
+<item>attachment
+<item>body (match <em/regexp/ in the body of messages)
+<item>bold (hiliting bold patterns in the body of messages)
+<item>error (error messages printed by Mutt)
+<item>header (match <em/regexp/ in the message header)
+<item>hdrdefault (default color of the message header in the pager)
+<item>index (match <em/pattern/ in the message index)
+<item>indicator (arrow or bar used to indicate the current item in a menu)
+<item>markers (the ``+'' markers at the beginning of wrapped lines in the 
pager)
+<item>message (informational messages)
+<item>normal
+<item>quoted (text matching <ref id="quote_regexp"
+name="&dollar;quote&lowbar;regexp"> in the body of a message)
+<item>quoted1, quoted2, ..., quoted<bf/N/ (higher levels of quoting)
+<item>search (hiliting of words in the pager)
+<item>signature
+<item>status (mode lines used to display info about the mailbox or message)
+<item>tilde (the ``&tilde;'' used to pad blank lines in the pager)
+<item>tree (thread tree drawn in the message index and attachment menu)
+<item>underline (hiliting underlined patterns in the body of messages)
+</itemize>
+
+<em/foreground/ and <em/background/ can be one of the following:
+
+<itemize>
+<item>white
+<item>black
+<item>green
+<item>magenta
+<item>blue
+<item>cyan
+<item>yellow
+<item>red
+<item>default
+<item>color<em/x/
+</itemize>
+
+<em/foreground/ can optionally be prefixed with the keyword <tt/bright/ to make
+the foreground color boldfaced (e.g., <tt/brightred/).
+
+If your terminal supports it, the special keyword <em/default/ can be
+used as a transparent color.  The value <em/brightdefault/ is also valid.
+If Mutt is linked against the <em/S-Lang/ library, you also need to set
+the <em/COLORFGBG/ environment variable to the default colors of your
+terminal for this to work; for example (for Bourne-like shells):
+
+<tscreen><verb>
+set COLORFGBG="green;black"
+export COLORFGBG
+</verb></tscreen>
+
+<bf/Note:/ The <em/S-Lang/ library requires you to use the <em/lightgray/
+and <em/brown/ keywords instead of <em/white/ and <em/yellow/ when
+setting this variable.
+
+<bf/Note:/ The uncolor command can be applied to the index object only.  It
+removes entries from the list. You <bf/must/ specify the same pattern
+specified in the color command for it to be removed.  The pattern ``*'' is
+a special token which means to clear the color index list of all entries.
+
+Mutt also recognizes the keywords <em/color0/, <em/color1/, &hellip;,
+<em/color/<bf/N-1/ (<bf/N/ being the number of colors supported
+by your terminal).  This is useful when you remap the colors for your
+display (for example by changing the color associated with <em/color2/
+for your xterm), since color names may then lose their normal meaning.
+
+If your terminal does not support color, it is still possible change the video
+attributes through the use of the ``mono'' command:
+
+Usage: <tt/mono/ <em/&lt;object&gt; &lt;attribute&gt;/ &lsqb; <em/regexp/ 
&rsqb;<newline>
+Usage: <tt/mono/ index <em/attribute/ <em/pattern/<newline>
+Usage: <tt/unmono/ index <em/pattern/ &lsqb; <em/pattern/ ...  &rsqb;<newline>
+
+where <em/attribute/ is one of the following:
+
+<itemize>
+<item>none
+<item>bold
+<item>underline
+<item>reverse
+<item>standout
+</itemize>
+
+<sect1>Ignoring (weeding) unwanted message headers<label id="ignore">
+<p>
+Usage: <tt/&lsqb;un&rsqb;ignore/ <em/pattern/ &lsqb; <em/pattern/ ... &rsqb;
+
+Messages often have many header fields added by automatic processing systems,
+or which may not seem useful to display on the screen.  This command allows
+you to specify header fields which you don't normally want to see.
+
+You do not need to specify the full header field name.  For example,
+``ignore content-'' will ignore all header fields that begin with the pattern
+``content-''. ``ignore *'' will ignore all headers.
+
+To remove a previously added token from the list, use the ``unignore'' command.
+The ``unignore'' command will make Mutt display headers with the given pattern.
+For example, if you do ``ignore x-'' it is possible to ``unignore x-mailer''.
+
+``unignore *'' will remove all tokens from the ignore list.
+
+For example:
+<tscreen><verb>
+# Sven's draconian header weeding
+ignore *
+unignore from date subject to cc
+unignore organization organisation x-mailer: x-newsreader: x-mailing-list:
+unignore posted-to:
+</verb></tscreen>
+
+<sect1>Alternative addresses<label id="alternates">
+<p>
+Usage: <tt/&lsqb;un&rsqb;alternates/ <em/regexp/ &lsqb; <em/regexp/ ... 
&rsqb;<newline>
+
+With various functions, mutt will treat messages differently,
+depending on whether you sent them or whether you received them from
+someone else.  For instance, when replying to a message that you
+sent to a different party, mutt will automatically suggest to send
+the response to the original message's recipients -- responding to
+yourself won't make much sense in many cases.  (See <ref
+id="reply_to" name="&dollar;reply_to">.)
+
+Many users receive e-mail under a number of different addresses. To
+fully use mutt's features here, the program must be able to
+recognize what e-mail addresses you receive mail under. That's the
+purpose of the <tt/alternates/ command: It takes a list of regular
+expressions, each of which can identify an address under which you
+receive e-mail.
+
+To remove a regular expression from this list, use the
+<tt/unalternates/ command.
+
+<sect1>Mailing lists<label id="lists">
+<p>
+Usage: <tt/&lsqb;un&rsqb;lists/ <em/regexp/ &lsqb; <em/regexp/ ... 
&rsqb;<newline>
+Usage: <tt/&lsqb;un&rsqb;subscribe/ <em/regexp/ &lsqb; <em/regexp/ ... &rsqb;
+
+Mutt has a few nice features for <ref id="using_lists" name="handling
+mailing lists">.  In order to take advantage of them, you must
+specify which addresses belong to mailing lists, and which mailing
+lists you are subscribed to.  Once you have done this, the <ref
+id="list-reply" name="list-reply"> function will work for all known lists.
+Additionally, when you send a message to a subscribed list, mutt will
+add a Mail-Followup-To header to tell other users' mail user agents
+not to send copies of replies to your personal address.   Note that
+the Mail-Followup-To header is a non-standard extension which is not
+supported by all mail user agents.  Adding it is not bullet-proof against
+receiving personal CCs of list messages.  Also note that the generation
+of the Mail-Followup-To header is controlled by the <ref id="followup_to"
+name="&dollar;followup_to"> configuration variable.
+
+More precisely, Mutt maintains lists of patterns for the addresses
+of known and subscribed mailing lists.  Every subscribed mailing
+list is known. To mark a mailing list as known, use the ``lists''
+command.  To mark it as subscribed, use ``subscribe''.
+
+You can use regular expressions with both commands.  To mark all
+messages sent to a specific bug report's address on mutt's bug
+tracking system as list mail, for instance, you could say
+``subscribe [0-9]*@bugs.guug.de''.  Often, it's sufficient to just
+give a portion of the list's e-mail address.
+
+Specify as much of the address as you need to to remove ambiguity.  For
+example, if you've subscribed to the Mutt mailing list, you will receive mail
+addresssed to <em/mutt-users@xxxxxxxx/.  So, to tell Mutt that this is a
+mailing list, you could add ``lists mutt-users'' to your
+initialization file.  To tell mutt that you are subscribed to it,
+add ``subscribe mutt-users'' to your initialization file instead.
+If you also happen to get mail from someone whose address is
+<em/mutt-users@xxxxxxxxxxx/, you could use ``lists mutt-users@xxxxxxxx'' 
+or ``subscribe mutt-users@xxxxxxxx'' to
+match only mail from the actual list.
+
+The ``unlists'' command is used to remove a token from the list of
+known and subscribed mailing-lists. Use ``unlists *'' to remove all
+tokens.
+
+To remove a mailing list from the list of subscribed mailing lists,
+but keep it on the list of known mailing lists, use ``unsubscribe''.
+
+<sect1>Using Multiple spool mailboxes<label id="mbox-hook">
+<p>
+Usage: <tt/mbox-hook/ &lsqb;!&rsqb;<em/pattern/ <em/mailbox/
+
+This command is used to move read messages from a specified mailbox to a
+different mailbox automatically when you quit or change folders.
+<em/pattern/ is a regular expression specifying the mailbox to treat as a
+``spool'' mailbox and <em/mailbox/ specifies where mail should be saved when
+read.
+
+Unlike some of the other <em/hook/ commands, only the <em/first/ matching
+pattern is used (it is not possible to save read mail in more than a single
+mailbox).
+
+<sect1>Defining mailboxes which receive mail<label id="mailboxes">
+<p>
+Usage: <tt/&lsqb;un&rsqb;mailboxes/ &lsqb;!&rsqb;<em/filename/ &lsqb; 
<em/filename/ ... &rsqb;
+
+This command specifies folders which can receive mail and
+which will be checked for new messages.  By default, the
+main menu status bar displays how many of these folders have
+new messages.
+<p>
+When changing folders, pressing <em/space/ will cycle
+through folders with new mail.
+<p>
+Pressing TAB in the directory browser will bring up a menu showing the files
+specified by the <tt/mailboxes/ command, and indicate which contain new
+messages.  Mutt will automatically enter this mode when invoked from the
+command line with the <tt/-y/ option.
+
+The ``unmailboxes'' command is used to remove a token from the list
+of folders which receive mail. Use ``unmailboxes *'' to remove all
+tokens.
+
+<p>
+<bf/Note:/ new mail is detected by comparing the last modification time to
+the last access time.  Utilities like <tt/biff/ or <tt/frm/ or any other
+program which accesses the mailbox might cause Mutt to never detect new mail
+for that mailbox if they do not properly reset the access time.  Backup
+tools are another common reason for updated access times.
+<p>
+
+<bf/Note:/ the filenames in the <tt/mailboxes/ command are resolved when
+the command is executed, so if these names contain <ref id="shortcuts"
+name="shortcut characters"> (such as ``='' and ``!''), any variable
+definition that affect these characters (like <ref id="folder"
+name="&dollar;folder"> and <ref id="spoolfile" name="&dollar;spoolfile">)
+should be executed before the <tt/mailboxes/ command.
+
+<sect1>User defined headers<label id="my_hdr">
+<p>
+Usage:<newline>
+<tt/my_hdr/ <em/string/<newline>
+<tt/unmy_hdr/ <em/field/ &lsqb; <em/field/ ... &rsqb;
+
+The ``my&lowbar;hdr'' command allows you to create your own header
+fields which will be added to every message you send.
+
+For example, if you would like to add an ``Organization:'' header field to
+all of your outgoing messages, you can put the command
+
+<quote>
+my_hdr Organization: A Really Big Company, Anytown, USA
+</quote>
+
+in your <tt/.muttrc/.
+
+<bf/Note:/  space characters are <em/not/ allowed between the keyword and
+the colon (``:'').  The standard for electronic mail (RFC822) says that
+space is illegal there, so Mutt enforces the rule.
+
+If you would like to add a header field to a single message, you should
+either set the <ref id="edit_headers" name="edit&lowbar;headers"> variable,
+or use the <em/edit-headers/ function (default: ``E'') in the send-menu so
+that you can edit the header of your message along with the body.
+
+To remove user defined header fields, use the ``unmy&lowbar;hdr''
+command.  You may specify an asterisk (``*'') to remove all header
+fields, or the fields to remove.  For example, to remove all ``To'' and
+``Cc'' header fields, you could use:
+
+<quote>
+unmy_hdr to cc
+</quote>
+
+<sect1>Defining the order of headers when viewing messages<label 
id="hdr_order">
+<p>
+Usage: <tt/hdr&lowbar;order/ <em/header1/ <em/header2/ <em/header3/
+
+With this command, you can specify an order in which mutt will attempt
+to present headers to you when viewing messages.
+
+``unhdr_order *'' will clear all previous headers from the order list,
+thus removing the header order effects set by the system-wide startup
+file.
+
+<tscreen><verb>
+hdr&lowbar;order From Date: From: To: Cc: Subject:
+</verb></tscreen>
+
+<sect1>Specify default save filename<label id="save-hook">
+<p>
+Usage: <tt/save-hook/ &lsqb;!&rsqb;<em/pattern/ <em/filename/
+
+This command is used to override the default filename used when saving
+messages.  <em/filename/ will be used as the default filename if the message is
+<em/From:/ an address matching <em/regexp/ or if you are the author and the
+message is addressed <em/to:/ something matching <em/regexp/.
+
+See <ref id="pattern_hook" name="Message Matching in Hooks"> for information 
on the exact format of <em/pattern/.
+
+Examples:
+
+<tscreen><verb>
+save-hook me@(turing\\.)?cs\\.hmc\\.edu$ +elkins
+save-hook aol\\.com$ +spam
+</verb></tscreen>
+
+Also see the <ref id="fcc-save-hook" name="fcc-save-hook"> command.
+
+<sect1>Specify default Fcc: mailbox when composing<label id="fcc-hook">
+<p>
+Usage: <tt/fcc-hook/ &lsqb;!&rsqb;<em/pattern/ <em/mailbox/
+
+This command is used to save outgoing mail in a mailbox other than
+<ref id="record" name="&dollar;record">.  Mutt searches the initial list of
+message recipients for the first matching <em/regexp/ and uses <em/mailbox/
+as the default Fcc: mailbox.  If no match is found the message will be saved
+to <ref id="record" name="&dollar;record"> mailbox.
+
+See <ref id="pattern_hook" name="Message Matching in Hooks"> for information 
on the exact format of <em/pattern/.
+
+Example: <tt/fcc-hook aol.com&dollar; +spammers/
+
+The above will save a copy of all messages going to the aol.com domain to
+the `+spammers' mailbox by default.  Also see the <ref id="fcc-save-hook" 
+name="fcc-save-hook"> command.
+
+<sect1>Specify default save filename and default Fcc: mailbox at once<label
+id="fcc-save-hook">
+<p>
+Usage: <tt/fcc-save-hook/ &lsqb;!&rsqb;<em/pattern/ <em/mailbox/
+
+This command is a shortcut, equivalent to doing both a <ref id="fcc-hook" 
name="fcc-hook">
+and a <ref id="save-hook" name="save-hook"> with its arguments.
+
+<sect1>Change settings based upon message recipients<label 
id="send-hook"><label id="reply-hook">
+<p>
+Usage: <tt/reply-hook/ &lsqb;!&rsqb;<em/pattern/ <em/command/<newline>
+Usage: <tt/send-hook/ &lsqb;!&rsqb;<em/pattern/ <em/command/
+
+These commands can be used to execute arbitrary configuration commands based
+upon recipients of the message.  <em/pattern/ is a regular expression
+matching the desired address.  <em/command/ is executed when <em/regexp/
+matches recipients of the message.
+
+<tt/reply-hook/ is matched against the message you are <em/replying/
+<bf/to/, instead of the message you are <em/sending/.  <tt/send-hook/ is
+matched against all messages, both <em/new/ and <em/replies/.  <bf/Note:/
+<tt/reply-hook/s are matched <bf/before/ the <tt/send-hook/, <bf/regardless/
+of the order specified in the users's configuration file.
+
+For each type of <tt/send-hook/ or <tt/reply-hook/, When multiple matches
+occur, commands are executed in the order they are specified in the muttrc
+(for that type of hook).
+
+See <ref id="pattern_hook" name="Message Matching in Hooks"> for information 
on the exact format of <em/pattern/.
+
+Example: <tt/send-hook mutt &dquot;set mime&lowbar;forward signature=''&dquot;/
+
+Another typical use for this command is to change the values of the
+<ref id="attribution" name="&dollar;attribution">, <ref id="signature"
+name="&dollar;signature"> and <ref id="locale" name="&dollar;locale">
+variables in order to change the language of the attributions and
+signatures based upon the recipients.
+
+<bf/Note:/ the send-hook's are only executed ONCE after getting the initial
+list of recipients.  Adding a recipient after replying or editing the
+message will NOT cause any send-hook to be executed.  Also note that
+my_hdr commands which modify recipient headers, or the message's
+subject, don't have any effect on the current message when executed
+from a send-hook.
+
+<sect1>Change settings before formatting a message<label id="message-hook">
+<p>
+Usage: <tt/message-hook/ &lsqb;!&rsqb;<em/pattern/ <em/command/
+
+This command can be used to execute arbitrary configuration commands
+before viewing or formatting a message based upon information about the 
message.
+<em/command/ is executed if the <em/pattern/ matches the message to be
+displayed. When multiple matches occur, commands are executed in the order
+they are specified in the muttrc.
+
+See <ref id="pattern_hook" name="Message Matching in Hooks"> for
+information on the exact format of <em/pattern/.
+
+Example:
+<tscreen><verb>
+message-hook ~A 'set pager=builtin'
+message-hook '~f freshmeat-news' 'set pager="less \"+/^  subject: .*\""'
+</verb></tscreen>
+
+<sect1>Choosing the cryptographic key of the recipient<label id="crypt-hook">
+<p>
+Usage: <tt/crypt-hook/ <em/pattern/ <em/keyid/
+
+When encrypting messages with PGP or OpenSSL, you may want to associate a 
certain
+key with a given e-mail address automatically, either because the
+recipient's public key can't be deduced from the destination address,
+or because, for some reasons, you need to override the key Mutt would
+normally use.  The crypt-hook command provides a method by which you can
+specify the ID of the public key to be used when encrypting messages to
+a certain recipient.
+
+The meaning of "key id" is to be taken broadly in this context:  You
+can either put a numerical key ID here, an e-mail address, or even
+just a real name.
+
+<sect1>Adding key sequences to the keyboard buffer<label id="push">
+<p>
+Usage: <tt/push/ <em/string/
+
+This command adds the named string to the keyboard buffer. The string may
+contain control characters, key names and function names like the sequence
+string in the <ref id="macro" name="macro"> command. You may use it to
+automatically run a sequence of commands at startup, or when entering
+certain folders.
+
+<sect1>Executing functions<label id="exec">
+<p>
+Usage: <tt/exec/ <em/function/ &lsqb; <em/function/ ... &rsqb;
+
+This command can be used to execute any function. Functions are
+listed in the <ref id="functions" name="function reference">.
+``exec function'' is equivalent to ``push &lt;function&gt;''.
+
+<sect1>Message Scoring<label id="score-command">
+<p>
+Usage: <tt/score/ <em/pattern/ <em/value/<newline>
+Usage: <tt/unscore/ <em/pattern/ &lsqb; <em/pattern/ ... &rsqb;
+
+The <tt/score/ commands adds <em/value/ to a message's score if <em/pattern/
+matches it.  <em/pattern/ is a string in the format described in the <ref
+id="patterns" name="patterns"> section (note: For efficiency reasons, patterns
+which scan information not available in the index, such as <tt>&tilde;b</tt>,
+<tt>&tilde;B</tt> or <tt>&tilde;h</tt>, may not be used).  <em/value/ is a
+positive or negative integer.  A message's final score is the sum total of all
+matching <tt/score/ entries.  However, you may optionally prefix <em/value/ 
with
+an equal sign (=) to cause evaluation to stop at a particular entry if there is
+a match.  Negative final scores are rounded up to 0.
+
+The <tt/unscore/ command removes score entries from the list.  You <bf/must/
+specify the same pattern specified in the <tt/score/ command for it to be
+removed.  The pattern ``*'' is a special token which means to clear the list
+of all score entries.
+
+<sect1>Spam detection<label id="spam">
+<p>
+Usage: <tt/spam/ <em/pattern/ <em/format/<newline>
+Usage: <tt/nospam/ <em/pattern/
+
+Mutt has generalized support for external spam-scoring filters.
+By defining your spam patterns with the <tt/spam/ and <tt/nospam/
+commands, you can <em/limit/, <em/search/, and <em/sort/ your
+mail based on its spam attributes, as determined by the external
+filter. You also can display the spam attributes in your index
+display using the <tt/%H/ selector in the <ref id="index_format"
+name="&dollar;index&lowbar;format"> variable. (Tip: try <tt/%?H?[%H] ?/
+to display spam tags only when they are defined for a given message.)
+
+Your first step is to define your external filter's spam patterns using
+the <tt/spam/ command. <em/pattern/ should be a regular expression
+that matches a header in a mail message. If any message in the mailbox
+matches this regular expression, it will receive a ``spam tag'' or
+``spam attribute'' (unless it also matches a <tt/nospam/ pattern -- see
+below.) The appearance of this attribute is entirely up to you, and is
+governed by the <em/format/ parameter. <em/format/ can be any static
+text, but it also can include back-references from the <em/pattern/
+expression. (A regular expression ``back-reference'' refers to a
+sub-expression contained within parentheses.) <tt/%1/ is replaced with
+the first back-reference in the regex, <tt/%2/ with the second, etc.
+
+If you're using multiple spam filters, a message can have more than
+one spam-related header. You can define <tt/spam/ patterns for each
+filter you use. If a message matches two or more of these patterns, and
+the &dollar;spam&lowbar;separator variable is set to a string, then the
+message's spam tag will consist of all the <em/format/ strings joined
+together, with the value of &dollar;spam&lowbar;separator separating
+them.
+
+For example, suppose I use DCC, SpamAssassin, and PureMessage. I might
+define these spam settings:
+<tscreen><verb>
+spam "X-DCC-.*-Metrics:.*(....)=many"         "90+/DCC-%1"
+spam "X-Spam-Status: Yes"                     "90+/SA"
+spam "X-PerlMX-Spam: .*Probability=([0-9]+)%" "%1/PM"
+set spam_separator=", "
+</verb></tscreen>
+
+If I then received a message that DCC registered with ``many'' hits
+under the ``Fuz2'' checksum, and that PureMessage registered with a
+97% probability of being spam, that message's spam tag would read
+<tt>90+/DCC-Fuz2, 97/PM</tt>. (The four characters before ``=many'' in a
+DCC report indicate the checksum used -- in this case, ``Fuz2''.)
+
+If the &dollar;spam&lowbar;separator variable is unset, then each
+spam pattern match supercedes the previous one. Instead of getting
+joined <em/format/ strings, you'll get only the last one to match.
+
+The spam tag is what will be displayed in the index when you use
+<tt/%H/ in the <tt/&dollar;index&lowbar;format/ variable. It's also the
+string that the <tt/~H/ pattern-matching expression matches against for
+<em/search/ and <em/limit/ functions. And it's what sorting by spam
+attribute will use as a sort key.
+
+That's a pretty complicated example, and most people's actual
+environments will have only one spam filter. The simpler your
+configuration, the more effective mutt can be, especially when it comes
+to sorting.
+
+Generally, when you sort by spam tag, mutt will sort <em/lexically/ --
+that is, by ordering strings alphnumerically. However, if a spam tag
+begins with a number, mutt will sort numerically first, and lexically
+only when two numbers are equal in value. (This is like UNIX's
+<tt/sort -n/.) A message with no spam attributes at all -- that is, one
+that didn't match <em/any/ of your <tt/spam/ patterns -- is sorted at
+lowest priority. Numbers are sorted next, beginning with 0 and ranging
+upward. Finally, non-numeric strings are sorted, with ``a'' taking lower
+priority than ``z''. Clearly, in general, sorting by spam tags is most
+effective when you can coerce your filter to give you a raw number. But
+in case you can't, mutt can still do something useful.
+
+The <tt/nospam/ command can be used to write exceptions to <tt/spam/
+patterns. If a header pattern matches something in a <tt/spam/ command,
+but you nonetheless do not want it to receive a spam tag, you can list a
+more precise pattern under a <tt/nospam/ command.
+
+If the <em/pattern/ given to <tt/nospam/ is exactly the same as the
+<em/pattern/ on an existing <tt/spam/ list entry, the effect will be to
+remove the entry from the spam list, instead of adding an exception.
+Likewise, if the <em/pattern/ for a <tt/spam/ command matches an entry
+on the <tt/nospam/ list, that <tt/nospam/ entry will be removed. If the
+<em/pattern/ for <tt/nospam/ is ``*'', <em/all entries on both lists/
+will be removed. This might be the default action if you use <tt/spam/
+and <tt/nospam/ in conjunction with a <tt/folder-hook/.
+
+You can have as many <tt/spam/ or <tt/nospam/ commands as you like.
+You can even do your own primitive spam detection within mutt -- for
+example, if you consider all mail from <tt/MAILER-DAEMON/ to be spam,
+you can use a <tt/spam/ command like this:
+
+<tscreen><verb>
+spam "^From: .*MAILER-DAEMON"       "999"
+</verb></tscreen>
+
+
+<sect1>Setting variables<label id="set">
+<p>
+Usage: <tt/set/ &lsqb;no|inv&rsqb;<em/variable/&lsqb;=<em/value/&rsqb; &lsqb; 
<em/variable/ ... &rsqb;<newline>
+Usage: <tt/toggle/ <em/variable/ &lsqb;<em/variable/ ... &rsqb;<newline>
+Usage: <tt/unset/ <em/variable/ &lsqb;<em/variable/ ... &rsqb;<newline>
+Usage: <tt/reset/ <em/variable/ &lsqb;<em/variable/ ... &rsqb;
+
+This command is used to set (and unset) <ref id="variables"
+name="configuration variables">.  There are four basic types of variables:
+boolean, number, string and quadoption.  <em/boolean/ variables can be
+<em/set/ (true) or <em/unset/ (false).  <em/number/ variables can be
+assigned a positive integer value.
+
+<em/string/ variables consist of any number of printable characters.
+<em/strings/ must be enclosed in quotes if they contain spaces or tabs.  You
+may also use the ``C'' escape sequences <bf/&bsol;n/ and <bf/&bsol;t/ for
+newline and tab, respectively.
+
+<em/quadoption/ variables are used to control whether or not to be prompted
+for certain actions, or to specify a default action.  A value of <em/yes/
+will cause the action to be carried out automatically as if you had answered
+yes to the question.  Similarly, a value of <em/no/ will cause the the
+action to be carried out as if you had answered ``no.''  A value of
+<em/ask-yes/ will cause a prompt with a default answer of ``yes'' and
+<em/ask-no/ will provide a default answer of ``no.''
+
+Prefixing a variable with ``no'' will unset it.  Example: <tt/set noaskbcc/.
+
+For <em/boolean/ variables, you may optionally prefix the variable name with
+<tt/inv/ to toggle the value (on or off).  This is useful when writing
+macros.  Example: <tt/set invsmart&lowbar;wrap/.
+
+The <tt/toggle/ command automatically prepends the <tt/inv/ prefix to all
+specified variables.
+
+The <tt/unset/ command automatically prepends the <tt/no/ prefix to all
+specified variables.
+
+Using the enter-command function in the <em/index/ menu, you can query the
+value of a variable by prefixing the name of the variable with a question
+mark:
+
+<tscreen><verb>
+set ?allow_8bit
+</verb></tscreen>
+
+The question mark is actually only required for boolean and quadoption 
+variables.
+
+The <tt/reset/ command resets all given variables to the compile time
+defaults (hopefully mentioned in this manual). If you use the command
+<tt/set/ and prefix the variable with ``&amp;'' this has the same
+behavior as the reset command.
+
+With the <tt/reset/ command there exists the special variable ``all'',
+which allows you to reset all variables to their system defaults.
+
+<sect1>Reading initialization commands from another file<label id="source">
+<p>
+Usage: <tt/source/ <em/filename/
+
+This command allows the inclusion of initialization commands
+from other files.  For example, I place all of my aliases in
+<tt>&tilde;/.mail&lowbar;aliases</tt> so that I can make my
+<tt>&tilde;/.muttrc</tt> readable and keep my aliases private.
+
+If the filename begins with a tilde (``&tilde;''), it will be expanded to the
+path of your home directory.
+
+If the filename ends with a vertical bar (|), then <em/filename/ is
+considered to be an executable program from which to read input (eg.
+<tt>source ~/bin/myscript|</tt>).
+
+<sect1>Removing hooks<label id="unhook">
+<p>
+Usage: <tt/unhook/ &lsqb; * | <em/hook-type/ &rsqb;
+
+This command permits you to flush hooks you have previously defined.
+You can either remove all hooks by giving the ``*'' character as an
+argument, or you can remove all hooks of a specific type by saying
+something like <tt/unhook send-hook/.
+
+<sect>Advanced Usage
+
+<sect1>Regular Expressions<label id="regexp">
+<p>
+All string patterns in Mutt including those in more complex
+<ref id="patterns" name="patterns"> must be specified
+using regular expressions (regexp) in the ``POSIX extended'' syntax (which
+is more or less the syntax used by egrep and GNU awk).  For your
+convenience, we have included below a brief description of this syntax.
+
+The search is case sensitive if the pattern contains at least one upper
+case letter, and case insensitive otherwise. Note that ``&bsol;''
+must be quoted if used for a regular expression in an initialization
+command: ``&bsol;&bsol;''.
+
+A regular expression is a pattern that describes a set of strings.
+Regular expressions are constructed analogously to arithmetic
+expressions, by using various operators to combine smaller expressions.
+
+Note that the regular expression can be enclosed/delimited by either &dquot;
+or ' which is useful if the regular expression includes a white-space
+character.  See <ref id="muttrc-syntax" name="Syntax of Initialization Files">
+for more information on &dquot; and ' delimiter processing.  To match a
+literal &dquot; or ' you must preface it with \ (backslash).
+
+The fundamental building blocks are the regular expressions that match
+a single character.  Most characters, including all letters and digits,
+are regular expressions that match themselves.  Any metacharacter with
+special meaning may be quoted by preceding it with a backslash.
+
+The period ``.'' matches any single character.  The caret ``&circ;'' and
+the dollar sign ``&dollar'' are metacharacters that respectively match
+the empty string at the beginning and end of a line.
+
+A list of characters enclosed by ``&lsqb;'' and ``&rsqb;'' matches any
+single character in that list; if the first character of the list
+is a caret ``&circ;'' then it matches any character <bf/not/ in the
+list.  For example, the regular expression <bf/&lsqb;0123456789&rsqb;/
+matches any single digit.  A range of ASCII characters may be specified
+by giving the first and last characters, separated by a hyphen
+``&hyphen;''.  Most metacharacters lose their special meaning inside
+lists.  To include a literal ``&rsqb;'' place it first in the list.
+Similarly, to include a literal ``&circ;'' place it anywhere but first.
+Finally, to include a literal hyphen ``&hyphen;'' place it last.
+
+Certain named classes of characters are predefined.  Character classes
+consist of ``&lsqb;:'', a keyword denoting the class, and ``:&rsqb;''.
+The following classes are defined by the POSIX standard:
+
+<descrip>
+<tag/&lsqb;:alnum:&rsqb;/
+Alphanumeric characters.
+<tag/&lsqb;:alpha:&rsqb;/
+Alphabetic characters.
+<tag/&lsqb;:blank:&rsqb;/
+Space or tab characters.
+<tag/&lsqb;:cntrl:&rsqb;/
+Control characters.
+<tag/&lsqb;:digit:&rsqb;/
+Numeric characters.
+<tag/&lsqb;:graph:&rsqb;/
+Characters that are both printable and visible.  (A space is printable,
+but not visible, while an ``a'' is both.)
+<tag/&lsqb;:lower:&rsqb;/
+Lower-case alphabetic characters.
+<tag/&lsqb;:print:&rsqb;/
+Printable characters (characters that are not control characters.)
+<tag/&lsqb;:punct:&rsqb;/
+Punctuation characters (characters that are not letter, digits, control
+characters, or space characters).
+<tag/&lsqb;:space:&rsqb;/
+Space characters (such as space, tab and formfeed, to name a few).
+<tag/&lsqb;:upper:&rsqb;/
+Upper-case alphabetic characters.
+<tag/&lsqb;:xdigit:&rsqb;/
+Characters that are hexadecimal digits.
+</descrip>
+
+A character class is only valid in a regular expression inside the
+brackets of a character list.  Note that the brackets in these
+class names are part of the symbolic names, and must be included
+in addition to the brackets delimiting the bracket list.  For
+example, <bf/&lsqb;&lsqb;:digit:&rsqb;&rsqb;/ is equivalent to
+<bf/&lsqb;0-9&rsqb;/.
+
+Two additional special sequences can appear in character lists.  These
+apply to non-ASCII character sets, which can have single symbols (called
+collating elements) that are represented with more than one character,
+as well as several characters that are equivalent for collating or
+sorting purposes:
+
+<descrip>
+<tag/Collating Symbols/
+A collating symbol is a multi-character collating element enclosed in
+``&lsqb;.'' and ``.&rsqb;''.  For example, if ``ch'' is a collating
+element, then <bf/&lsqb;&lsqb;.ch.&rsqb;&rsqb;/ is a regexp that matches
+this collating element, while <bf/&lsqb;ch&rsqb;/ is a regexp that
+matches either ``c'' or ``h''.
+<tag/Equivalence Classes/
+An equivalence class is a locale-specific name for a list of
+characters that are equivalent. The name is enclosed in ``&lsqb;=''
+and ``=&rsqb;''.  For example, the name ``e'' might be used to
+represent all of ``&egrave;'' ``&eacute;'' and ``e''.  In this case,
+<bf/&lsqb;&lsqb;=e=&rsqb;&rsqb;/ is a regexp that matches any of
+``&egrave;'', ``&eacute;'' and ``e''.
+</descrip>
+
+A regular expression matching a single character may be followed by one
+of several repetition operators:
+
+<descrip>
+<tag/?/
+The preceding item is optional and matched at most once.
+<tag/*/
+The preceding item will be matched zero or more times.
+<tag/+/
+The preceding item will be matched one or more times.
+<tag/&lcub;n&rcub;/
+The preceding item is matched exactly <em/n/ times.
+<tag/&lcub;n,&rcub;/
+The preceding item is matched <em/n/ or more times.
+<tag/&lcub;,m&rcub;/
+The preceding item is matched at most <em/m/ times.
+<tag/&lcub;n,m&rcub;/
+The preceding item is matched at least <em/n/ times, but no more than
+<em/m/ times.
+</descrip>
+
+Two regular expressions may be concatenated; the resulting regular
+expression matches any string formed by concatenating two substrings
+that respectively match the concatenated subexpressions.
+
+Two regular expressions may be joined by the infix operator ``|'';
+the resulting regular expression matches any string matching either
+subexpression.
+
+Repetition takes precedence over concatenation, which in turn takes
+precedence over alternation.  A whole subexpression may be enclosed in
+parentheses to override these precedence rules.
+
+<bf/Note:/ If you compile Mutt with the GNU <em/rx/ package, the
+following operators may also be used in regular expressions:
+
+<descrip>
+<tag/&bsol;&bsol;y/
+Matches the empty string at either the beginning or the end of a word.
+<tag/&bsol;&bsol;B/
+Matches the empty string within a word.
+<tag/&bsol;&bsol;&lt;/
+Matches the empty string at the beginning of a word.
+<tag/&bsol;&bsol;&gt;/
+Matches the empty string at the end of a word.
+<tag/&bsol;&bsol;w/
+Matches any word-constituent character (letter, digit, or underscore).
+<tag/&bsol;&bsol;W/
+Matches any character that is not word-constituent.
+<tag/&bsol;&bsol;`/
+Matches the empty string at the beginning of a buffer (string).
+<tag/&bsol;&bsol;'/
+Matches the empty string at the end of a buffer.
+</descrip>
+
+Please note however that these operators are not defined by POSIX, so
+they may or may not be available in stock libraries on various systems.
+
+<sect1>Patterns<label id="patterns">
+<p>
+Many of Mutt's commands allow you to specify a pattern to match
+(limit, tag-pattern, delete-pattern, etc.).  There are several ways to select
+messages:
+
+<tscreen><verb>
+~A              all messages
+~b EXPR         messages which contain EXPR in the message body
+~B EXPR         messages which contain EXPR in the whole message
+~c USER         messages carbon-copied to USER
+~C EXPR         message is either to: or cc: EXPR
+~D              deleted messages
+~d [MIN]-[MAX]  messages with ``date-sent'' in a Date range
+~E              expired messages
+~e EXPR         message which contains EXPR in the ``Sender'' field
+~F              flagged messages
+~f USER         messages originating from USER
+~g              cryptographically signed messages
+~G              cryptographically encrypted messages
+~H EXPR         messages with a spam attribute matching EXPR
+~h EXPR         messages which contain EXPR in the message header
+~k             message contains PGP key material
+~i ID           message which match ID in the ``Message-ID'' field
+~L EXPR         message is either originated or received by EXPR
+~l              message is addressed to a known mailing list
+~m [MIN]-[MAX]  message in the range MIN to MAX *)
+~n [MIN]-[MAX]  messages with a score in the range MIN to MAX *)
+~N              new messages
+~O              old messages
+~p              message is addressed to you (consults alternates)
+~P              message is from you (consults alternates)
+~Q              messages which have been replied to
+~R              read messages
+~r [MIN]-[MAX]  messages with ``date-received'' in a Date range
+~S              superseded messages
+~s SUBJECT      messages having SUBJECT in the ``Subject'' field.
+~T              tagged messages
+~t USER         messages addressed to USER
+~U              unread messages
+~v             message is part of a collapsed thread.
+~V             cryptographically verified messages
+~x EXPR         messages which contain EXPR in the `References' field
+~y EXPR         messages which contain EXPR in the `X-Label' field
+~z [MIN]-[MAX]  messages with a size in the range MIN to MAX *)
+~=             duplicated messages (see $duplicate_threads)
+~$             unreferenced messages (requires threaded view)
+</verb></tscreen>
+
+Where EXPR, USER, ID, and SUBJECT are 
+<ref id="regexp" name="regular expressions">.  Special attention has to be
+made when using regular expressions inside of patterns.  Specifically,
+Mutt's parser for these patterns will strip one level of backslash (\),
+which is normally used for quoting.  If it is your intention to use a
+backslash in the regular expression, you will need to use two backslashes
+instead (\\).
+
+*) The forms <tt/&lt;&lsqb;MAX&rsqb;/, <tt/&gt;&lsqb;MIN&rsqb;/,
+<tt/&lsqb;MIN&rsqb;-/ and <tt/-&lsqb;MAX&rsqb;/
+are allowed, too.
+
+<sect2>Pattern Modifier
+<p>
+
+Note that patterns matching 'lists' of addresses (notably c,C,p,P and t)
+match if there is at least one match in the whole list. If you want to
+make sure that all elements of that list match, you need to prefix your
+pattern with ^.
+This example matches all mails which only has recipients from Germany.
+
+<tscreen><verb>
+^~C \.de$
+</verb></tscreen>
+
+<sect2>Complex Patterns
+<p>
+
+Logical AND is performed by specifying more than one criterion.  For
+example:
+
+<tscreen><verb>
+~t mutt ~f elkins
+</verb></tscreen>
+
+would select messages which contain the word ``mutt'' in the list of
+recipients <bf/and/ that have the word ``elkins'' in the ``From'' header
+field.
+
+Mutt also recognizes the following operators to create more complex search
+patterns:
+
+<itemize>
+<item>! -- logical NOT operator
+<item>| -- logical OR operator
+<item>() -- logical grouping operator
+</itemize>
+
+Here is an example illustrating a complex search pattern.  This pattern will
+select all messages which do not contain ``mutt'' in the ``To'' or ``Cc''
+field and which are from ``elkins''.
+
+<tscreen><verb>
+!(~t mutt|~c mutt) ~f elkins
+</verb></tscreen>
+
+Here is an example using white space in the regular expression (note
+the ' and &dquot; delimiters).  For this to match, the mail's subject must
+match the ``^Junk +From +Me$'' and it must be from either ``Jim +Somebody''
+or ``Ed +SomeoneElse'':
+
+<tscreen><verb>
+ '~s "^Junk +From +Me$" ~f ("Jim +Somebody"|"Ed +SomeoneElse")'
+</verb></tscreen>
+
+Note that if a regular expression contains parenthesis, or a veritical bar
+("|"), you <bf/must/ enclose the expression in double or single quotes since
+those characters are also used to separate different parts of Mutt's
+pattern language.  For example,
+
+<tscreen><verb>
+~f "me@(mutt\.org|cs\.hmc\.edu)"
+</verb></tscreen>
+
+Without the quotes, the parenthesis wouldn't end.
+This would be seperated to two OR'd patterns: <em/&tilde;f me@(mutt\.org/
+and <em/cs\.hmc\.edu)/. They are never what you want.
+
+<sect2>Searching by Date
+<p>
+Mutt supports two types of dates, <em/absolute/ and <em/relative/.
+
+<bf/Absolute/.  Dates <bf/must/ be in DD/MM/YY format (month and year are
+optional, defaulting to the current month and year).  An example of a valid
+range of dates is:
+
+<tscreen><verb>
+Limit to messages matching: ~d 20/1/95-31/10
+</verb></tscreen>
+
+If you omit the minimum (first) date, and just specify ``-DD/MM/YY'', all
+messages <em/before/ the given date will be selected.  If you omit the maximum
+(second) date, and specify ``DD/MM/YY-'', all messages <em/after/ the given
+date will be selected.  If you specify a single date with no dash (``-''),
+only messages sent on the given date will be selected. 
+
+<bf/Error Margins/.  You can add error margins to absolute dates.
+An error margin is a sign (+ or -), followed by a digit, followed by
+one of the following units:
+<verb>
+y      years
+m      months
+w      weeks
+d      days
+</verb>
+As a special case, you can replace the sign by a ``*'' character,
+which is equivalent to giving identical plus and minus error margins.
+
+Example: To select any messages two weeks around January 15, 2001,
+you'd use the following pattern: 
+<tscreen><verb> 
+Limit to messages matching: ~d 15/1/2001*2w
+</verb></tscreen>
+
+
+<bf/Relative/.  This type of date is relative to the current date, and may
+be specified as:
+<itemize>
+<item>&gt;<em/offset/ (messages older than <em/offset/ units)
+<item>&lt;<em/offset/ (messages newer than <em/offset/ units)
+<item>=<em/offset/ (messages exactly <em/offset/ units old)
+</itemize>
+
+<em/offset/ is specified as a positive number with one of the following
+units:
+<verb>
+y       years
+m       months
+w       weeks
+d       days
+</verb>
+
+Example: to select messages less than 1 month old, you would use
+<tscreen><verb>
+Limit to messages matching: ~d <1m
+</verb></tscreen>
+
+
+
+<bf/Note:/ all dates used when searching are relative to the
+<bf/local/ time zone, so unless you change the setting of your <ref
+id="index_format" name="&dollar;index&lowbar;format"> to include a
+<tt/&percnt;&lsqb;...&rsqb;/ format, these are <bf/not/ the dates shown
+in the main index.
+
+<sect1>Using Tags
+<p>
+
+Sometimes it is desirable to perform an operation on a group of
+messages all at once rather than one at a time.  An example might be
+to save messages to a mailing list to a separate folder, or to
+delete all messages with a given subject.  To tag all messages
+matching a pattern, use the tag-pattern function, which is bound to
+``shift-T'' by default.  Or you can select individual messages by
+hand using the ``tag-message'' function, which is bound to ``t'' by
+default.  See <ref id="patterns" name="patterns"> for Mutt's pattern
+matching syntax.
+
+Once you have tagged the desired messages, you can use the
+``tag-prefix'' operator, which is the ``;'' (semicolon) key by default.
+When the ``tag-prefix'' operator is used, the <bf/next/ operation will
+be applied to all tagged messages if that operation can be used in that
+manner.  If the <ref id="auto_tag" name="&dollar;auto&lowbar;tag">
+variable is set, the next operation applies to the tagged messages
+automatically, without requiring the ``tag-prefix''.
+
+<sect1>Using Hooks<label id="hooks">
+<p>
+A <em/hook/ is a concept borrowed from the EMACS editor which allows you to
+execute arbitrary commands before performing some operation.  For example,
+you may wish to tailor your configuration based upon which mailbox you are
+reading, or to whom you are sending mail.  In the Mutt world, a <em/hook/
+consists of a <ref id="regexp" name="regular expression"> or
+<ref id="patterns" name="pattern"> along with a
+configuration option/command.  See
+<itemize>
+<item><ref id="folder-hook" name="folder-hook">
+<item><ref id="send-hook" name="send-hook">
+<item><ref id="message-hook" name="message-hook">
+<item><ref id="save-hook" name="save-hook">
+<item><ref id="mbox-hook" name="mbox-hook">
+<item><ref id="fcc-hook" name="fcc-hook">
+<item><ref id="fcc-save-hook" name="fcc-save-hook">
+</itemize>
+for specific details on each type of <em/hook/ available.
+
+<bf/Note:/ if a hook changes configuration settings, these changes remain
+effective until the end of the current mutt session. As this is generally
+not desired, a default hook needs to be added before all other hooks to
+restore configuration defaults. Here is an example with send-hook and the
+my_hdr directive:
+
+<tscreen><verb>
+send-hook . 'unmy_hdr From:'
+send-hook ~Cb@xxx my_hdr from: c@xxx
+</verb></tscreen>
+
+<sect2>Message Matching in Hooks<label id="pattern_hook">
+<p>
+Hooks that act upon messages (<tt/send-hook, save-hook, fcc-hook,
+message-hook/) are evaluated in a slightly different manner.  For the other
+types of hooks, a <ref id="regexp" name="regular expression"> is
+sufficient.  But in dealing with messages a finer grain of control is
+needed for matching since for different purposes you want to match
+different criteria.
+
+Mutt allows the use of the <ref id="patterns" name="search pattern">
+language for matching messages in hook commands.  This works in
+exactly the same way as it would when <em/limiting/ or
+<em/searching/ the mailbox, except that you are restricted to those
+operators which match information mutt extracts from the header of
+the message (i.e.  from, to, cc, date, subject, etc.).
+
+For example, if you wanted to set your return address based upon sending
+mail to a specific address, you could do something like:
+<tscreen><verb>
+send-hook '~t ^me@cs\.hmc\.edu$' 'my_hdr From: Mutt User <user@host>'
+</verb></tscreen>
+which would execute the given command when sending mail to
+<em/me@xxxxxxxxxx/.
+
+However, it is not required that you write the pattern to match using the
+full searching language.  You can still specify a simple <em/regular
+expression/ like the other hooks, in which case Mutt will translate your
+pattern into the full language, using the translation specified by the 
+<ref id="default_hook" name="&dollar;default&lowbar;hook"> variable.  The
+pattern is translated at the time the hook is declared, so the value of 
+<ref id="default_hook" name="&dollar;default&lowbar;hook"> that is in effect
+at that time will be used.
+
+<sect1>External Address Queries<label id="query">
+<p>
+Mutt supports connecting to external directory databases such as LDAP,
+ph/qi, bbdb, or NIS through a wrapper script which connects to mutt
+using a simple interface.  Using the <ref id="query_command"
+name="&dollar;query&lowbar;command"> variable, you specify the wrapper
+command to use.  For example:
+
+<tscreen><verb>
+set query_command = "mutt_ldap_query.pl '%s'"
+</verb></tscreen>
+
+The wrapper script should accept the query on the command-line.  It
+should return a one line message, then each matching response on a
+single line, each line containing a tab separated address then name then
+some other optional information.  On error, or if there are no matching
+addresses, return a non-zero exit code and a one line error message.
+
+An example multiple response output:
+<tscreen><verb>
+Searching database ... 20 entries ... 3 matching:
+me@xxxxxxxxxx           Michael Elkins  mutt dude
+blong@xxxxxxxxxxx       Brandon Long    mutt and more
+roessler@xxxxxxx        Thomas Roessler mutt pgp
+</verb></tscreen>
+
+There are two mechanisms for accessing the query function of mutt.  One
+is to do a query from the index menu using the query function (default: Q).
+This will prompt for a query, then bring up the query menu which will
+list the matching responses.  From the query menu, you can select
+addresses to create aliases, or to mail.  You can tag multiple addresses
+to mail, start a new query, or have a new query appended to the current
+responses.
+
+The other mechanism for accessing the query function is for address
+completion, similar to the alias completion.  In any prompt for address
+entry, you can use the complete-query function (default: ^T) to run a
+query based on the current address you have typed.  Like aliases, mutt
+will look for what you have typed back to the last space or comma.  If
+there is a single response for that query, mutt will expand the address
+in place.  If there are multiple responses, mutt will activate the query
+menu.  At the query menu, you can select one or more addresses to be
+added to the prompt.
+
+<sect1>Mailbox Formats
+<p>
+Mutt supports reading and writing of four different mailbox formats:
+mbox, MMDF, MH and Maildir.  The mailbox type is autodetected, so there
+is no need to use a flag for different mailbox types.  When creating new
+mailboxes, Mutt uses the default specified with the <ref id="mbox_type"
+name="&dollar;mbox&lowbar;type"> variable.
+
+<bf/mbox/.  This is the most widely used mailbox format for UNIX.  All
+messages are stored in a single file.  Each message has a line of the form:
+
+<tscreen><verb>
+From me@xxxxxxxxxx Fri, 11 Apr 1997 11:44:56 PST
+</verb></tscreen>
+
+to denote the start of a new message (this is often referred to as the
+``From&lowbar;'' line).
+
+<bf/MMDF/.  This is a variant of the <em/mbox/ format.  Each message is
+surrounded by lines containing ``^A^A^A^A'' (four control-A's).
+
+<bf/MH/. A radical departure from <em/mbox/ and <em/MMDF/, a mailbox
+consists of a directory and each message is stored in a separate file.
+The filename indicates the message number (however, this is may not
+correspond to the message number Mutt displays). Deleted messages are
+renamed with a comma (,) prepended to the filename. <bf/Note:/ Mutt
+detects this type of mailbox by looking for either <tt/.mh&lowbar;sequences/
+or <tt/.xmhcache/ (needed to distinguish normal directories from MH
+mailboxes).
+
+<bf/Maildir/.  The newest of the mailbox formats, used by the Qmail MTA (a
+replacement for sendmail).  Similar to <em/MH/, except that it adds three
+subdirectories of the mailbox: <em/tmp/, <em/new/ and <em/cur/.  Filenames
+for the messages are chosen in such a way they are unique, even when two
+programs are writing the mailbox over NFS, which means that no file locking
+is needed.
+
+<sect1>Mailbox Shortcuts<label id="shortcuts">
+<p>
+There are a number of built in shortcuts which refer to specific mailboxes.
+These shortcuts can be used anywhere you are prompted for a file or mailbox
+path.
+
+<itemize>
+<item>! -- refers to your <ref id="spoolfile" name="&dollar;spoolfile"> 
(incoming) mailbox
+<item>&gt; -- refers to your <ref id="mbox" name="&dollar;mbox"> file
+<item>&lt; -- refers to your <ref id="record" name="&dollar;record"> file
+<item>- or !! -- refers to the file you've last visited
+<item>&tilde; -- refers to your home directory
+<item>= or + -- refers to your <ref id="folder" name="&dollar;folder"> 
directory
+<item>@<em/alias/ -- refers to the <ref id="save-hook" 
+name="default save folder"> as determined by the address of the alias
+</itemize>
+
+<sect1>Handling Mailing Lists<label id="using_lists">
+<p>
+
+Mutt has a few configuration options that make dealing with large
+amounts of mail easier.  The first thing you must do is to let Mutt
+know what addresses you consider to be mailing lists (technically
+this does not have to be a mailing list, but that is what it is most
+often used for), and what lists you are subscribed to.  This is
+accomplished through the use of the <ref id="lists"
+name="lists and subscribe"> commands in your muttrc.
+
+Now that Mutt knows what your mailing lists are, it can do several
+things, the first of which is the ability to show the name of a list
+through which you received a message (i.e., of a subscribed list) in
+the <em/index/ menu display.  This is useful to distinguish between
+personal and list mail in the same mailbox.  In the <ref id="index_format"
+name="&dollar;index&lowbar;format"> variable, the escape ``&percnt;L''
+will return the string ``To &lt;list&gt;'' when ``list'' appears in the
+``To'' field, and ``Cc &lt;list&gt;'' when it appears in the ``Cc''
+field (otherwise it returns the name of the author).
+
+Often times the ``To'' and ``Cc'' fields in mailing list messages
+tend to get quite large. Most people do not bother to remove the
+author of the message they are reply to from the list, resulting in
+two or more copies being sent to that person.  The ``list-reply''
+function, which by default is bound to ``L'' in the <em/index/ menu
+and <em/pager/, helps reduce the clutter by only replying to the
+known mailing list addresses instead of all recipients (except as
+specified by <tt/Mail-Followup-To/, see below).
+
+Mutt also supports the <tt/Mail-Followup-To/ header.  When you send
+a message to a list of recipients which includes one or several
+subscribed mailing lists, and if the <ref id="followup_to"
+name="&dollar;followup&lowbar;to"> option is set, mutt will generate
+a Mail-Followup-To header which contains all the recipients to whom
+you send this message, but not your address. This indicates that
+group-replies or list-replies (also known as ``followups'') to this
+message should only be sent to the original recipients of the
+message, and not separately to you - you'll receive your copy through
+one of the mailing lists you are subscribed to.
+
+Conversely, when group-replying or list-replying to a message which
+has a <tt/Mail-Followup-To/ header, mutt will respect this header if
+the <ref id="honor_followup_to"
+name="&dollar;honor&lowbar;followup&lowbar;to"> configuration
+variable is set.  Using list-reply will in this case also make sure
+that the reply goes to the mailing list, even if it's not specified
+in the list of recipients in the <tt/Mail-Followup-To/.
+
+Note that, when header editing is enabled, you can create a
+<tt/Mail-Followup-To/ header manually.  Mutt will only auto-generate
+this header if it doesn't exist when you send the message.
+
+
+The other method some mailing list admins use is to generate a
+``Reply-To'' field which points back to the mailing list address rather
+than the author of the message.  This can create problems when trying
+to reply directly to the author in private, since most mail clients
+will automatically reply to the address given in the ``Reply-To''
+field.  Mutt uses the <ref id="reply_to" name="&dollar;reply&lowbar;to">
+variable to help decide which address to use.  If set, you will be
+prompted as to whether or not you would like to use the address given in
+the ``Reply-To'' field, or reply directly to the address given in the
+``From'' field.  When unset, the ``Reply-To'' field will be used when
+present.
+
+The ``X-Label:'' header field can be used to further identify mailing
+lists or list subject matter (or just to annotate messages
+individually).  The <ref id="index_format"
+name="&dollar;index&lowbar;format"> variable's ``&percnt;y'' and
+``&percnt;Y'' escapes can be used to expand ``X-Label:'' fields in the
+index, and Mutt's pattern-matcher can match regular expressions to
+``X-Label:'' fields with the ``~y'' selector.  ``X-Label:'' is not a
+standard message header field, but it can easily be inserted by procmail
+and other mail filtering agents.
+
+Lastly, Mutt has the ability to <ref id="sort" name="sort"> the mailbox into
+<ref id="threads" name="threads">.  A thread is a group of messages which all 
relate to the same
+subject.  This is usually organized into a tree-like structure where a
+message and all of its replies are represented graphically.  If you've ever
+used a threaded news client, this is the same concept.  It makes dealing
+with large volume mailing lists easier because you can easily delete
+uninteresting threads and quickly find topics of value.
+
+<sect1>Delivery Status Notification (DSN) Support
+<p>
+RFC1894 defines a set of MIME content types for relaying information
+about the status of electronic mail messages.  These can be thought of as
+``return receipts.'' Berkeley sendmail 8.8.x currently has some command
+line options in which the mail client can make requests as to what type
+of status messages should be returned.
+
+To support this, there are two variables. <ref id="dsn_notify"
+name="&dollar;dsn&lowbar;notify"> is used to request receipts for
+different results (such as failed message, message delivered, etc.).
+<ref id="dsn_return" name="&dollar;dsn&lowbar;return"> requests how much
+of your message should be returned with the receipt (headers or full
+message).  Refer to the man page on sendmail for more details on DSN.
+
+<sect1>POP3 Support (OPTIONAL)
+<p>
+
+If Mutt was compiled with POP3 support (by running the <em/configure/
+script with the <em/--enable-pop/ flag), it has the ability to work
+with mailboxes located on a remote POP3 server and fetch mail for local
+browsing.
+
+You can access the remote POP3 mailbox by selecting the folder
+<tt>pop://popserver/</tt>.
+
+You can select an alternative port by specifying it with the server, ie:
+<tt>pop://popserver:port/</tt>.
+
+You can also specify different username for each folder, ie:
+<tt>pop://username@popserver[:port]/</tt>.
+
+Polling for new mail is more expensive over POP3 than locally. For this
+reason the frequency at which Mutt will check for mail remotely can be
+controlled by the
+<ref id="pop_checkinterval" name="&dollar;pop&lowbar;checkinterval">
+variable, which defaults to every 60 seconds.
+
+If Mutt was compiled with SSL support (by running the <em/configure/
+script with the <em/--with-ssl/ flag), connections to POP3 servers
+can be encrypted. This naturally requires that the server supports
+SSL encrypted connections. To access a folder with POP3/SSL, you should
+use pops: prefix, ie:
+<tt>pops://[username@]popserver[:port]/</tt>.
+
+Another way to access your POP3 mail is the <em/fetch-mail/ function
+(default: G).  It allows to connect to <ref id="pop_host"
+name="pop&lowbar;host">, fetch all your new mail and place it in the
+local <ref id="spoolfile" name="spoolfile">.  After this
+point, Mutt runs exactly as if the mail had always been local.
+
+<bf/Note:/ If you only need to fetch all messages to local mailbox
+you should consider using a specialized program, such as <htmlurl
+url="http://www.ccil.org/~esr/fetchmail"; name="fetchmail">
+
+<sect1>IMAP Support (OPTIONAL)
+<p>
+
+If Mutt was compiled with IMAP support (by running the <em/configure/
+script with the <em/--enable-imap/ flag), it has the ability to work
+with folders located on a remote IMAP server.
+
+You can access the remote inbox by selecting the folder
+<tt>imap://imapserver/INBOX</tt>, where <tt/imapserver/ is the name of the
+IMAP server and <tt/INBOX/ is the special name for your spool mailbox on
+the IMAP server. If you want to access another mail folder at the IMAP
+server, you should use <tt>imap://imapserver/path/to/folder</tt> where
+<tt>path/to/folder</tt> is the path of the folder you want to access.
+
+You can select an alternative port by specifying it with the server, ie:
+<tt>imap://imapserver:port/INBOX</tt>.
+
+You can also specify different username for each folder, ie:
+<tt>imap://username@imapserver[:port]/INBOX</tt>.
+
+If Mutt was compiled with SSL support (by running the <em/configure/
+script with the <em/--with-ssl/ flag), connections to IMAP servers
+can be encrypted. This naturally requires that the server supports
+SSL encrypted connections. To access a folder with IMAP/SSL, you should
+use <tt>imaps://[username@]imapserver[:port]/path/to/folder</tt> as your 
+folder path.
+
+Pine-compatible notation is also supported, ie
+<tt>{[username@]imapserver[:port][/ssl]}path/to/folder</tt>
+
+Note that not all servers use / as the hierarchy separator.  Mutt should
+correctly notice which separator is being used by the server and convert
+paths accordingly.
+
+When browsing folders on an IMAP server, you can toggle whether to look
+at only the folders you are subscribed to, or all folders with the
+<em/toggle-subscribed/ command.  See also the 
+<ref id="imap_list_subscribed"
+name="&dollar;imap&lowbar;list&lowbar;subscribed"> variable.
+
+Polling for new mail on an IMAP server can cause noticeable delays. So, you'll
+want to carefully tune the
+<ref id="mail_check" name="&dollar;mail&lowbar;check">
+and
+<ref id="timeout" name="&dollar;timeout">
+variables. Personally I use
+<tscreen><verb>
+set mail_check=90
+set timeout=15
+</verb></tscreen>
+with relatively good results over my slow modem line.
+
+Note that if you are using mbox as the mail store on UW servers prior to
+v12.250, the server has been reported to disconnect a client if another client
+selects the same folder.
+
+<sect2>The Folder Browser
+<p>
+
+As of version 1.2, mutt supports browsing mailboxes on an IMAP
+server. This is mostly the same as the local file browser, with the
+following differences:
+<itemize>
+<item>In lieu of file permissions, mutt displays the string "IMAP",
+  possibly followed by the symbol "+", indicating
+  that the entry contains both messages and subfolders. On
+  Cyrus-like servers folders will often contain both messages and
+  subfolders. 
+<item>For the case where an entry can contain both messages and
+  subfolders, the selection key (bound to <tt>enter</tt> by default)
+  will choose to descend into the subfolder view. If you wish to view
+  the messages in that folder, you must use <tt>view-file</tt> instead
+  (bound to <tt>space</tt> by default).
+<item>You can delete mailboxes with the <tt>delete-mailbox</tt>
+  command (bound to <tt>d</tt> by default. You may also
+  <tt>subscribe</tt> and <tt>unsubscribe</tt> to mailboxes (normally
+  these are bound to <tt>s</tt> and <tt>u</tt>, respectively).
+</itemize>
+
+<sect2>Authentication
+<p>
+
+Mutt supports four authentication methods with IMAP servers: SASL,
+GSSAPI, CRAM-MD5, and LOGIN (there is a patch by Grant Edwards to add
+NTLM authentication for you poor exchange users out there, but it has
+yet to be integrated into the main tree). There is also support for
+the pseudo-protocol ANONYMOUS, which allows you to log in to a public
+IMAP server without having an account. To use ANONYMOUS, simply make
+your username blank or "anonymous".
+<p>
+SASL is a special super-authenticator, which selects among several protocols
+(including GSSAPI, CRAM-MD5, ANONYMOUS, and DIGEST-MD5) the most secure
+method available on your host and the server. Using some of these methods
+(including DIGEST-MD5 and possibly GSSAPI), your entire session will be
+encrypted and invisible to those teeming network snoops. It is the best
+option if you have it. To use it, you must have the Cyrus SASL library
+installed on your system and compile mutt with the <em/--with-sasl/ flag.
+<p>
+Mutt will try whichever methods are compiled in and available on the server,
+in the following order: SASL, ANONYMOUS, GSSAPI, CRAM-MD5, LOGIN.
+
+There are a few variables which control authentication: 
+<itemize>
+<item><ref id="imap_user" name="&dollar;imap&lowbar;user"> - controls
+  the username under which you request authentication on the IMAP server,
+  for all authenticators. This is overridden by an explicit username in
+  the mailbox path (ie by using a mailbox name of the form
+  <tt/{user@host}/).
+<item><ref id="imap_pass" name="&dollar;imap&lowbar;pass"> - a
+  password which you may preset, used by all authentication methods where
+  a password is needed.
+<item><ref id="imap_authenticators"
+  name="&dollar;imap&lowbar;authenticators"> - a colon-delimited list of IMAP
+  authentication methods to try, in the order you wish to try them. If
+  specified, this overrides mutt's default (attempt everything, in the order
+  listed above).
+</itemize>
+
+<sect1>Managing multiple IMAP/POP accounts (OPTIONAL)<label id="account-hook">
+<p>
+
+If you happen to have accounts on multiple IMAP and/or POP servers,
+you may find managing all the authentication settings inconvenient and
+error-prone.  The account-hook command may help. This hook works like
+folder-hook but is invoked whenever you access a remote mailbox
+(including inside the folder browser), not just when you open the
+mailbox.
+<p>
+Some examples:
+
+<tscreen><verb>
+account-hook . 'unset imap_user; unset imap_pass; unset tunnel'
+account-hook imap://host1/ 'set imap_user=me1 imap_pass=foo'
+account-hook imap://host2/ 'set tunnel="ssh host2 /usr/libexec/imapd"'
+</verb></tscreen>
+
+<sect1>Start a WWW Browser on URLs (EXTERNAL)<label id="urlview">
+<p>
+If a message contains URLs (<em/unified resource locator/ = address in the
+WWW space like <em>http://www.mutt.org/</em>), it is efficient to get
+a menu with all the URLs and start a WWW browser on one of them.  This
+functionality is provided by the external urlview program which can be
+retrieved at <htmlurl url="ftp://ftp.mutt.org/mutt/contrib/";
+name="ftp://ftp.mutt.org/mutt/contrib/";> and the configuration commands:
+<tscreen><verb>
+macro index \cb |urlview\n
+macro pager \cb |urlview\n
+</verb></tscreen>
+
+<sect>Mutt's MIME Support
+<p>
+Quite a bit of effort has been made to make Mutt the premier text-mode
+MIME MUA.  Every effort has been made to provide the functionality that
+the discerning MIME user requires, and the conformance to the standards
+wherever possible.  When configuring Mutt for MIME, there are two extra
+types of configuration files which Mutt uses.  One is the
+<tt/mime.types/ file, which contains the mapping of file extensions to 
+IANA MIME types.  The other is the <tt/mailcap/ file, which specifies
+the external commands to use for handling specific MIME types.
+
+<sect1>Using MIME in Mutt
+<p>
+There are three areas/menus in Mutt which deal with MIME, they are the
+pager (while viewing a message), the attachment menu and the compose
+menu.
+
+<sect2>Viewing MIME messages in the pager
+<p>
+When you select a message from the index and view it in the pager, Mutt
+decodes the message to a text representation.  Mutt internally supports
+a number of MIME types, including <tt>text/plain, text/enriched,
+message/rfc822, and message/news</tt>.  In addition, the export
+controlled version of Mutt recognizes a variety of PGP MIME types,
+including PGP/MIME and application/pgp.
+
+Mutt will denote attachments with a couple lines describing them.
+These lines are of the form:
+<tscreen><verb>
+[-- Attachment #1: Description --]
+[-- Type: text/plain, Encoding: 7bit, Size: 10000 --]
+</verb></tscreen>
+Where the <tt/Description/ is the description or filename given for the
+attachment, and the <tt/Encoding/ is one of
+<tt>7bit/8bit/quoted-printable/base64/binary</tt>.
+
+If Mutt cannot deal with a MIME type, it will display a message like:
+<tscreen><verb>
+[-- image/gif is unsupported (use 'v' to view this part) --]
+</verb></tscreen>
+
+<sect2>The Attachment Menu<label id="attach_menu">
+<p>
+The default binding for <tt/view-attachments/ is `v', which displays the
+attachment menu for a message.  The attachment menu displays a list of
+the attachments in a message.  From the attachment menu, you can save,
+print, pipe, delete, and view attachments.  You can apply these
+operations to a group of attachments at once, by tagging the attachments
+and by using the ``tag-prefix'' operator.  You can also reply to the
+current message from this menu, and only the current attachment (or the
+attachments tagged) will be quoted in your reply.  You can view
+attachments as text, or view them using the mailcap viewer definition.
+
+Finally, you can apply the usual message-related functions (like 
+<ref id="resend-message" name="resend-message">, and the reply
+and forward functions) to attachments of type <tt>message/rfc822</tt>.
+
+See the help on the attachment menu for more information.
+
+<sect2>The Compose Menu<label id="compose_menu">
+<p>
+The compose menu is the menu you see before you send a message.  It
+allows you to edit the recipient list, the subject, and other aspects
+of your message.  It also contains a list of the attachments of your
+message, including the main body.  From this menu, you can print, copy,
+filter, pipe, edit, compose, review, and rename an attachment or a
+list of tagged attachments.  You can also modifying the attachment
+information, notably the type, encoding and description.
+
+Attachments appear as follows:
+<verb>
+-   1 [text/plain, 7bit, 1K]             /tmp/mutt-euler-8082-0 <no 
description>
+    2 [applica/x-gunzip, base64, 422K]   ~/src/mutt-0.85.tar.gz <no 
description>
+</verb>
+
+The '-' denotes that Mutt will delete the file after sending (or
+postponing, or cancelling) the message.  It can be toggled with the
+<tt/toggle-unlink/ command (default: u).  The next field is the MIME
+content-type, and can be changed with the <tt/edit-type/ command
+(default: ^T).  The next field is the encoding for the attachment,
+which allows a binary message to be encoded for transmission on 7bit
+links.  It can be changed with the <tt/edit-encoding/ command
+(default: ^E).  The next field is the size of the attachment,
+rounded to kilobytes or megabytes.  The next field is the filename,
+which can be changed with the <tt/rename-file/ command (default: R).
+The final field is the description of the attachment, and can be
+changed with the <tt/edit-description/ command (default: d).
+
+<sect1>MIME Type configuration with <tt/mime.types/
+<p>
+When you add an attachment to your mail message, Mutt searches your
+personal mime.types file at <tt>&dollar;{HOME}/.mime.types</tt>, and then
+the system mime.types file at <tt>/usr/local/share/mutt/mime.types</tt> or
+<tt>/etc/mime.types</tt>
+
+The mime.types file consist of lines containing a MIME type and a space
+separated list of extensions.  For example:
+<tscreen><verb>
+application/postscript          ps eps
+application/pgp                 pgp
+audio/x-aiff                    aif aifc aiff
+</verb></tscreen>
+A sample <tt/mime.types/ file comes with the Mutt distribution, and
+should contain most of the MIME types you are likely to use.  
+
+If Mutt can not determine the mime type by the extension of the file you
+attach, it will look at the file.  If the file is free of binary
+information, Mutt will assume that the file is plain text, and mark it
+as <tt>text/plain</tt>.  If the file contains binary information, then Mutt 
will
+mark it as <tt>application/octet-stream</tt>.  You can change the MIME
+type that Mutt assigns to an attachment by using the <tt/edit-type/
+command from the compose menu (default: ^T). The MIME type is actually a
+major mime type followed by the sub-type, separated by a '/'. 6 major
+types: application, text, image, video, audio, and model have been approved
+after various internet discussions. Mutt recognises all of these if the 
+appropriate entry is found in the mime.types file. It also recognises other
+major mime types, such as the chemical type that is widely used in the 
+molecular modelling community to pass molecular data in various forms to 
+various molecular viewers. Non-recognised mime types should only be used 
+if the recipient of the message is likely to be expecting such attachments.
+
+<sect1>MIME Viewer configuration with <tt/mailcap/
+<p>
+Mutt supports RFC 1524 MIME Configuration, in particular the Unix
+specific format specified in Appendix A of RFC 1524.  This file format
+is commonly referred to as the mailcap format.  Many MIME compliant
+programs utilize the mailcap format, allowing you to specify handling
+for all MIME types in one place for all programs.  Programs known to
+use this format include Netscape, XMosaic, lynx and metamail.
+
+In order to handle various MIME types that Mutt can not handle
+internally, Mutt parses a series of external configuration files to
+find an external handler.  The default search string for these files
+is a colon delimited list set to
+<tscreen><verb>
+${HOME}/.mailcap:/usr/local/share/mutt/mailcap:/etc/mailcap:/etc/mailcap:/usr/etc/mailcap:/usr/local/etc/mailcap
+</verb></tscreen>
+where <tt/&dollar;HOME/ is your home directory.
+
+In particular, the metamail distribution will install a mailcap file,
+usually as <tt>/usr/local/etc/mailcap</tt>, which contains some baseline
+entries.
+
+<sect2>The Basics of the mailcap file
+<p>
+A mailcap file consists of a series of lines which are comments, blank,
+or definitions.
+
+A comment line consists of a &num; character followed by anything you want.
+
+A blank line is blank.
+
+A definition line consists of a content type, a view command, and any
+number of optional fields.  Each field of a definition line is divided
+by a semicolon ';' character.
+
+The content type is specified in the MIME standard type/subtype method.
+For example,
+<tt>text/plain, text/html, image/gif, </tt>
+etc.  In addition, the mailcap format includes two formats for
+wildcards, one using the special '*' subtype, the other is the implicit
+wild, where you only include the major type.  For example, <tt>image/*</tt>, or
+<tt>video,</tt> will match all image types and video types,
+respectively.
+
+The view command is a Unix command for viewing the type specified. There
+are two different types of commands supported. The default is to send
+the body of the MIME message to the command on stdin. You can change
+this behaviour by using &percnt;s as a parameter to your view command.
+This will cause Mutt to save the body of the MIME message to a temporary
+file, and then call the view command with the &percnt;s replaced by
+the name of the temporary file. In both cases, Mutt will turn over the
+terminal to the view program until the program quits, at which time Mutt
+will remove the temporary file if it exists.
+
+So, in the simplest form, you can send a text/plain message to the
+external pager more on stdin:
+<tscreen><verb>
+text/plain; more
+</verb></tscreen>
+Or, you could send the message as a file:
+<tscreen><verb>
+text/plain; more %s
+</verb></tscreen>
+Perhaps you would like to use lynx to interactively view a text/html 
+message:
+<tscreen><verb>
+text/html; lynx %s
+</verb></tscreen>
+In this case, lynx does not support viewing a file from stdin, so you
+must use the &percnt;s syntax.
+<bf/Note:/ <em>Some older versions of lynx contain a bug where they
+will check the mailcap file for a viewer for text/html.  They will find
+the line which calls lynx, and run it.  This causes lynx to continuously
+spawn itself to view the object.</em>
+
+On the other hand, maybe you don't want to use lynx interactively, you
+just want to have it convert the text/html to text/plain, then you can
+use:
+<tscreen><verb>
+text/html; lynx -dump %s | more
+</verb></tscreen>
+
+Perhaps you wish to use lynx to view text/html files, and a pager on
+all other text formats, then you would use the following:
+<tscreen><verb>
+text/html; lynx %s
+text/*; more
+</verb></tscreen>
+This is the simplest form of a mailcap file.
+
+<sect2>Secure use of mailcap
+<p>
+The interpretion of shell meta-characters embedded in MIME parameters
+can lead to security problems in general.  Mutt tries to quote parameters
+in expansion of %s syntaxes properly, and avoids risky characters by
+substituting them, see the <ref id="mailcap_sanitize"
+name="mailcap&lowbar;sanitize"> variable.
+
+Although mutt's procedures to invoke programs with mailcap seem to be
+safe, there are other applications parsing mailcap, maybe taking less care
+of it.  Therefore you should pay attention to the following rules:
+
+<em/Keep the %-expandos away from shell quoting./
+Don't quote them with single or double quotes.  Mutt does this for
+you, the right way, as should any other program which interprets
+mailcap.  Don't put them into backtick expansions.  Be highly careful
+with eval statements, and avoid them if possible at all.  Trying to fix
+broken behaviour with quotes introduces new leaks - there is no
+alternative to correct quoting in the first place.
+
+If you have to use the %-expandos' values in context where you need
+quoting or backtick expansions, put that value into a shell variable
+and reference the shell variable where necessary, as in the following
+example (using <tt/&dollar;charset/ inside the backtick expansion is safe,
+since it is not itself subject to any further expansion):
+
+<tscreen><verb>
+text/test-mailcap-bug; cat %s; copiousoutput; test=charset=%{charset} \
+        && test "`echo $charset | tr '[A-Z]' '[a-z]'`" != iso-8859-1
+</verb></tscreen>
+
+<sect2>Advanced mailcap Usage
+<p>
+
+<sect3>Optional Fields
+<p>
+In addition to the required content-type and view command fields, you
+can add semi-colon ';' separated fields to set flags and other options.
+Mutt recognizes the following optional fields:
+<descrip>
+<tag/copiousoutput/
+This flag tells Mutt that the command passes possibly large amounts of
+text on stdout.  This causes Mutt to invoke a pager (either the internal
+pager or the external pager defined by the pager variable) on the output
+of the view command.  Without this flag, Mutt assumes that the command
+is interactive.  One could use this to replace the pipe to <tt>more</tt>
+in the <tt>lynx -dump</tt> example in the Basic section:
+<tscreen><verb>
+text/html; lynx -dump %s ; copiousoutput
+</verb></tscreen>
+This will cause lynx to format the text/html output as text/plain
+and Mutt will use your standard pager to display the results.
+<tag/needsterminal/
+Mutt uses this flag when viewing attachments with <ref id="auto_view"
+name="autoview">, in order to decide whether it should honor the setting
+of the <ref id="wait_key" name="&dollar;wait&lowbar;key"> variable or
+not.  When an attachment is viewed using an interactive program, and the
+corresponding mailcap entry has a <em/needsterminal/ flag, Mutt will use
+<ref id="wait_key" name="&dollar;wait&lowbar;key"> and the exit status
+of the program to decide if it will ask you to press a key after the
+external program has exited.  In all other situations it will not prompt
+you for a key.
+<tag>compose=&lt;command&gt;</tag>
+This flag specifies the command to use to create a new attachment of a
+specific MIME type.  Mutt supports this from the compose menu.
+<tag>composetyped=&lt;command&gt;</tag>
+This flag specifies the command to use to create a new attachment of a
+specific MIME type.  This command differs from the compose command in
+that mutt will expect standard MIME headers on the data.  This can be
+used to specify parameters, filename, description, etc. for a new
+attachment.   Mutt supports this from the compose menu.
+<tag>print=&lt;command&gt;</tag>
+This flag specifies the command to use to print a specific MIME type.
+Mutt supports this from the attachment and compose menus.
+<tag>edit=&lt;command&gt;</tag>
+This flag specifies the command to use to edit a specific MIME type.  
+Mutt supports this from the compose menu, and also uses it to compose
+new attachments.  Mutt will default to the defined editor for text
+attachments.
+<tag>nametemplate=&lt;template&gt;</tag>
+This field specifies the format for the file denoted by &percnt;s in the
+command fields.  Certain programs will require a certain file extension,
+for instance, to correctly view a file.  For instance, lynx will only
+interpret a file as <tt>text/html</tt> if the file ends in <tt/.html/.
+So, you would specify lynx as a <tt>text/html</tt> viewer with a line in
+the mailcap file like:
+<tscreen><verb>
+text/html; lynx %s; nametemplate=%s.html
+</verb></tscreen>
+<tag>test=&lt;command&gt;</tag>
+This field specifies a command to run to test whether this mailcap
+entry should be used.  The command is defined with the command expansion
+rules defined in the next section.  If the command returns 0, then the
+test passed, and Mutt uses this entry.  If the command returns non-zero,
+then the test failed, and Mutt continues searching for the right entry.
+<bf/Note:/ <em>the content-type must match before Mutt performs the test.</em>
+For example:
+<tscreen><verb>
+text/html; netscape -remote 'openURL(%s)' ; test=RunningX
+text/html; lynx %s
+</verb></tscreen>
+In this example, Mutt will run the program RunningX which will return 0
+if the X Window manager is running, and non-zero if it isn't.  If
+RunningX returns 0, then Mutt will call netscape to display the
+text/html object.  If RunningX doesn't return 0, then Mutt will go on
+to the next entry and use lynx to display the text/html object.
+</descrip>
+
+<sect3>Search Order
+<p>
+When searching for an entry in the mailcap file, Mutt will search for
+the most useful entry for its purpose.  For instance, if you are
+attempting to print an <tt>image/gif</tt>, and you have the following
+entries in your mailcap file, Mutt will search for an entry with the
+print command:
+<tscreen><verb>
+image/*;        xv %s
+image/gif;      ; print= anytopnm %s | pnmtops | lpr; \
+                nametemplate=%s.gif
+</verb></tscreen>
+Mutt will skip the <tt>image/*</tt> entry and use the <tt>image/gif</tt>
+entry with the print command.
+
+In addition, you can use this with <ref id="auto_view" name="Autoview"> 
+to denote two commands for viewing an attachment, one to be viewed
+automatically, the other to be viewed interactively from the attachment
+menu.  In addition, you can then use the test feature to determine which
+viewer to use interactively depending on your environment.
+<tscreen><verb>
+text/html;      netscape -remote 'openURL(%s)' ; test=RunningX
+text/html;      lynx %s; nametemplate=%s.html
+text/html;      lynx -dump %s; nametemplate=%s.html; copiousoutput
+</verb></tscreen>
+For <ref id="auto_view" name="Autoview">, Mutt will choose the third
+entry because of the copiousoutput tag.  For interactive viewing, Mutt
+will run the program RunningX to determine if it should use the first
+entry.  If the program returns non-zero, Mutt will use the second entry
+for interactive viewing.
+
+<sect3>Command Expansion
+<p>
+The various commands defined in the mailcap files are passed to the
+<tt>/bin/sh</tt> shell using the system() function.  Before the
+command is passed to <tt>/bin/sh -c</tt>, it is parsed to expand
+various special parameters with information from Mutt.  The keywords
+Mutt expands are:
+<descrip>
+<tag/&percnt;s/
+As seen in the basic mailcap section, this variable is expanded
+to a filename specified by the calling program.  This file contains
+the body of the message to view/print/edit or where the composing
+program should place the results of composition.  In addition, the
+use of this keyword causes Mutt to not pass the body of the message
+to the view/print/edit program on stdin.
+<tag/&percnt;t/
+Mutt will expand &percnt;t to the text representation of the content
+type of the message in the same form as the first parameter of the
+mailcap definition line, ie <tt>text/html</tt> or
+<tt>image/gif</tt>.
+<tag>&percnt;{&lt;parameter&gt;}</tag>
+Mutt will expand this to the value of the specified parameter
+from the Content-Type: line of the mail message.  For instance, if
+Your mail message contains:
+<tscreen><verb>
+Content-Type: text/plain; charset=iso-8859-1
+</verb></tscreen>
+then Mutt will expand &percnt;{charset} to iso-8859-1.  The default metamail
+mailcap file uses this feature to test the charset to spawn an xterm
+using the right charset to view the message.
+<tag>&bsol;&percnt;</tag>
+This will be replaced by a &percnt;
+</descrip>
+Mutt does not currently support the &percnt;F and &percnt;n keywords
+specified in RFC 1524.  The main purpose of these parameters is for
+multipart messages, which is handled internally by Mutt.
+
+<sect2>Example mailcap files
+<p>
+This mailcap file is fairly simple and standard:
+<code>
+# I'm always running X :)
+video/*;        xanim %s > /dev/null
+image/*;        xv %s > /dev/null
+
+# I'm always running netscape (if my computer had more memory, maybe)
+text/html;      netscape -remote 'openURL(%s)'
+</code>
+
+This mailcap file shows quite a number of examples:
+
+<code>
+# Use xanim to view all videos   Xanim produces a header on startup,
+# send that to /dev/null so I don't see it
+video/*;        xanim %s > /dev/null
+
+# Send html to a running netscape by remote
+text/html;      netscape -remote 'openURL(%s)'; test=RunningNetscape
+
+# If I'm not running netscape but I am running X, start netscape on the
+# object
+text/html;      netscape %s; test=RunningX
+
+# Else use lynx to view it as text
+text/html;      lynx %s
+
+# This version would convert the text/html to text/plain
+text/html;      lynx -dump %s; copiousoutput
+
+# I use enscript to print text in two columns to a page
+text/*;         more %s; print=enscript -2Gr %s
+
+# Netscape adds a flag to tell itself to view jpegs internally
+image/jpeg;xv %s; x-mozilla-flags=internal
+
+# Use xv to view images if I'm running X
+# In addition, this uses the \ to extend the line and set my editor
+# for images
+image/*;xv %s; test=RunningX; \
+        edit=xpaint %s
+
+# Convert images to text using the netpbm tools
+image/*;  (anytopnm %s | pnmscale -xysize 80 46 | ppmtopgm | pgmtopbm |
+pbmtoascii -1x2 ) 2>&1 ; copiousoutput
+
+# Send excel spreadsheets to my NT box
+application/ms-excel; open.pl %s
+</code>
+
+<sect1>MIME Autoview<label id="auto_view">
+<p>
+In addition to explicitly telling Mutt to view an attachment with the
+MIME viewer defined in the mailcap file, Mutt has support for
+automatically viewing MIME attachments while in the pager.
+
+To work, you must define a viewer in the mailcap file which uses the 
+<tt/copiousoutput/ option to denote that it is non-interactive.
+Usually, you also use the entry to convert the attachment to a text
+representation which you can view in the pager.
+
+You then use the <tt/auto&lowbar;view/ muttrc command to list the
+content-types that you wish to view automatically.
+
+For instance, if you set auto&lowbar;view to:
+<tscreen><verb>
+auto_view text/html application/x-gunzip application/postscript image/gif 
application/x-tar-gz
+</verb></tscreen>
+
+Mutt could use the following mailcap entries to automatically view
+attachments of these types.
+<tscreen><verb>
+text/html;      lynx -dump %s; copiousoutput; nametemplate=%s.html
+image/*;        anytopnm %s | pnmscale -xsize 80 -ysize 50 | ppmtopgm | 
pgmtopbm | pbmtoascii ; copiousoutput
+application/x-gunzip;   gzcat; copiousoutput
+application/x-tar-gz; gunzip -c %s | tar -tf - ; copiousoutput
+application/postscript; ps2ascii %s; copiousoutput
+</verb></tscreen>
+
+``unauto_view'' can be used to remove previous entries from the autoview list.
+This can be used with message-hook to autoview messages based on size, etc.
+``unauto_view *'' will remove all previous entries.
+
+<sect1>MIME Multipart/Alternative<label id="alternative_order">
+<p>
+Mutt has some heuristics for determining which attachment of a
+multipart/alternative type to display.  First, mutt will check the 
+alternative&lowbar;order list to determine if one of the available types
+is preferred.  The alternative&lowbar;order list consists of a number of
+mimetypes in order, including support for implicit and explicit
+wildcards, for example:
+<tscreen><verb>
+alternative_order text/enriched text/plain text application/postscript image/*
+</verb></tscreen>
+
+Next, mutt will check if any of the types have a defined 
+<ref id="auto_view" name="auto&lowbar;view">, and use that.  Failing
+that, Mutt will look for any text type.  As a last attempt, mutt will
+look for any type it knows how to handle.
+
+To remove a MIME type from the <tt/alternative_order/ list, use the
+<tt/unalternative_order/ command.
+
+<sect1>MIME Lookup<label id="mime_lookup">
+<p>
+Mutt's mime&lowbar;lookup list specifies a list of mime-types that should not
+be treated according to their mailcap entry.  This option is designed to
+deal with binary types such as application/octet-stream.  When an attachment's
+mime-type is listed in mime&lowbar;lookup, then the extension of the filename 
will
+be compared to the list of extensions in the mime.types file.  The mime-type
+associated with this extension will then be used to process the attachment
+according to the rules in the mailcap file and according to any other 
configuration
+options (such as auto&lowbar;view) specified.  Common usage would be:
+<tscreen><verb>
+mime_lookup application/octet-stream application/X-Lotus-Manuscript
+</verb></tscreen>
+
+In addition, the unmime&lowbar;lookup command may be used to disable this 
feature
+for any particular mime-type if it had been set, for example, in a global
+muttrc.
+
+<sect>Reference
+<sect1>Command line options<label id="commandline">
+<p>
+Running <tt/mutt/ with no arguments will make Mutt attempt to read your spool
+mailbox.  However, it is possible to read other mailboxes and
+to send messages from the command line as well.
+
+<tscreen><verb>
+-A     expand an alias
+-a      attach a file to a message
+-b      specify a blind carbon-copy (BCC) address
+-c      specify a carbon-copy (Cc) address
+-e      specify a config command to be run after initilization files are read
+-f      specify a mailbox to load
+-F      specify an alternate file to read initialization commands
+-h      print help on command line options
+-H      specify a draft file from which to read a header and body
+-i      specify a file to include in a message composition
+-m      specify a default mailbox type
+-n      do not read the system Muttrc
+-p      recall a postponed message
+-Q      query a configuration variable
+-R      open mailbox in read-only mode
+-s      specify a subject (enclose in quotes if it contains spaces)
+-v      show version number and compile-time definitions
+-x      simulate the mailx(1) compose mode
+-y      show a menu containing the files specified by the mailboxes command
+-z      exit immediately if there are no messages in the mailbox
+-Z      open the first folder with new message,exit immediately if none
+</verb></tscreen>
+
+To read messages in a mailbox
+
+<tt/mutt/ &lsqb; -nz &rsqb; &lsqb; -F <em/muttrc/ &rsqb; &lsqb; -m <em/type/ 
&rsqb; &lsqb; -f <em/mailbox/ &rsqb; 
+
+To compose a new message
+
+<tt/mutt/ &lsqb; -n &rsqb; &lsqb; -F <em/muttrc/ &rsqb; &lsqb; -a <em/file/ 
&rsqb; &lsqb; -c <em/address/ &rsqb; &lsqb; -i <em/filename/ &rsqb; &lsqb; -s 
<em/subject/ &rsqb; <em/address/ &lsqb; <em/address/ ... &rsqb; 
+
+Mutt also supports a ``batch'' mode to send prepared messages.  Simply redirect
+input from the file you wish to send.  For example,
+
+<tt>mutt -s &dquot;data set for run &num;2&dquot; professor@xxxxxxxxxxxxx
+&lt; &tilde;/run2.dat</tt>
+
+This command will send a message to ``professor@xxxxxxxxxxxxx'' with a subject
+of ``data set for run &num;2''.  In the body of the message will be the 
contents
+of the file ``&tilde;/run2.dat''.
+
+<sect1>Configuration Commands<label id="commands">
+<p>
+The following are the commands understood by mutt.
+
+<itemize>
+<item>
+<tt><ref id="account-hook" name="account-hook"></tt> <em/pattern/ <em/command/
+<item>
+<tt><ref id="alias" name="alias"></tt> <em/key/ <em/address/ &lsqb; , 
<em/address/, ... &rsqb;
+<item>
+<tt><ref id="alias" name="unalias"></tt> &lsqb; * | <em/key/ ... &rsqb;
+<item>
+<tt><ref id="alternates" name="alternates"></tt> <em/regexp/ &lsqb; 
<em/regexp/ ... &rsqb;
+<item>
+<tt><ref id="alternates" name="unalternates"></tt> &lsqb; * | <em/regexp/ ... 
&rsqb;
+<item>
+<tt><ref id="alternative_order" name="alternative&lowbar;order"></tt> 
<em/mimetype/ &lsqb; <em/mimetype/ ... &rsqb;
+<item>
+<tt><ref id="alternative_order" name="unalternative&lowbar;order"></tt> 
<em/mimetype/ &lsqb; <em/mimetype/ ... &rsqb;
+<item>
+<tt><ref id="auto_view" name="auto&lowbar;view"></tt> <em/mimetype/ &lsqb; 
<em/mimetype/ ... &rsqb;
+<item>
+<tt><ref id="auto_view" name="unauto&lowbar;view"></tt> <em/mimetype/ &lsqb; 
<em/mimetype/ ... &rsqb;
+<item>
+<tt><ref id="bind" name="bind"></tt> <em/map/ <em/key/ <em/function/
+<item>
+<tt><ref id="charset-hook" name="charset-hook"></tt> <em/alias/ <em/charset/
+<item>
+<tt><ref id="color" name="color"></tt> <em/object/ <em/foreground/ 
<em/background/ &lsqb; <em/regexp/ &rsqb;
+<item>
+<tt><ref id="color" name="uncolor"></tt> <em/index/ <em/pattern/ &lsqb; 
<em/pattern/ ... &rsqb;
+<item>
+<tt><ref id="exec" name="exec"></tt> <em/function/ &lsqb; <em/function/ ... 
&rsqb;
+<item>
+<tt><ref id="fcc-hook" name="fcc-hook"></tt> <em/pattern/ <em/mailbox/
+<item>
+<tt><ref id="fcc-save-hook" name="fcc-save-hook"></tt> <em/pattern/ 
<em/mailbox/
+<item>
+<tt><ref id="folder-hook" name="folder-hook"></tt> <em/pattern/ <em/command/
+<item>
+<tt><ref id="hdr_order" name="hdr&lowbar;order"></tt> <em/header/ &lsqb; 
<em/header/ ... &rsqb;
+<item>
+<tt><ref id="hdr_order" name="unhdr&lowbar;order"></tt> <em/header/ &lsqb; 
<em/header/ ... &rsqb;
+<item>
+<tt><ref id="charset-hook" name="iconv-hook"></tt> <em/charset/ 
<em/local-charset/
+<item>
+<tt><ref id="ignore" name="ignore"></tt> <em/pattern/ &lsqb; <em/pattern/ ... 
&rsqb;
+<item>
+<tt><ref id="ignore" name="unignore"></tt> <em/pattern/ &lsqb; <em/pattern/ 
... &rsqb;
+<item>
+<tt><ref id="lists" name="lists"></tt> <em/regexp/ &lsqb; <em/regexp/ ... 
&rsqb; 
+<item>
+<tt><ref id="lists" name="unlists"></tt> <em/regexp/ &lsqb; <em/regexp/ ... 
&rsqb; 
+<item>
+<tt><ref id="macro" name="macro"></tt> <em/menu/ <em/key/ <em/sequence/ &lsqb; 
<em/description/ &rsqb; 
+<item>
+<tt><ref id="mailboxes" name="mailboxes"></tt> <em/filename/ &lsqb; 
<em/filename/ ... &rsqb;
+<item>
+<tt><ref id="mbox-hook" name="mbox-hook"></tt> <em/pattern/ <em/mailbox/
+<item>
+<tt><ref id="message-hook" name="message-hook"></tt> <em/pattern/ <em/command/
+<item>
+<tt><ref id="mime_lookup" name="mime&lowbar;lookup"></tt> <em/mimetype/ &lsqb; 
<em/mimetype/ ... &rsqb;
+<item>
+<tt><ref id="mime_lookup" name="unmime&lowbar;lookup"></tt> <em/mimetype/ 
&lsqb; <em/mimetype/ ... &rsqb;
+<item>
+<tt><ref id="color" name="mono"></tt> <em/object attribute/ &lsqb; <em/regexp/ 
&rsqb;
+<item>
+<tt><ref id="color" name="unmono"></tt> <em/index/ <em/pattern/ &lsqb; 
<em/pattern/ ... &rsqb;
+<item>
+<tt><ref id="my_hdr" name="my&lowbar;hdr"></tt> <em/string/
+<item>
+<tt><ref id="my_hdr" name="unmy&lowbar;hdr"></tt> <em/field/ &lsqb; <em/field/ 
... &rsqb;
+<item>
+<tt><ref id="crypt-hook" name="crypt-hook"></tt> <em/pattern/ <em/key-id/
+<item>
+<tt><ref id="push" name="push"></tt> <em/string/
+<item>
+<tt><ref id="set" name="reset"></tt> <em/variable/ &lsqb;<em/variable/ ... 
&rsqb;
+<item>
+<tt><ref id="save-hook" name="save-hook"></tt> <em/regexp/ <em/filename/
+<item>
+<tt><ref id="score-command" name="score"></tt> <em/pattern/ <em/value/
+<item>
+<tt><ref id="score-command" name="unscore"></tt> <em/pattern/ &lsqb; 
<em/pattern/ ... &rsqb;
+<item>
+<tt><ref id="send-hook" name="send-hook"></tt> <em/regexp/ <em/command/
+<item>
+<tt><ref id="set" name="set"></tt> 
&lsqb;no|inv&rsqb;<em/variable/&lsqb;=<em/value/&rsqb; &lsqb; <em/variable/ ... 
&rsqb;
+<item>
+<tt><ref id="set" name="unset"></tt> <em/variable/ &lsqb;<em/variable/ ... 
&rsqb;
+<item>
+<tt><ref id="source" name="source"></tt> <em/filename/
+<item>
+<tt><ref id="spam" name="spam"></tt> <em/pattern/ <em/format/
+<item>
+<tt><ref id="spam" name="nospam"></tt> <em/pattern/
+<item>
+<tt><ref id="lists" name="subscribe"></tt> <em/regexp/ &lsqb; <em/regexp/ ... 
&rsqb; 
+<item>
+<tt><ref id="lists" name="unsubscribe"></tt> <em/regexp/ &lsqb; <em/regexp/ 
... &rsqb; 
+<item>
+<tt><ref id="set" name="toggle"></tt> <em/variable/ &lsqb;<em/variable/ ... 
&rsqb;
+<item>
+<tt><ref id="unhook" name="unhook"></tt> <em/hook-type/
+</itemize>
+
+<sect1>Configuration variables<label id="variables">
+<p>
+
diff -urN mutt.20041014.orig/doc/muttrc.man.head 
mutt.20041014/doc/muttrc.man.head
--- mutt.20041014.orig/doc/muttrc.man.head      Tue Jul 13 22:16:58 2004
+++ mutt.20041014/doc/muttrc.man.head   Thu Oct 14 13:45:16 2004
@@ -87,6 +87,18 @@
 a regular expression from the list of known alternates.
 .PP
 .nf
+\fBnotalternates\fP \fIregexp\fP [ \fB,\fP \fIregexp\fP [ ... ]]
+\fBunnotalternates\fP [\fB * \fP | \fIregexp\fP [ \fB,\fP \fIregexp\fP [ ... 
]] ]
+.fi
+.IP
+\fBnotalternates\fP is used to inform mutt about addresses
+where you do not receive mail; you can use regular expressions to specify
+non-alternate addresses.  This affects mutt's idea about messages
+from you, and messages addressed to you.  \fBunnotalternates\fP removes
+a regular expression from the list of known non-alternates.  The purpose
+of this is to exclude addresses otherwise matched by \fBalternates\fP.
+.PP
+.nf
 \fBalternative_order\fP \fItype\fP[\fB/\fP\fIsubtype\fP] [ ... ]
 \fBunalternative_order\fP [\fB * \fP | \fItype\fP/\fIsubtype\fP] [...]
 .fi
@@ -405,8 +417,8 @@
 ~n \fIMIN\fP-\fIMAX\fP messages with a score in the range \fIMIN\fP to 
\fIMAX\fP
 ~N     new messages
 ~O     old messages
-~p     message is addressed to you (consults $alternates)
-~P     message is from you (consults $alternates)
+~p     message is addressed to you (consults $alternates and $notalternates)
+~P     message is from you (consults $alternates and $notalternates)
 ~Q     messages which have been replied to
 ~R     read messages
 ~r \fIMIN\fP-\fIMAX\fP messages with \(lqdate-received\(rq in a Date range
diff -urN mutt.20041014.orig/doc/muttrc.man.head.orig 
mutt.20041014/doc/muttrc.man.head.orig
--- mutt.20041014.orig/doc/muttrc.man.head.orig Wed Dec 31 18:00:00 1969
+++ mutt.20041014/doc/muttrc.man.head.orig      Tue Jul 13 22:16:58 2004
@@ -0,0 +1,500 @@
+'\" t
+.\" -*-nroff-*-
+.\"
+.\"     Copyright (C) 1996-2000 Michael R. Elkins <me@xxxxxxxxxx>
+.\"    Copyright (C) 1999-2000 Thomas Roessler <roessler@xxxxxxx>
+.\" 
+.\"     This program is free software; you can redistribute it and/or modify
+.\"     it under the terms of the GNU General Public License as published by
+.\"     the Free Software Foundation; either version 2 of the License, or
+.\"     (at your option) any later version.
+.\" 
+.\"     This program is distributed in the hope that it will be useful,
+.\"     but WITHOUT ANY WARRANTY; without even the implied warranty of
+.\"     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+.\"     GNU General Public License for more details.
+.\" 
+.\"     You should have received a copy of the GNU General Public License
+.\"     along with this program; if not, write to the Free Software
+.\"     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+.\"
+.TH muttrc 5 "September 2002" Unix "User Manuals"
+.SH NAME
+muttrc \- Configuration file for the Mutt Mail User Agent
+.SH DESCRIPTION
+.PP
+A mutt configuration file consists of a series of \(lqcommands\(rq.
+Each line of the file may contain one or more commands.  When
+multiple commands are used, they must be separated by a semicolon
+(\(lq\fB;\fP\(rq).
+.PP
+The hash mark, or pound sign (\(lq\fB#\fP\(rq), is used as a
+\(lqcomment\(rq character. You can use it to annotate your
+initialization file. All text after the comment character to the end
+of the line is ignored.
+.PP
+Single quotes (\(lq\fB'\fP\(rq) and double quotes (\(lq\fB"\fP\(rq)
+can be used to quote strings which contain spaces or other special
+characters.  The difference between the two types of quotes is
+similar to that of many popular shell programs, namely that a single
+quote is used to specify a literal string (one that is not
+interpreted for shell variables or quoting with a backslash [see
+next paragraph]), while double quotes indicate a string for which
+should be evaluated.  For example, backtics are evaluated inside of
+double quotes, but not for single quotes.
+.PP
+\fB\(rs\fP quotes the next character, just as in shells such as bash and zsh.
+For example, if want to put quotes (\(lq\fB"\fP\(rq) inside of a
+string, you can use \(lq\fB\(rs\fP\(rq to force the next character
+to be a literal instead of interpreted character.
+.PP
+\(lq\fB\(rs\(rs\fP\(rq means to insert a literal \(lq\fB\(rs\fP\(rq into the
+line.  \(lq\fB\(rsn\fP\(rq and \(lq\fB\(rsr\fP\(rq have their usual
+C meanings of linefeed and carriage-return, respectively.
+.PP
+A \(lq\fB\(rs\fP\(rq at the end of a line can be used to split commands over
+multiple lines, provided that the split points don't appear in the
+middle of command names.
+.PP
+It is also possible to substitute the output of a Unix command in an
+initialization file.  This is accomplished by enclosing the command
+in backquotes (\fB`\fP\fIcommand\fP\fB`\fP).
+.PP
+UNIX environments can be accessed like the way it is done in shells
+like sh and bash: Prepend the name of the environment by a dollar
+(\(lq\fB\(Do\fP\(rq) sign.
+.PP
+.SH COMMANDS
+.PP
+.nf
+\fBalias\fP \fIkey\fP \fIaddress\fP [\fB,\fP \fIaddress\fP [ ... ]]
+\fBunalias\fP [\fB * \fP | \fIkey\fP ]
+.fi
+.IP
+\fBalias\fP defines an alias \fIkey\fP for the given addresses.
+\fBunalias\fP removes the alias corresponding to the given \fIkey\fP or
+all aliases when \(lq\fB*\fP\(rq is used as an argument.
+.PP
+.nf
+\fBalternates\fP \fIregexp\fP [ \fB,\fP \fIregexp\fP [ ... ]]
+\fBunalternates\fP [\fB * \fP | \fIregexp\fP [ \fB,\fP \fIregexp\fP [ ... ]] ]
+.fi
+.IP
+\fBalternates\fP is used to inform mutt about alternate addresses
+where you receive mail; you can use regular expressions to specify
+alternate addresses.  This affects mutt's idea about messages
+from you, and messages addressed to you.  \fBunalternates\fP removes
+a regular expression from the list of known alternates.
+.PP
+.nf
+\fBalternative_order\fP \fItype\fP[\fB/\fP\fIsubtype\fP] [ ... ]
+\fBunalternative_order\fP [\fB * \fP | \fItype\fP/\fIsubtype\fP] [...]
+.fi
+.IP
+\fBalternative_order\fP command permits you to define an order of preference 
which is
+used by mutt to determine which part of a
+\fBmultipart/alternative\fP body to display.
+A subtype of \(lq\fB*\fP\(rq matches any subtype, as does an empty
+subtype.   \fBunalternative_order\fP removes entries from the
+ordered list or deletes the entire list when \(lq\fB*\fP\(rq is used
+as an argument.
+.PP
+.nf
+\fBauto_view\fP \fItype\fP[\fB/\fP\fIsubtype\fP] [ ... ]
+\fBunauto_view\fP \fItype\fP[fB/\fP\fIsubtype\fP] [ ... ]
+.fi
+.IP
+This commands permits you to specify that mutt should automatically
+convert the given MIME types to text/plain when displaying messages.
+For this to work, there must be a 
+.BR mailcap (5)
+entry for the given MIME type with the 
+.B copiousoutput
+flag set.  A subtype of \(lq\fB*\fP\(rq 
+matches any subtype, as does an empty subtype.
+.PP
+.nf
+\fBmime_lookup\fP \fItype\fP[\fB/\fP\fIsubtype\fP] [ ... ]
+\fBunmime_lookup\fP \fItype\fP[\fB/\fP\fIsubtype\fP] [ ... ]
+.fi
+.IP
+This command permits you to define a list of "data" MIME content
+types for which mutt will try to determine the actual file type from
+the file name, and not use a 
+.BR mailcap (5)
+entry given for the original MIME type.  For instance, you may add
+the \fBapplication/octet-stream\fP MIME type to this list.
+.TP
+\fBbind\fP \fImap1,map2,...\fP \fIkey\fP \fIfunction\fP
+This command binds the given \fIkey\fP for the given \fImap\fP or maps
+to the given \fIfunction\fP. Multiple maps may be specified by
+separating them with commas (no whitespace is allowed).
+.IP
+Valid maps are:
+.BR generic ", " alias ", " attach ", " 
+.BR browser ", " editor ", "
+.BR index ", " compose ", " 
+.BR pager ", " pgp ", " postpone ", "
+.BR mix .
+.IP
+For more information on keys and functions, please consult the Mutt
+Manual.
+.TP
+\fBaccount-hook\fP [\fB!\fP]\fIregexp\fP \fIcommand\fP
+This hook is executed whenever you access a remote mailbox. Useful
+to adjust configuration settings to different IMAP or POP servers.
+.TP
+\fBcharset-hook\fP \fIalias\fP \fIcharset\fP
+This command defines an alias for a character set.  This is useful
+to properly display messages which are tagged with a character set
+name not known to mutt.
+.TP
+\fBiconv-hook\fP \fIcharset\fP \fIlocal-charset\fP
+This command defines a system-specific name for a character set.
+This is useful when your system's 
+.BR iconv (3)
+implementation does not understand MIME character set names (such as 
+.BR iso-8859-1 ),
+but instead insists on being fed with implementation-specific
+character set names (such as
+.BR 8859-1 ).
+In this specific case, you'd put this into your configuration file:
+.IP
+.B "iconv-hook iso-8859-1 8859-1"
+.TP
+\fBmessage-hook\fP [\fB!\fP]\fIpattern\fP \fIcommand\fP
+Before mutt displays (or formats for replying or forwarding) a
+message which matches the given \fIpattern\fP (or, when it is
+preceded by an exclamation mark, does not match the \fIpattern\fP),
+the given \fIcommand\fP is executed.  When multiple
+\fBmessage-hook\fPs match, they are  executed  in  the order in
+which they occur in the configuration file.
+.TP
+\fBfolder-hook\fP [\fB!\fP]\fIregexp\fP \fIcommand\fP
+When mutt enters a folder which matches \fIregexp\fP (or, when
+\fIregexp\fP is preceded by an exclamation mark, does not match
+\fIregexp\fP), the given \fIcommand\fP is executed.
+.IP
+When several \fBfolder-hook\fPs match a given mail folder, they are
+executed in the order given in the configuration file.
+.TP
+\fBmacro\fP \fImap\fP \fIkey\fP \fIsequence\fP [ \fIdescription\fP ]
+This command binds the given \fIsequence\fP of keys to the given
+\fIkey\fP in the given \fImap\fP or maps.  For valid maps, see \fBbind\fP. To
+specify multipe maps, put only a comma between the maps.
+.PP
+.nf
+\fBcolor\fP \fIobject\fP \fIforeground\fP \fIbackground\fP [ \fI regexp\fP ]
+\fBcolor\fP index \fIforeground\fP \fIbackground\fP [ \fI pattern\fP ]
+\fBuncolor\fP index \fIpattern\fP [ \fIpattern\fP ... ]
+.fi
+.IP
+If your terminal supports color, these commands can be used to
+assign \fIforeground\fP/\fIbackgound\fP combinations to certain
+objects.  Valid objects are:
+.BR attachment ", " body ", " bold ", " header ", "
+.BR hdrdefault ", " index ", " indicator ", " markers ", "
+.BR message ", " normal ", " quoted ", " quoted\fIN\fP ", "
+.BR search ", " signature ", " status ", " tilde ", " tree ", "
+.BR underline .
+The
+.BR body " and " header
+objects allow you to restrict the colorization to a regular
+expression.  The \fBindex\fP object permits you to select colored
+messages by pattern.
+.IP
+Valid colors include:
+.BR white ", " black ", " green ", " magenta ", " blue ", "
+.BR cyan ", " yellow ", " red ", " default ", " color\fIN\fP .
+.PP
+.nf
+\fBmono\fP \fIobject\fP \fIattribute\fP [ \fIregexp\fP ]
+\fBmono\fP index \fIattribute\fP [ \fIpattern\fP ]
+.fi
+.IP
+For terminals which don't support color, you can still assign
+attributes to objects.  Valid attributes include:
+.BR none ", " bold ", " underline ", " 
+.BR reverse ", and " standout .
+.TP
+[\fBun\fP]\fBignore\fP \fIpattern\fP [ \fIpattern\fP ... ]
+The \fBignore\fP command permits you to specify header fields which
+you usually don't wish to see.  Any header field whose tag
+\fIbegins\fP with an \(lqignored\(rq pattern will be ignored.
+.IP
+The \fBunignore\fP command permits you to define exceptions from
+the above mentioned list of ignored headers.
+.PP
+.nf
+\fBlists\fP \fIregexp\fP [ \fIregexp\fP ... ]
+\fBunlists\fP \fIregexp\fP [ \fIregexp\fP ... ]
+\fBsubscribe\fP \fIregexp\fP [ \fIregexp\fP ... ]
+\fBunsubscribe\fP \fIregexp\fP [ \fIregexp\fP ... ]
+.fi
+.IP
+Mutt maintains two lists of mailing list address patterns, a list of
+subscribed mailing lists, and a list of known mailing lists.  All
+subscribed mailing lists are known.  Patterns use regular expressions.
+.IP
+The \fBlists\fP command adds a mailing list address to the list of
+known mailing lists.  The \fBunlists\fP command removes a mailing
+list from the lists of known and subscribed mailing lists.  The
+\fBsubscribe\fP command adds a mailing list to the lists of known
+and subscribed mailing lists.  The \fBunsubscribe\fP command removes
+it from the list of subscribed mailing lists.
+.TP
+\fBmbox-hook\fP [\fB!\fP]\fIpattern\fP \fImailbox\fP
+When mutt changes to a mail folder which matches \fIpattern\fP,
+\fImailbox\fP will be used as the \(lqmbox\(rq folder, i.e., read
+messages will be moved to that folder when the mail folder is left.
+.IP
+The first matching \fBmbox-hook\fP applies.
+.PP
+.nf
+\fBmailboxes\fP \fIfilename\fP [ \fIfilename\fP ... ]
+\fBunmailboxes\fP [ \fB*\fP | \fIfilename\fP ... ]
+.fi
+.IP
+The \fBmailboxes\fP specifies folders which can receive mail and which will
+be checked for new messages.  When changing folders, pressing space
+will cycle through folders with new mail.  The \fBunmailboxes\fP
+command is used to remove a file name from the list of folders which
+can receive mail.  If "\fB*\fP" is specified as the file name, the
+list is emptied.
+.PP
+.nf
+\fBmy_hdr\fP \fIstring\fP
+\fBunmy_hdr\fP \fIfield\fP
+.fi
+.IP
+Using \fBmy_hdr\fP, you can define headers which will be added to
+the messages you compose.  \fBunmy_hdr\fP will remove the given
+user-defined headers.
+.TP
+\fBhdr_order\fP \fIheader1\fP \fIheader2\fP [ ... ]
+With this command, you can specify an order in which mutt will
+attempt to present headers to you when viewing messages.
+.TP
+\fBsave-hook\fP [\fB!\fP]\fIpattern\fP \fIfilename\fP
+When a message matches \fIpattern\fP, the default file name when
+saving it will be the given \fIfilename\fP.
+.TP
+\fBfcc-hook\fP [\fB!\fP]\fIpattern\fP \fIfilename\fP
+When an outgoing message matches \fIpattern\fP, the default file
+name for storing a copy (fcc) will be the given \fIfilename\fP.
+.TP
+\fBfcc-save-hook\fP [\fB!\fP]\fIpattern\fP \fIfilename\fP
+This command is an abbreviation for identical \fBfcc-hook\fP and
+\fBsave-hook\fP commands.
+.TP
+\fBsend-hook\fP [\fB!\fP]\fIpattern\fP \fIcommand\fP
+When composing a message matching \fIpattern\fP, \fIcommand\fP is
+executed.  When multiple \fBsend-hook\fPs match, they are executed
+in the order in which they occur in the configuration file.
+.TP
+\fBcrypt-hook\fP \fIpattern\fP \fIkey-id\fP
+The crypt-hook command provides a method by which you can
+specify the ID of the public key to be used when encrypting messages
+to a certain recipient.  The meaning of "key ID" is to be taken
+broadly: This can be a different e-mail address, a numerical key ID,
+or even just an arbitrary search string.
+.TP
+\fBpush\fP \fIstring\fP
+This command adds the named \fIstring\fP to the keyboard buffer.
+.PP
+.nf
+\fBset\fP [\fBno\fP|\fBinv\fP]\fIvariable\fP[=\fIvalue\fP] [ ... ]
+\fBtoggle\fP \fIvariable\fP [ ... ]
+\fBunset\fP \fIvariable\fP [ ... ]
+\fBreset\fP \fIvariable\fP [ ... ]
+.fi
+.IP
+These commands are used to set and manipulate configuration
+varibles.
+.IP
+Mutt knows four basic types of variables: boolean, number, string
+and quadoption.  Boolean variables can be \fBset\fP (true),
+\fBunset\fP (false), or \fBtoggle\fPd. Number variables can be assigned
+a positive integer value.
+.IP
+String variables consist of any number of printable characters.
+Strings must be enclosed in quotes if they contain spaces or tabs.
+You may also use the \(lqC\(rq escape sequences \fB\\n\fP and
+\fB\\t\fP for newline and tab, respectively.
+.IP
+Quadoption variables are used to control whether or not to be
+prompted for certain actions, or to specify a default action.  A
+value of \fByes\fP will cause the action to be carried out automatically
+as if you had answered yes to the question.  Similarly, a value of
+\fBno\fP will cause the the action to be carried out as if you had
+answered \(lqno.\(rq A value of \fBask-yes\fP will cause a prompt
+with a default answer of \(lqyes\(rq and \fBask-no\fP will provide a
+default answer of \(lqno.\(rq
+.IP
+The \fBreset\fP command resets all given variables to the compile
+time defaults.  If you reset the special variabe \fBall\fP, all
+variables will reset to their system defaults.
+.TP
+\fBsource\fP \fIfilename\fP
+The given file will be evaluated as a configuration file.
+.TP
+.nf
+\fBspam\fP \fIpattern\fP \fIformat\fP
+\fBnospam\fP \fIpattern\fP
+.fi
+These commands define spam-detection patterns from external spam
+filters, so that mutt can sort, limit, and search on
+``spam tags'' or ``spam attributes'', or display them
+in the index. See the Mutt manual for details.
+.TP
+\fBunhook\fP [\fB * \fP | \fIhook-type\fP ]
+This command will remove all hooks of a given type, or all hooks
+when \(lq\fB*\fP\(rq is used as an argument.  \fIhook-type\fP
+can be any of the \fB-hook\fP commands documented above.
+.SH PATTERNS
+.PP
+In various places with mutt, including some of the abovementioned
+\fBhook\fP commands, you can specify patterns to match messages.
+.SS Constructing Patterns
+.PP
+A simple pattern consists of an operator of the form
+\(lq\fB~\fP\fIcharacter\fP\(rq, possibly followed by a parameter
+against which mutt is supposed to match the object specified by
+this operator.  (For a list of operators, see below.)
+.PP
+With some of these operators, the object to be matched consists of
+several e-mail addresses.  In these cases, the object is matched if
+at least one of these e-mail addresses matches. You can prepend a
+hat (\(lq\fB^\fP\(rq) character to such a pattern to indicate that
+\fIall\fP addresses must match in order to match the object.
+.PP
+You can construct complex patterns by combining simple patterns with
+logical operators.  Logical AND is specified by simply concatenating
+two simple patterns, for instance \(lq~C mutt-dev ~s bug\(rq.
+Logical OR is specified by inserting a vertical bar (\(lq\fB|\fP\(rq)
+between two patterns, for instance \(lq~C mutt-dev | ~s bug\(rq.
+Additionally, you can negate a pattern by prepending a bang
+(\(lq\fB!\fP\(rq) character.  For logical grouping, use braces
+(\(lq()\(rq). Example: \(lq!(~t mutt|~c mutt) ~f elkins\(rq.
+.SS Simple Patterns
+.PP
+Mutt understands the following simple patterns:
+.PP
+.TS
+l l.
+~A     all messages
+~b \fIEXPR\fP  messages which contain \fIEXPR\fP in the message body
+~B \fIEXPR\fP  messages which contain \fIEXPR\fP in the whole message
+~c \fIEXPR\fP  messages carbon-copied to \fIEXPR\fP
+~C \fIEXPR\fP  message is either to: or cc: \fIEXPR\fP
+~D     deleted messages
+~d \fIMIN\fP-\fIMAX\fP messages with \(lqdate-sent\(rq in a Date range
+~E     expired messages
+~e \fIEXPR\fP  message which contains \fIEXPR\fP in the \(lqSender\(rq field
+~F     flagged messages
+~f \fIEXPR\fP  messages originating from \fIEXPR\fP
+~g     PGP signed messages
+~G     PGP encrypted messages
+~H \fIEXPR\fP  messages with spam tags matching \fIEXPR\fP
+~h \fIEXPR\fP  messages which contain \fIEXPR\fP in the message header
+~k     message contains PGP key material
+~i \fIEXPR\fP  message which match \fIEXPR\fP in the \(lqMessage-ID\(rq field
+~L \fIEXPR\fP  message is either originated or received by \fIEXPR\fP
+~l     message is addressed to a known mailing list
+~m \fIMIN\fP-\fIMAX\fP message in the range \fIMIN\fP to \fIMAX\fP
+~n \fIMIN\fP-\fIMAX\fP messages with a score in the range \fIMIN\fP to 
\fIMAX\fP
+~N     new messages
+~O     old messages
+~p     message is addressed to you (consults $alternates)
+~P     message is from you (consults $alternates)
+~Q     messages which have been replied to
+~R     read messages
+~r \fIMIN\fP-\fIMAX\fP messages with \(lqdate-received\(rq in a Date range
+~S     superseded messages
+~s \fIEXPR\fP  messages having \fIEXPR\fP in the \(lqSubject\(rq field.
+~T     tagged messages
+~t \fIEXPR\fP  messages addressed to \fIEXPR\fP
+~U     unread messages
+~v     message is part of a collapsed thread.
+~x \fIEXPR\fP  messages which contain \fIEXPR\fP in the \(lqReferences\(rq 
field
+~z \fIMIN\fP-\fIMAX\fP messages with a size in the range \fIMIN\fP to \fIMAX\fP
+~=     duplicated messages (see $duplicate_threads)
+~$     unreferenced message (requries threaded view)
+.TE
+.PP
+In the above, \fIEXPR\fP is a regular expression.
+.PP
+With the \fB~m\fP, \fB~n\fP, and \fB~z\fP operators, you can also
+specify ranges in the forms \fB<\fP\fIMAX\fP, \fB>\fP\fIMIN\fP,
+\fIMIN\fP\fB-\fP, and \fB-\fP\fIMAX\fP.
+.SS Matching dates
+.PP
+The \fB~d\fP and \fB~r\fP operators are used to match date ranges,
+which are interpreted to be given in your local time zone.
+.PP
+A date is of the form
+\fIDD\fP[\fB/\fP\fIMM\fP[\fB/\fP[\fIcc\fP]\fIYY\fP]], that is, a
+two-digit date, optionally followed by a two-digit month, optionally
+followed by a year specifications.  Omitted fields default to the
+current month and year.
+.PP
+Mutt understands either two or four digit year specifications.  When
+given a two-digit year, mutt will interpret values less than 70 as
+lying in the 21st century (i.e., \(lq38\(rq means 2038 and not 1938,
+and \(lq00\(rq is interpreted as 2000), and values
+greater than or equal to 70 as lying in the 20th century.
+.PP
+Note that this behaviour \fIis\fP Y2K compliant, but that mutt
+\fIdoes\fP have a Y2.07K problem.
+.PP
+If a date range consists of a single date, the operator in question
+will match that precise date.  If the date range consists of a dash
+(\(lq\fB-\fP\(rq), followed by a date, this range will match any
+date before and up to the date given.  Similarly, a date followed by
+a dash matches the date given and any later point of time.  Two
+dates, separated by a dash, match any date which lies in the given
+range of time.
+.PP
+You can also modify any absolute date by giving an error range.  An
+error range consists of one of the characters
+.BR + ,
+.BR - ,
+.BR * ,
+followed by a positive number, followed by one of the unit
+characters
+.BR y ,
+.BR m ,
+.BR w ", or"
+.BR d ,
+specifying a unit of years, months, weeks, or days.  
+.B +
+increases the maximum date matched by the given interval of time,
+.B - 
+decreases the minimum date matched by the given interval of time, and
+.B *
+increases the maximum date and decreases the minimum date matched by
+the given interval of time.  It is possible to give multiple error
+margins, which cumulate.  Example:
+.B "1/1/2001-1w+2w*3d"
+.PP
+You can also specify offsets relative to the current date.  An
+offset is specified as one of the characters
+.BR < ,
+.BR > ,
+.BR = ,
+followed by a positive number, followed by one of the unit
+characters
+.BR y ,
+.BR m ,
+.BR w ", or"
+.BR d .
+.B >
+matches dates which are older than the specified amount of time, an
+offset which begins with the character
+.B < 
+matches dates which are more recent than the specified amount of time,
+and an offset which begins with the character
+.B =
+matches points of time which are precisely the given amount of time
+ago.
+.SH CONFIGURATION VARIABLES
diff -urN mutt.20041014.orig/globals.h mutt.20041014/globals.h
--- mutt.20041014.orig/globals.h        Mon Aug 30 14:05:40 2004
+++ mutt.20041014/globals.h     Thu Oct 14 13:45:16 2004
@@ -127,6 +127,7 @@
 WHERE LIST *UnIgnore INITVAL(0);
 
 WHERE RX_LIST *Alternates INITVAL(0);
+WHERE RX_LIST *Notalternates INITVAL(0);
 WHERE RX_LIST *MailLists INITVAL(0);
 WHERE RX_LIST *SubscribedLists INITVAL(0);
 WHERE SPAM_LIST *SpamList INITVAL(0);
diff -urN mutt.20041014.orig/globals.h.orig mutt.20041014/globals.h.orig
--- mutt.20041014.orig/globals.h.orig   Wed Dec 31 18:00:00 1969
+++ mutt.20041014/globals.h.orig        Mon Aug 30 14:05:40 2004
@@ -0,0 +1,244 @@
+/*
+ * Copyright (C) 1996-2002 Michael R. Elkins <me@xxxxxxxx>
+ * 
+ *     This program is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation; either version 2 of the License, or
+ *     (at your option) any later version.
+ * 
+ *     This program is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ * 
+ *     You should have received a copy of the GNU General Public License
+ *     along with this program; if not, write to the Free Software
+ *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ */ 
+
+WHERE void (*mutt_error) (const char *, ...);
+WHERE void (*mutt_message) (const char *, ...);
+
+WHERE CONTEXT *Context;
+
+WHERE char Errorbuf[STRING];
+WHERE char AttachmentMarker[STRING];
+
+#if defined(DL_STANDALONE) && defined(USE_DOTLOCK)
+WHERE char *MuttDotlock;
+#endif
+
+WHERE ADDRESS *From;
+
+WHERE char *AliasFile;
+WHERE char *AliasFmt;
+WHERE char *AttachSep;
+WHERE char *Attribution;
+WHERE char *AttachFormat;
+WHERE char *Charset;
+WHERE char *ComposeFormat;
+WHERE char *ConfigCharset;
+WHERE char *ContentType;
+WHERE char *DefaultHook;
+WHERE char *DateFmt;
+WHERE char *DisplayFilter;
+WHERE char *DsnNotify;
+WHERE char *DsnReturn;
+WHERE char *Editor;
+WHERE char *EscChar;
+WHERE char *FolderFormat;
+WHERE char *ForwFmt;
+WHERE char *Fqdn;
+WHERE char *HdrFmt;
+WHERE char *Homedir;
+WHERE char *Hostname;
+#ifdef USE_IMAP
+WHERE char *ImapAuthenticators INITVAL (NULL);
+WHERE char *ImapDelimChars INITVAL (NULL);
+WHERE char *ImapHeaders;
+WHERE char *ImapHomeNamespace INITVAL (NULL);
+WHERE char *ImapPass INITVAL (NULL);
+WHERE char *ImapUser INITVAL (NULL);
+#endif
+WHERE char *Inbox;
+WHERE char *Ispell;
+WHERE char *Locale;
+WHERE char *MailcapPath;
+WHERE char *Maildir;
+WHERE char *MhFlagged;
+WHERE char *MhReplied;
+WHERE char *MhUnseen;
+WHERE char *MsgFmt;
+
+#ifdef USE_SOCKET
+WHERE char *Preconnect INITVAL (NULL);
+WHERE char *Tunnel INITVAL (NULL);
+#endif /* USE_SOCKET */
+
+#ifdef MIXMASTER
+WHERE char *Mixmaster;
+WHERE char *MixEntryFormat;
+#endif
+
+WHERE char *Muttrc INITVAL (NULL);
+WHERE char *Outbox;
+WHERE char *Pager;
+WHERE char *PagerFmt;
+WHERE char *PipeSep;
+#ifdef USE_POP
+WHERE char *PopAuthenticators INITVAL (NULL);
+WHERE short PopCheckTimeout;
+WHERE char *PopHost;
+WHERE char *PopPass INITVAL (NULL);
+WHERE char *PopUser INITVAL (NULL);
+#endif
+WHERE char *PostIndentString;
+WHERE char *Postponed;
+WHERE char *Prefix;
+WHERE char *PrintCmd;
+WHERE char *QueryCmd;
+WHERE char *Realname;
+WHERE char *SendCharset;
+WHERE char *Sendmail;
+WHERE char *Shell;
+WHERE char *Signature;
+WHERE char *SimpleSearch;
+WHERE char *Spoolfile;
+WHERE char *SpamSep;
+#if defined(USE_SSL) || defined(USE_NSS)
+WHERE char *SslCertFile INITVAL (NULL);
+WHERE char *SslEntropyFile INITVAL (NULL);
+WHERE char *SslClientCert INITVAL (NULL);
+#endif
+WHERE char *StChars;
+WHERE char *Status;
+WHERE char *Tempdir;
+WHERE char *Tochars;
+WHERE char *Username;
+WHERE char *Visual;
+
+WHERE char *LastFolder;
+
+WHERE LIST *AutoViewList INITVAL(0);
+WHERE LIST *AlternativeOrderList INITVAL(0);
+WHERE LIST *HeaderOrderList INITVAL(0);
+WHERE LIST *Ignore INITVAL(0);
+WHERE LIST *MimeLookupList INITVAL(0);
+WHERE LIST *UnIgnore INITVAL(0);
+
+WHERE RX_LIST *Alternates INITVAL(0);
+WHERE RX_LIST *MailLists INITVAL(0);
+WHERE RX_LIST *SubscribedLists INITVAL(0);
+WHERE SPAM_LIST *SpamList INITVAL(0);
+WHERE RX_LIST *NoSpamList INITVAL(0);
+
+/* bit vector for boolean variables */
+#ifdef MAIN_C
+unsigned char Options[(OPTMAX + 7)/8];
+#else
+extern unsigned char Options[];
+#endif
+
+/* bit vector for the yes/no/ask variable type */
+#ifdef MAIN_C
+unsigned char QuadOptions[(OPT_MAX*2 + 7) / 8];
+#else
+extern unsigned char QuadOptions[];
+#endif
+
+WHERE unsigned short Counter INITVAL (0);
+
+WHERE short ConnectTimeout;
+WHERE short HistSize;
+WHERE short PagerContext;
+WHERE short PagerIndexLines;
+WHERE short ReadInc;
+WHERE short SendmailWait;
+WHERE short SleepTime INITVAL (1);
+WHERE short Timeout;
+WHERE short WrapMargin;
+WHERE short WriteInc;
+
+WHERE short ScoreThresholdDelete;
+WHERE short ScoreThresholdRead;
+WHERE short ScoreThresholdFlag;
+
+#ifdef USE_IMAP
+WHERE short ImapKeepalive;
+#endif
+
+/* flags for received signals */
+WHERE SIG_ATOMIC_VOLATILE_T SigAlrm INITVAL (0);
+WHERE SIG_ATOMIC_VOLATILE_T SigInt INITVAL (0);
+WHERE SIG_ATOMIC_VOLATILE_T SigWinch INITVAL (0);
+
+WHERE int CurrentMenu;
+
+WHERE ALIAS *Aliases INITVAL (0);
+WHERE LIST *UserHeader INITVAL (0);
+
+/*-- formerly in pgp.h --*/
+WHERE REGEXP PgpGoodSign;
+WHERE char *PgpSignAs;
+WHERE short PgpTimeout;
+WHERE char *PgpEntryFormat;
+WHERE char *PgpClearSignCommand;
+WHERE char *PgpDecodeCommand;
+WHERE char *PgpVerifyCommand;
+WHERE char *PgpDecryptCommand;
+WHERE char *PgpSignCommand;
+WHERE char *PgpEncryptSignCommand;
+WHERE char *PgpEncryptOnlyCommand;
+WHERE char *PgpImportCommand;
+WHERE char *PgpExportCommand;
+WHERE char *PgpVerifyKeyCommand;
+WHERE char *PgpListSecringCommand;
+WHERE char *PgpListPubringCommand;
+WHERE char *PgpGetkeysCommand;
+
+/*-- formerly in smime.h --*/
+WHERE char *SmimeDefaultKey;
+WHERE char *SmimeCryptAlg;
+WHERE short SmimeTimeout;
+WHERE char *SmimeCertificates;
+WHERE char *SmimeKeys;
+WHERE char *SmimeCryptAlg;
+WHERE char *SmimeCALocation;
+WHERE char *SmimeVerifyCommand;
+WHERE char *SmimeVerifyOpaqueCommand;
+WHERE char *SmimeDecryptCommand;
+WHERE char *SmimeSignCommand;
+WHERE char *SmimeSignOpaqueCommand;
+WHERE char *SmimeEncryptCommand;
+WHERE char *SmimeGetSignerCertCommand;
+WHERE char *SmimePk7outCommand;
+WHERE char *SmimeGetCertCommand;
+WHERE char *SmimeImportCertCommand;
+WHERE char *SmimeGetCertEmailCommand;
+
+
+
+#ifdef DEBUG
+WHERE FILE *debugfile INITVAL (0);
+WHERE int debuglevel INITVAL (0);
+#endif
+
+#ifdef MAIN_C
+const char *Weekdays[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
+const char *Months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", 
"Aug", "Sep", "Oct", "Nov", "Dec", "ERR" };
+
+const char *BodyTypes[] = { "x-unknown", "audio", "application", "image", 
"message", "model", "multipart", "text", "video" };
+const char *BodyEncodings[] = { "x-unknown", "7bit", "8bit", 
"quoted-printable", "base64", "binary", "x-uuencoded" };
+#else
+extern const char *Weekdays[];
+extern const char *Months[];
+#endif
+
+#ifdef MAIN_C
+/* so that global vars get included */ 
+#include "mx.h"
+#include "mutt_regex.h"
+#include "buffy.h"
+#include "sort.h"
+#include "mutt_crypt.h"
+#endif /* MAIN_C */
diff -urN mutt.20041014.orig/init.c mutt.20041014/init.c
--- mutt.20041014.orig/init.c   Mon Aug 30 14:03:35 2004
+++ mutt.20041014/init.c        Thu Oct 14 13:45:16 2004
@@ -1066,7 +1066,7 @@
 
          pp->rx = safe_calloc (1, sizeof (regex_t));
          pp->pattern = safe_strdup ((char *) p->init);
-         if (mutt_strcmp (p->option, "alternates") == 0)
+         if (mutt_strcmp (p->option, "alternates") == 0 || mutt_strcmp 
(p->option, "notalternates") == 0)
            flags |= REG_ICASE;
          else if (mutt_strcmp (p->option, "mask") != 0)
            flags |= mutt_which_case ((const char *) p->init);
@@ -1297,9 +1297,9 @@
       {
        int not = 0;
 
-       /* $alternates is case-insensitive,
+       /* $alternates and notalternates are case-insensitive,
           $mask is case-sensitive */
-       if (mutt_strcmp (MuttVars[idx].option, "alternates") == 0)
+       if (mutt_strcmp (MuttVars[idx].option, "alternates") == 0 || 
mutt_strcmp (MuttVars[idx].option, "notalternates") == 0)
          flags |= REG_ICASE;
        else if (mutt_strcmp (MuttVars[idx].option, "mask") != 0)
          flags |= mutt_which_case (tmp->data);
diff -urN mutt.20041014.orig/init.c.orig mutt.20041014/init.c.orig
--- mutt.20041014.orig/init.c.orig      Wed Dec 31 18:00:00 1969
+++ mutt.20041014/init.c.orig   Mon Aug 30 14:03:35 2004
@@ -0,0 +1,2361 @@
+/*
+ * Copyright (C) 1996-2002 Michael R. Elkins <me@xxxxxxxx>
+ * 
+ *     This program is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation; either version 2 of the License, or
+ *     (at your option) any later version.
+ * 
+ *     This program is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ * 
+ *     You should have received a copy of the GNU General Public License
+ *     along with this program; if not, write to the Free Software
+ *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ */ 
+
+#include "mutt.h"
+#include "mapping.h"
+#include "mutt_curses.h"
+#include "mutt_regex.h"
+#include "history.h"
+#include "keymap.h"
+#include "mbyte.h"
+#include "charset.h"
+#include "mutt_crypt.h"
+#include "mutt_idna.h"
+
+#if defined(USE_SSL) || defined(USE_NSS)
+#include "mutt_ssl.h"
+#endif
+
+
+
+#include "mx.h"
+#include "init.h"
+#include "mailbox.h"
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/utsname.h>
+#include <errno.h>
+#include <sys/wait.h>
+
+void toggle_quadoption (int opt)
+{
+  int n = opt/4;
+  int b = (opt % 4) * 2;
+
+  QuadOptions[n] ^= (1 << b);
+}
+
+void set_quadoption (int opt, int flag)
+{
+  int n = opt/4;
+  int b = (opt % 4) * 2;
+
+  QuadOptions[n] &= ~(0x3 << b);
+  QuadOptions[n] |= (flag & 0x3) << b;
+}
+
+int quadoption (int opt)
+{
+  int n = opt/4;
+  int b = (opt % 4) * 2;
+
+  return (QuadOptions[n] >> b) & 0x3;
+}
+
+int query_quadoption (int opt, const char *prompt)
+{
+  int v = quadoption (opt);
+
+  switch (v)
+  {
+    case M_YES:
+    case M_NO:
+      return (v);
+
+    default:
+      v = mutt_yesorno (prompt, (v == M_ASKYES));
+      CLEARLINE (LINES - 1);
+      return (v);
+  }
+
+  /* not reached */
+}
+
+/* given the variable ``s'', return the index into the rc_vars array which
+   matches, or -1 if the variable is not found.  */
+int mutt_option_index (char *s)
+{
+  int i;
+
+  for (i = 0; MuttVars[i].option; i++)
+    if (mutt_strcmp (s, MuttVars[i].option) == 0)
+      return (MuttVars[i].type == DT_SYN ?  mutt_option_index ((char *) 
MuttVars[i].data) : i);
+  return (-1);
+}
+
+int mutt_extract_token (BUFFER *dest, BUFFER *tok, int flags)
+{
+  char         ch;
+  char         qc = 0; /* quote char */
+  char         *pc;
+
+  /* reset the destination pointer to the beginning of the buffer */
+  dest->dptr = dest->data;
+
+  SKIPWS (tok->dptr);
+  while ((ch = *tok->dptr))
+  {
+    if (!qc)
+    {
+      if ((ISSPACE (ch) && !(flags & M_TOKEN_SPACE)) ||
+         (ch == '#' && !(flags & M_TOKEN_COMMENT)) ||
+         (ch == '=' && (flags & M_TOKEN_EQUAL)) ||
+         (ch == ';' && !(flags & M_TOKEN_SEMICOLON)) ||
+         ((flags & M_TOKEN_PATTERN) && strchr ("~!|", ch)))
+       break;
+    }
+
+    tok->dptr++;
+
+    if (ch == qc)
+      qc = 0; /* end of quote */
+    else if (!qc && (ch == '\'' || ch == '"') && !(flags & M_TOKEN_QUOTE))
+      qc = ch;
+    else if (ch == '\\' && qc != '\'')
+    {
+       if (!*tok->dptr)
+           return -1; /* premature end of token */
+      switch (ch = *tok->dptr++)
+      {
+       case 'c':
+       case 'C':
+           if (!*tok->dptr)
+               return -1; /* premature end of token */
+         mutt_buffer_addch (dest, (toupper ((unsigned char) *tok->dptr)
+                                    - '@') & 0x7f);
+         tok->dptr++;
+         break;
+       case 'r':
+         mutt_buffer_addch (dest, '\r');
+         break;
+       case 'n':
+         mutt_buffer_addch (dest, '\n');
+         break;
+       case 't':
+         mutt_buffer_addch (dest, '\t');
+         break;
+       case 'f':
+         mutt_buffer_addch (dest, '\f');
+         break;
+       case 'e':
+         mutt_buffer_addch (dest, '\033');
+         break;
+       default:
+         if (isdigit ((unsigned char) ch) &&
+             isdigit ((unsigned char) *tok->dptr) &&
+             isdigit ((unsigned char) *(tok->dptr + 1)))
+         {
+
+           mutt_buffer_addch (dest, (ch << 6) + (*tok->dptr << 3) + 
*(tok->dptr + 1) - 3504);
+           tok->dptr += 2;
+         }
+         else
+           mutt_buffer_addch (dest, ch);
+      }
+    }
+    else if (ch == '^' && (flags & M_TOKEN_CONDENSE))
+    {
+       if (!*tok->dptr)
+           return -1; /* premature end of token */
+      ch = *tok->dptr++;
+      if (ch == '^')
+       mutt_buffer_addch (dest, ch);
+      else if (ch == '[')
+       mutt_buffer_addch (dest, '\033');
+      else if (isalpha ((unsigned char) ch))
+       mutt_buffer_addch (dest, toupper ((unsigned char) ch) - '@');
+      else
+      {
+       mutt_buffer_addch (dest, '^');
+       mutt_buffer_addch (dest, ch);
+      }
+    }
+    else if (ch == '`' && (!qc || qc == '"'))
+    {
+      FILE     *fp;
+      pid_t    pid;
+      char     *cmd, *ptr;
+      size_t   expnlen;
+      BUFFER   expn;
+      int      line = 0;
+
+      pc = tok->dptr;
+      do {
+       if ((pc = strpbrk (pc, "\\`")))
+       {
+         /* skip any quoted chars */
+         if (*pc == '\\')
+           pc += 2;
+       }
+      } while (pc && *pc != '`');
+      if (!pc)
+      {
+       dprint (1, (debugfile, "mutt_get_token: mismatched backtics\n"));
+       return (-1);
+      }
+      cmd = mutt_substrdup (tok->dptr, pc);
+      if ((pid = mutt_create_filter (cmd, NULL, &fp, NULL)) < 0)
+      {
+       dprint (1, (debugfile, "mutt_get_token: unable to fork command: %s", 
cmd));
+       FREE (&cmd);
+       return (-1);
+      }
+      FREE (&cmd);
+
+      tok->dptr = pc + 1;
+
+      /* read line */
+      memset (&expn, 0, sizeof (expn));
+      expn.data = mutt_read_line (NULL, &expn.dsize, fp, &line);
+      fclose (fp);
+      mutt_wait_filter (pid);
+
+      /* if we got output, make a new string consiting of the shell ouptput
+        plus whatever else was left on the original line */
+      /* BUT: If this is inside a quoted string, directly add output to 
+       * the token */
+      if (expn.data && qc)
+      {
+       mutt_buffer_addstr (dest, expn.data);
+       FREE (&expn.data);
+      }
+      else if (expn.data)
+      {
+       expnlen = mutt_strlen (expn.data);
+       tok->dsize = expnlen + mutt_strlen (tok->dptr) + 1;
+       ptr = safe_malloc (tok->dsize);
+       memcpy (ptr, expn.data, expnlen);
+       strcpy (ptr + expnlen, tok->dptr);      /* __STRCPY_CHECKED__ */
+       if (tok->destroy)
+         FREE (&tok->data);
+       tok->data = ptr;
+       tok->dptr = ptr;
+       tok->destroy = 1; /* mark that the caller should destroy this data */
+       ptr = NULL;
+       FREE (&expn.data);
+      }
+    }
+    else if (ch == '$' && (!qc || qc == '"') && (*tok->dptr == '{' || isalpha 
((unsigned char) *tok->dptr)))
+    {
+      char *env = NULL, *var = NULL;
+
+      if (*tok->dptr == '{')
+      {
+       tok->dptr++;
+       if ((pc = strchr (tok->dptr, '}')))
+       {
+         var = mutt_substrdup (tok->dptr, pc);
+         tok->dptr = pc + 1;
+       }
+      }
+      else
+      {
+       for (pc = tok->dptr; isalpha ((unsigned char) *pc) || *pc == '_'; pc++)
+         ;
+       var = mutt_substrdup (tok->dptr, pc);
+       tok->dptr = pc;
+      }
+      if (var && (env = getenv (var)))
+       mutt_buffer_addstr (dest, env);
+      FREE (&var);
+    }
+    else
+      mutt_buffer_addch (dest, ch);
+  }
+  mutt_buffer_addch (dest, 0); /* terminate the string */
+  SKIPWS (tok->dptr);
+  return 0;
+}
+
+static void add_to_list (LIST **list, const char *str)
+{
+  LIST *t, *last = NULL;
+
+  /* don't add a NULL or empty string to the list */
+  if (!str || *str == '\0')
+    return;
+
+  /* check to make sure the item is not already on this list */
+  for (last = *list; last; last = last->next)
+  {
+    if (ascii_strcasecmp (str, last->data) == 0)
+    {
+      /* already on the list, so just ignore it */
+      last = NULL;
+      break;
+    }
+    if (!last->next)
+      break;
+  }
+
+  if (!*list || last)
+  {
+    t = (LIST *) safe_calloc (1, sizeof (LIST));
+    t->data = safe_strdup (str);
+    if (last)
+    {
+      last->next = t;
+      last = last->next;
+    }
+    else
+      *list = last = t;
+  }
+}
+
+static int add_to_rx_list (RX_LIST **list, const char *s, int flags, BUFFER 
*err)
+{
+  RX_LIST *t, *last = NULL;
+  REGEXP *rx;
+
+  if (!s || !*s)
+    return 0;
+
+  if (!(rx = mutt_compile_regexp (s, flags)))
+  {
+    snprintf (err->data, err->dsize, "Bad regexp: %s\n", s);
+    return -1;
+  }
+
+  /* check to make sure the item is not already on this list */
+  for (last = *list; last; last = last->next)
+  {
+    if (ascii_strcasecmp (rx->pattern, last->rx->pattern) == 0)
+    {
+      /* already on the list, so just ignore it */
+      last = NULL;
+      break;
+    }
+    if (!last->next)
+      break;
+  }
+
+  if (!*list || last)
+  {
+    t = mutt_new_rx_list();
+    t->rx = rx;
+    if (last)
+    {
+      last->next = t;
+      last = last->next;
+    }
+    else
+      *list = last = t;
+  }
+  else /* duplicate */
+    mutt_free_regexp (&rx);
+
+  return 0;
+}
+
+
+static int add_to_spam_list (SPAM_LIST **list, const char *pat, const char 
*templ, BUFFER *err)
+{
+  SPAM_LIST *t = NULL, *last = NULL;
+  REGEXP *rx;
+  int n;
+  const char *p;
+
+  if (!pat || !*pat || !templ)
+    return 0;
+
+  if (!(rx = mutt_compile_regexp (pat, REG_ICASE)))
+  {
+    snprintf (err->data, err->dsize, _("Bad regexp: %s"), pat);
+    return -1;
+  }
+
+  /* check to make sure the item is not already on this list */
+  for (last = *list; last; last = last->next)
+  {
+    if (ascii_strcasecmp (rx->pattern, last->rx->pattern) == 0)
+    {
+      /* Already on the list. Formerly we just skipped this case, but
+       * now we're supporting removals, which means we're supporting
+       * re-adds conceptually. So we probably want this to imply a
+       * removal, then do an add. We can achieve the removal by freeing
+       * the template, and leaving t pointed at the current item.
+       */
+      t = last;
+      safe_free(&t->template);
+      break;
+    }
+    if (!last->next)
+      break;
+  }
+
+  /* If t is set, it's pointing into an extant SPAM_LIST* that we want to
+   * update. Otherwise we want to make a new one to link at the list's end.
+   */
+  if (!t)
+  {
+    t = mutt_new_spam_list();
+    t->rx = rx;
+    if (last)
+      last->next = t;
+    else
+      *list = t;
+  }
+
+  /* Now t is the SPAM_LIST* that we want to modify. It is prepared. */
+  t->template = safe_strdup(templ);
+
+  /* Find highest match number in template string */
+  t->nmatch = 0;
+  for (p = templ; *p;)
+  {
+    if (*p == '%')
+    {
+        n = atoi(++p);
+        if (n > t->nmatch)
+          t->nmatch = n;
+        while (*p && isdigit((int)*p))
+          ++p;
+    }
+    else
+        ++p;
+  }
+  t->nmatch++;         /* match 0 is always the whole expr */
+
+  return 0;
+}
+
+static int remove_from_spam_list (SPAM_LIST **list, const char *pat)
+{
+  SPAM_LIST *spam, *prev;
+  int nremoved = 0;
+
+  /* Being first is a special case. */
+  spam = *list;
+  if (spam->rx && !mutt_strcmp(spam->rx->pattern, pat))
+  {
+    *list = spam->next;
+    mutt_free_regexp(&spam->rx);
+    safe_free(&spam->template);
+    safe_free(&spam);
+    return 1;
+  }
+
+  prev = spam;
+  for (spam = prev->next; spam;)
+  {
+    if (!mutt_strcmp(spam->rx->pattern, pat))
+    {
+      prev->next = spam->next;
+      mutt_free_regexp(&spam->rx);
+      safe_free(&spam->template);
+      safe_free(&spam);
+      spam = prev->next;
+      ++nremoved;
+    }
+    else
+      spam = spam->next;
+  }
+
+  return nremoved;
+}
+
+
+static void remove_from_list (LIST **l, const char *str)
+{
+  LIST *p, *last = NULL;
+
+  if (mutt_strcmp ("*", str) == 0)
+    mutt_free_list (l);    /* ``unCMD *'' means delete all current entries */
+  else
+  {
+    p = *l;
+    last = NULL;
+    while (p)
+    {
+      if (ascii_strcasecmp (str, p->data) == 0)
+      {
+       FREE (&p->data);
+       if (last)
+         last->next = p->next;
+       else
+         (*l) = p->next;
+       FREE (&p);
+      }
+      else
+      {
+       last = p;
+       p = p->next;
+      }
+    }
+  }
+}
+
+static void remove_from_rx_list (RX_LIST **l, const char *str)
+{
+  RX_LIST *p, *last = NULL;
+
+  if (mutt_strcmp ("*", str) == 0)
+    mutt_free_rx_list (l);    /* ``unCMD *'' means delete all current entries 
*/
+  else
+  {
+    p = *l;
+    last = NULL;
+    while (p)
+    {
+      if (ascii_strcasecmp (str, p->rx->pattern) == 0)
+      {
+       mutt_free_regexp (&p->rx);
+       if (last)
+         last->next = p->next;
+       else
+         (*l) = p->next;
+       FREE (&p);
+      }
+      else
+      {
+       last = p;
+       p = p->next;
+      }
+    }
+  }
+}
+
+static int parse_unignore (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER 
*err)
+{
+  do
+  {
+    mutt_extract_token (buf, s, 0);
+
+    /* don't add "*" to the unignore list */
+    if (strcmp (buf->data, "*")) 
+      add_to_list (&UnIgnore, buf->data);
+
+    remove_from_list (&Ignore, buf->data);
+  }
+  while (MoreArgs (s));
+
+  return 0;
+}
+
+static int parse_ignore (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER 
*err)
+{
+  do
+  {
+    mutt_extract_token (buf, s, 0);
+    remove_from_list (&UnIgnore, buf->data);
+    add_to_list (&Ignore, buf->data);
+  }
+  while (MoreArgs (s));
+
+  return 0;
+}
+
+static int parse_list (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
+{
+  do
+  {
+    mutt_extract_token (buf, s, 0);
+    add_to_list ((LIST **) data, buf->data);
+  }
+  while (MoreArgs (s));
+
+  return 0;
+}
+
+static int _parse_rx_list (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER 
*err, int flags)
+{
+  do 
+  {
+    mutt_extract_token (buf, s, 0);
+    if (add_to_rx_list ((RX_LIST **) data, buf->data, flags, err) != 0)
+      return -1;
+       
+  }
+  while (MoreArgs (s));
+  
+  return 0;
+}
+
+static int parse_rx_list (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER 
*err)
+{
+  return _parse_rx_list (buf, s, data, err, REG_ICASE);
+}
+
+static int parse_rx_unlist (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER 
*err)
+{
+  do
+  {
+    mutt_extract_token (buf, s, 0);
+    if (mutt_strcmp (buf->data, "*") == 0)
+    {
+      mutt_free_rx_list ((RX_LIST **) data);
+      break;
+    }
+    remove_from_rx_list ((RX_LIST **) data, buf->data);
+  }
+  while (MoreArgs (s));
+  
+  return 0;
+}
+
+static int parse_spam_list (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER 
*err)
+{
+  BUFFER templ;
+
+  memset(&templ, 0, sizeof(templ));
+
+  /* Insist on at least one parameter */
+  if (!MoreArgs(s))
+  {
+    if (data == M_SPAM)
+      strfcpy(err->data, _("spam: no matching pattern"), err->dsize);
+    else
+      strfcpy(err->data, _("nospam: no matching pattern"), err->dsize);
+    return -1;
+  }
+
+  /* Extract the first token, a regexp */
+  mutt_extract_token (buf, s, 0);
+
+  /* data should be either M_SPAM or M_NOSPAM. M_SPAM is for spam commands. */
+  if (data == M_SPAM)
+  {
+    /* If there's a second parameter, it's a template for the spam tag. */
+    if (MoreArgs(s))
+    {
+      mutt_extract_token (&templ, s, 0);
+
+      /* Add to the spam list. */
+      if (add_to_spam_list (&SpamList, buf->data, templ.data, err) != 0) {
+         FREE(&templ.data);
+          return -1;
+      }
+      FREE(&templ.data);
+    }
+
+    /* If not, try to remove from the nospam list. */
+    else
+    {
+      remove_from_rx_list(&NoSpamList, buf->data);
+    }
+
+    return 0;
+  }
+
+  /* M_NOSPAM is for nospam commands. */
+  else if (data == M_NOSPAM)
+  {
+    /* nospam only ever has one parameter. */
+
+    /* "*" is a special case. */
+    if (!mutt_strcmp(buf->data, "*"))
+    {
+      mutt_free_spam_list (&SpamList);
+      mutt_free_rx_list (&NoSpamList);
+      return 0;
+    }
+
+    /* If it's on the spam list, just remove it. */
+    if (remove_from_spam_list(&SpamList, buf->data) != 0)
+      return 0;
+
+    /* Otherwise, add it to the nospam list. */
+    if (add_to_rx_list (&NoSpamList, buf->data, REG_ICASE, err) != 0)
+      return -1;
+
+    return 0;
+  }
+
+  /* This should not happen. */
+  strfcpy(err->data, "This is no good at all.", err->dsize);
+  return -1;
+}
+
+
+static int parse_unlist (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER 
*err)
+{
+  do
+  {
+    mutt_extract_token (buf, s, 0);
+    /*
+     * Check for deletion of entire list
+     */
+    if (mutt_strcmp (buf->data, "*") == 0)
+    {
+      mutt_free_list ((LIST **) data);
+      break;
+    }
+    remove_from_list ((LIST **) data, buf->data);
+  }
+  while (MoreArgs (s));
+
+  return 0;
+}
+
+
+static int parse_unlists (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER 
*err)
+{
+  do
+  {
+    mutt_extract_token (buf, s, 0);
+    remove_from_rx_list (&MailLists, buf->data);
+    remove_from_rx_list (&SubscribedLists, buf->data);
+  }
+  while (MoreArgs (s));
+
+  return 0;
+}
+
+static int parse_subscribe (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER 
*err)
+{
+  do
+  {
+    mutt_extract_token (buf, s, 0);
+    if (add_to_rx_list (&MailLists, buf->data, REG_ICASE, err) != 0)
+      return -1;
+    if (add_to_rx_list (&SubscribedLists, buf->data, REG_ICASE, err) != 0)
+      return -1;
+  }
+  while (MoreArgs (s));
+
+  return 0;
+}
+  
+static int parse_unalias (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER 
*err)
+{
+  ALIAS *tmp, *last = NULL;
+
+  do
+  {
+    mutt_extract_token (buf, s, 0);
+
+    if (mutt_strcmp ("*", buf->data) == 0)
+    {
+      if (CurrentMenu == MENU_ALIAS)
+      {
+       for (tmp = Aliases; tmp ; tmp = tmp->next)
+         tmp->del = 1;
+       set_option (OPTFORCEREDRAWINDEX);
+      }
+      else
+       mutt_free_alias (&Aliases);
+      break;
+    }
+    else
+      for (tmp = Aliases; tmp; tmp = tmp->next)
+      {
+       if (mutt_strcasecmp (buf->data, tmp->name) == 0)
+       {
+         if (CurrentMenu == MENU_ALIAS)
+         {
+           tmp->del = 1;
+           set_option (OPTFORCEREDRAWINDEX);
+           break;
+         }
+
+         if (last)
+           last->next = tmp->next;
+         else
+           Aliases = tmp->next;
+         tmp->next = NULL;
+         mutt_free_alias (&tmp);
+         break;
+       }
+       last = tmp;
+      }
+  }
+  while (MoreArgs (s));
+  return 0;
+}
+
+static int parse_alias (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER 
*err)
+{
+  ALIAS *tmp = Aliases;
+  ALIAS *last = NULL;
+  char *estr = NULL;
+  
+  if (!MoreArgs (s))
+  {
+    strfcpy (err->data, _("alias: no address"), err->dsize);
+    return (-1);
+  }
+
+  mutt_extract_token (buf, s, 0);
+
+  dprint (2, (debugfile, "parse_alias: First token is '%s'.\n",
+             buf->data));
+  
+  /* check to see if an alias with this name already exists */
+  for (; tmp; tmp = tmp->next)
+  {
+    if (!mutt_strcasecmp (tmp->name, buf->data))
+      break;
+    last = tmp;
+  }
+
+  if (!tmp)
+  {
+    /* create a new alias */
+    tmp = (ALIAS *) safe_calloc (1, sizeof (ALIAS));
+    tmp->self = tmp;
+    tmp->name = safe_strdup (buf->data);
+    /* give the main addressbook code a chance */
+    if (CurrentMenu == MENU_ALIAS)
+      set_option (OPTMENUCALLER);
+  }
+  else
+  {
+    /* override the previous value */
+    rfc822_free_address (&tmp->addr);
+    if (CurrentMenu == MENU_ALIAS)
+      set_option (OPTFORCEREDRAWINDEX);
+  }
+
+  mutt_extract_token (buf, s, M_TOKEN_QUOTE | M_TOKEN_SPACE | 
M_TOKEN_SEMICOLON);
+  dprint (2, (debugfile, "parse_alias: Second token is '%s'.\n",
+             buf->data));
+  tmp->addr = mutt_parse_adrlist (tmp->addr, buf->data);
+  if (last)
+    last->next = tmp;
+  else
+    Aliases = tmp;
+  if (mutt_addrlist_to_idna (tmp->addr, &estr))
+  {
+    snprintf (err->data, err->dsize, _("Warning: Bad IDN '%s' in alias 
'%s'.\n"),
+             estr, tmp->name);
+    return -1;
+  }
+#ifdef DEBUG
+  if (debuglevel >= 2) 
+  {
+    ADDRESS *a;
+    for (a = tmp->addr; a; a = a->next)
+    {
+      if (!a->group)
+       dprint (2, (debugfile, "parse_alias:   %s\n",
+                   a->mailbox));
+      else
+       dprint (2, (debugfile, "parse_alias:   Group %s\n",
+                   a->mailbox));
+    }
+  }
+#endif
+  return 0;
+}
+
+static int
+parse_unmy_hdr (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER *err)
+{
+  LIST *last = NULL;
+  LIST *tmp = UserHeader;
+  LIST *ptr;
+  size_t l;
+
+  do
+  {
+    mutt_extract_token (buf, s, 0);
+    if (mutt_strcmp ("*", buf->data) == 0)
+      mutt_free_list (&UserHeader);
+    else
+    {
+      tmp = UserHeader;
+      last = NULL;
+
+      l = mutt_strlen (buf->data);
+      if (buf->data[l - 1] == ':')
+       l--;
+
+      while (tmp)
+      {
+       if (ascii_strncasecmp (buf->data, tmp->data, l) == 0 && tmp->data[l] == 
':')
+       {
+         ptr = tmp;
+         if (last)
+           last->next = tmp->next;
+         else
+           UserHeader = tmp->next;
+         tmp = tmp->next;
+         ptr->next = NULL;
+         mutt_free_list (&ptr);
+       }
+       else
+       {
+         last = tmp;
+         tmp = tmp->next;
+       }
+      }
+    }
+  }
+  while (MoreArgs (s));
+  return 0;
+}
+
+static int parse_my_hdr (BUFFER *buf, BUFFER *s, unsigned long data, BUFFER 
*err)
+{
+  LIST *tmp;
+  size_t keylen;
+  char *p;
+
+  mutt_extract_token (buf, s, M_TOKEN_SPACE | M_TOKEN_QUOTE);
+  if ((p = strpbrk (buf->data, ": \t")) == NULL || *p != ':')
+  {
+    strfcpy (err->data, _("invalid header field"), err->dsize);
+    return (-1);
+  }
+  keylen = p - buf->data + 1;
+
+  if (UserHeader)
+  {
+    for (tmp = UserHeader; ; tmp = tmp->next)
+    {
+      /* see if there is already a field by this name */
+      if (ascii_strncasecmp (buf->data, tmp->data, keylen) == 0)
+      {
+       /* replace the old value */
+       FREE (&tmp->data);
+       tmp->data = buf->data;
+       memset (buf, 0, sizeof (BUFFER));
+       return 0;
+      }
+      if (!tmp->next)
+       break;
+    }
+    tmp->next = mutt_new_list ();
+    tmp = tmp->next;
+  }
+  else
+  {
+    tmp = mutt_new_list ();
+    UserHeader = tmp;
+  }
+  tmp->data = buf->data;
+  memset (buf, 0, sizeof (BUFFER));
+  return 0;
+}
+
+static int
+parse_sort (short *val, const char *s, const struct mapping_t *map, BUFFER 
*err)
+{
+  int i, flags = 0;
+
+  if (mutt_strncmp ("reverse-", s, 8) == 0)
+  {
+    s += 8;
+    flags = SORT_REVERSE;
+  }
+  
+  if (mutt_strncmp ("last-", s, 5) == 0)
+  {
+    s += 5;
+    flags |= SORT_LAST;
+  }
+
+  if ((i = mutt_getvaluebyname (s, map)) == -1)
+  {
+    snprintf (err->data, err->dsize, _("%s: unknown sorting method"), s);
+    return (-1);
+  }
+
+  *val = i | flags;
+
+  return 0;
+}
+
+static void mutt_set_default (struct option_t *p)
+{
+  switch (p->type & DT_MASK)
+  {
+    case DT_STR:
+      if (!p->init && *((char **) p->data))
+        p->init = (unsigned long) safe_strdup (* ((char **) p->data));
+      break;
+    case DT_PATH:
+      if (!p->init && *((char **) p->data))
+      {
+       char *cp = safe_strdup (*((char **) p->data));
+       /* mutt_pretty_mailbox (cp); */
+        p->init = (unsigned long) cp;
+      }
+      break;
+    case DT_ADDR:
+      if (!p->init && *((ADDRESS **) p->data))
+      {
+       char tmp[HUGE_STRING];
+       *tmp = '\0';
+       rfc822_write_address (tmp, sizeof (tmp), *((ADDRESS **) p->data), 0);
+       p->init = (unsigned long) safe_strdup (tmp);
+      }
+      break;
+    case DT_RX:
+    {
+      REGEXP *pp = (REGEXP *) p->data;
+      if (!p->init && pp->pattern)
+       p->init = (unsigned long) safe_strdup (pp->pattern);
+      break;
+    }
+  }
+}
+
+static void mutt_restore_default (struct option_t *p)
+{
+  switch (p->type & DT_MASK)
+  {
+    case DT_STR:
+      if (p->init)
+       mutt_str_replace ((char **) p->data, (char *) p->init); 
+      break;
+    case DT_PATH:
+      if (p->init)
+      {
+       char path[_POSIX_PATH_MAX];
+
+       strfcpy (path, (char *) p->init, sizeof (path));
+       mutt_expand_path (path, sizeof (path));
+       mutt_str_replace ((char **) p->data, path);
+      }
+      break;
+    case DT_ADDR:
+      if (p->init)
+      {
+       rfc822_free_address ((ADDRESS **) p->data);
+       *((ADDRESS **) p->data) = rfc822_parse_adrlist (NULL, (char *) p->init);
+      }
+      break;
+    case DT_BOOL:
+      if (p->init)
+       set_option (p->data);
+      else
+       unset_option (p->data);
+      break;
+    case DT_QUAD:
+      set_quadoption (p->data, p->init);
+      break;
+    case DT_NUM:
+    case DT_SORT:
+    case DT_MAGIC:
+      *((short *) p->data) = p->init;
+      break;
+    case DT_RX:
+      {
+       REGEXP *pp = (REGEXP *) p->data;
+       int flags = 0;
+
+       FREE (&pp->pattern);
+       if (pp->rx)
+       {
+         regfree (pp->rx);
+         FREE (&pp->rx);
+       }
+
+       if (p->init)
+       {
+         char *s = (char *) p->init;
+
+         pp->rx = safe_calloc (1, sizeof (regex_t));
+         pp->pattern = safe_strdup ((char *) p->init);
+         if (mutt_strcmp (p->option, "alternates") == 0)
+           flags |= REG_ICASE;
+         else if (mutt_strcmp (p->option, "mask") != 0)
+           flags |= mutt_which_case ((const char *) p->init);
+         if (mutt_strcmp (p->option, "mask") == 0 && *s == '!')
+         {
+           s++;
+           pp->not = 1;
+         }
+         if (REGCOMP (pp->rx, s, flags) != 0)
+         {
+           fprintf (stderr, _("mutt_restore_default(%s): error in regexp: 
%s\n"),
+                    p->option, pp->pattern);
+           FREE (&pp->pattern);
+           regfree (pp->rx);
+           FREE (&pp->rx);
+         }
+       }
+      }
+      break;
+  }
+
+  if (p->flags & R_INDEX)
+    set_option (OPTFORCEREDRAWINDEX);
+  if (p->flags & R_PAGER)
+    set_option (OPTFORCEREDRAWPAGER);
+  if (p->flags & R_RESORT_SUB)
+    set_option (OPTSORTSUBTHREADS);
+  if (p->flags & R_RESORT)
+    set_option (OPTNEEDRESORT);
+  if (p->flags & R_RESORT_INIT)
+    set_option (OPTRESORTINIT);
+  if (p->flags & R_TREE)
+    set_option (OPTREDRAWTREE);
+}
+
+static int parse_set (BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER *err)
+{
+  int idx, query, unset, inv, reset, r = 0;
+  char *p, scratch[_POSIX_PATH_MAX];
+
+  while (MoreArgs (s))
+  {
+    /* reset state variables */
+    query = 0;
+    unset = data & M_SET_UNSET;
+    inv = data & M_SET_INV;
+    reset = data & M_SET_RESET;
+
+    if (*s->dptr == '?')
+    {
+      query = 1;
+      s->dptr++;
+    }
+    else if (mutt_strncmp ("no", s->dptr, 2) == 0)
+    {
+      s->dptr += 2;
+      unset = !unset;
+    }
+    else if (mutt_strncmp ("inv", s->dptr, 3) == 0)
+    {
+      s->dptr += 3;
+      inv = !inv;
+    }
+    else if (*s->dptr == '&')
+    {
+      reset = 1;
+      s->dptr++;
+    }
+
+    /* get the variable name */
+    mutt_extract_token (tmp, s, M_TOKEN_EQUAL);
+
+    if ((idx = mutt_option_index (tmp->data)) == -1 &&
+       !(reset && !mutt_strcmp ("all", tmp->data)))
+    {
+      snprintf (err->data, err->dsize, _("%s: unknown variable"), tmp->data);
+      return (-1);
+    }
+    SKIPWS (s->dptr);
+
+    if (reset)
+    {
+      if (query || unset || inv)
+      {
+       snprintf (err->data, err->dsize, _("prefix is illegal with reset"));
+       return (-1);
+      }
+
+      if (s && *s->dptr == '=')
+      {
+       snprintf (err->data, err->dsize, _("value is illegal with reset"));
+       return (-1);
+      }
+     
+      if (!mutt_strcmp ("all", tmp->data))
+      {
+       for (idx = 0; MuttVars[idx].option; idx++)
+         mutt_restore_default (&MuttVars[idx]);
+       return 0;
+      }
+      else
+       mutt_restore_default (&MuttVars[idx]);
+    } 
+    else if (DTYPE (MuttVars[idx].type) == DT_BOOL)
+    { 
+      if (s && *s->dptr == '=')
+      {
+       if (unset || inv || query)
+       {
+         snprintf (err->data, err->dsize, "Usage: set variable=yes|no");
+         return (-1);
+       }
+
+       s->dptr++;
+       mutt_extract_token (tmp, s, 0);
+       if (ascii_strcasecmp ("yes", tmp->data) == 0)
+         unset = inv = 0;
+       else if (ascii_strcasecmp ("no", tmp->data) == 0)
+         unset = 1;
+       else
+       {
+         snprintf (err->data, err->dsize, "Usage: set variable=yes|no");
+         return (-1);
+       }
+      }
+
+      if (query)
+      {
+       snprintf (err->data, err->dsize, option (MuttVars[idx].data)
+                       ? _("%s is set") : _("%s is unset"), tmp->data);
+       return 0;
+      }
+
+      if (unset)
+       unset_option (MuttVars[idx].data);
+      else if (inv)
+       toggle_option (MuttVars[idx].data);
+      else
+       set_option (MuttVars[idx].data);
+    }
+    else if (DTYPE (MuttVars[idx].type) == DT_STR ||
+            DTYPE (MuttVars[idx].type) == DT_PATH ||
+            DTYPE (MuttVars[idx].type) == DT_ADDR)
+    {
+      if (unset)
+      {
+       if (DTYPE (MuttVars[idx].type) == DT_ADDR)
+         rfc822_free_address ((ADDRESS **) MuttVars[idx].data);
+       else
+         FREE ((void *) MuttVars[idx].data);
+      }
+      else if (query || *s->dptr != '=')
+      {
+       char _tmp[STRING];
+       char *val = NULL;
+       
+       if (DTYPE (MuttVars[idx].type) == DT_ADDR)
+       {
+         _tmp[0] = '\0';
+         rfc822_write_address (_tmp, sizeof (_tmp), *((ADDRESS **) 
MuttVars[idx].data), 0);
+         val = _tmp;
+       }
+       else
+         val = *((char **) MuttVars[idx].data);
+       
+       /* user requested the value of this variable */
+       snprintf (err->data, err->dsize, "%s=\"%s\"", MuttVars[idx].option,
+                 NONULL (val));
+       break;
+      }
+      else
+      {
+        s->dptr++;
+
+        /* copy the value of the string */
+        if (DTYPE (MuttVars[idx].type) == DT_ADDR)
+         rfc822_free_address ((ADDRESS **) MuttVars[idx].data);
+        else
+         FREE ((void *) MuttVars[idx].data);
+
+        mutt_extract_token (tmp, s, 0);
+        if (DTYPE (MuttVars[idx].type) == DT_PATH)
+        {
+         strfcpy (scratch, tmp->data, sizeof (scratch));
+         mutt_expand_path (scratch, sizeof (scratch));
+         *((char **) MuttVars[idx].data) = safe_strdup (scratch);
+        }
+        else if (DTYPE (MuttVars[idx].type) == DT_STR)
+        {
+         *((char **) MuttVars[idx].data) = safe_strdup (tmp->data);
+         if (mutt_strcmp (MuttVars[idx].option, "charset") == 0)
+           mutt_set_charset (Charset);
+        }
+        else
+        {
+         *((ADDRESS **) MuttVars[idx].data) = rfc822_parse_adrlist (NULL, 
tmp->data);
+        }
+      }
+    }
+    else if (DTYPE(MuttVars[idx].type) == DT_RX)
+    {
+      REGEXP *ptr = (REGEXP *) MuttVars[idx].data;
+      regex_t *rx;
+      int e, flags = 0;
+
+      if (query || *s->dptr != '=')
+      {
+       /* user requested the value of this variable */
+       snprintf (err->data, err->dsize, "%s=\"%s\"", MuttVars[idx].option,
+                 NONULL (ptr->pattern));
+       break;
+      }
+
+      if (option(OPTATTACHMSG) && (!mutt_strcmp(MuttVars[idx].option, 
"alternates")
+                                  || !mutt_strcmp(MuttVars[idx].option, 
"reply_regexp")))
+      {
+       snprintf (err->data, err->dsize, "Operation not permitted when in 
attach-message mode.");
+       r = -1;
+       break;
+      }
+      
+      s->dptr++;
+
+      /* copy the value of the string */
+      mutt_extract_token (tmp, s, 0);
+
+      if (!ptr->pattern || mutt_strcmp (ptr->pattern, tmp->data) != 0)
+      {
+       int not = 0;
+
+       /* $alternates is case-insensitive,
+          $mask is case-sensitive */
+       if (mutt_strcmp (MuttVars[idx].option, "alternates") == 0)
+         flags |= REG_ICASE;
+       else if (mutt_strcmp (MuttVars[idx].option, "mask") != 0)
+         flags |= mutt_which_case (tmp->data);
+
+       p = tmp->data;
+       if (mutt_strcmp (MuttVars[idx].option, "mask") == 0)
+       {
+         if (*p == '!')
+         {
+           not = 1;
+           p++;
+         }
+       }
+         
+       rx = (regex_t *) safe_malloc (sizeof (regex_t));
+       if ((e = REGCOMP (rx, p, flags)) != 0)
+       {
+         regerror (e, rx, err->data, err->dsize);
+         regfree (rx);
+         FREE (&rx);
+         break;
+       }
+
+       /* get here only if everything went smootly */
+       if (ptr->pattern)
+       {
+         FREE (&ptr->pattern);
+         regfree ((regex_t *) ptr->rx);
+         FREE (&ptr->rx);
+       }
+
+       ptr->pattern = safe_strdup (tmp->data);
+       ptr->rx = rx;
+       ptr->not = not;
+
+       /* $reply_regexp and $alterantes require special treatment */
+       
+       if (Context && Context->msgcount &&
+           mutt_strcmp (MuttVars[idx].option, "reply_regexp") == 0)
+       {
+         regmatch_t pmatch[1];
+         int i;
+         
+#define CUR_ENV Context->hdrs[i]->env
+         for (i = 0; i < Context->msgcount; i++)
+         {
+           if (CUR_ENV && CUR_ENV->subject)
+           {
+             CUR_ENV->real_subj = (regexec (ReplyRegexp.rx,
+                                   CUR_ENV->subject, 1, pmatch, 0)) ?
+                                   CUR_ENV->subject : 
+                                   CUR_ENV->subject + pmatch[0].rm_eo;
+           }
+         }
+#undef CUR_ENV
+       }
+       
+       if(Context && Context->msgcount &&
+          mutt_strcmp(MuttVars[idx].option, "alternates") == 0)
+       {
+         int i;
+         
+         for(i = 0; i < Context->msgcount; i++)
+           Context->hdrs[i]->recip_valid = 0;
+       }
+      }
+    }
+    else if (DTYPE(MuttVars[idx].type) == DT_MAGIC)
+    {
+      if (query || *s->dptr != '=')
+      {
+       switch (DefaultMagic)
+       {
+         case M_MBOX:
+           p = "mbox";
+           break;
+         case M_MMDF:
+           p = "MMDF";
+           break;
+         case M_MH:
+           p = "MH";
+           break;
+         case M_MAILDIR:
+           p = "Maildir";
+           break;
+         default:
+           p = "unknown";
+           break;
+       }
+       snprintf (err->data, err->dsize, "%s=%s", MuttVars[idx].option, p);
+       break;
+      }
+
+      s->dptr++;
+
+      /* copy the value of the string */
+      mutt_extract_token (tmp, s, 0);
+      if (mx_set_magic (tmp->data))
+      {
+       snprintf (err->data, err->dsize, _("%s: invalid mailbox type"), 
tmp->data);
+       r = -1;
+       break;
+      }
+    }
+    else if (DTYPE(MuttVars[idx].type) == DT_NUM)
+    {
+      short *ptr = (short *) MuttVars[idx].data;
+      int val;
+      char *t;
+
+      if (query || *s->dptr != '=')
+      {
+       /* user requested the value of this variable */
+       snprintf (err->data, err->dsize, "%s=%d", MuttVars[idx].option, *ptr);
+       break;
+      }
+
+      s->dptr++;
+
+      mutt_extract_token (tmp, s, 0);
+      val = strtol (tmp->data, &t, 0);
+
+      if (!*tmp->data || *t || (short) val != val)
+      {
+       snprintf (err->data, err->dsize, _("%s: invalid value"), tmp->data);
+       r = -1;
+       break;
+      }
+      else
+       *ptr = (short) val;
+
+      /* these ones need a sanity check */
+      if (mutt_strcmp (MuttVars[idx].option, "history") == 0)
+      {
+       if (*ptr < 0)
+         *ptr = 0;
+       mutt_init_history ();
+      }
+      else if (mutt_strcmp (MuttVars[idx].option, "pager_index_lines") == 0)
+      {
+       if (*ptr < 0)
+         *ptr = 0;
+      }
+    }
+    else if (DTYPE (MuttVars[idx].type) == DT_QUAD)
+    {
+      if (query)
+      {
+       char *vals[] = { "no", "yes", "ask-no", "ask-yes" };
+
+       snprintf (err->data, err->dsize, "%s=%s", MuttVars[idx].option,
+                 vals [ quadoption (MuttVars[idx].data) ]);
+       break;
+      }
+
+      if (*s->dptr == '=')
+      {
+       s->dptr++;
+       mutt_extract_token (tmp, s, 0);
+       if (ascii_strcasecmp ("yes", tmp->data) == 0)
+         set_quadoption (MuttVars[idx].data, M_YES);
+       else if (ascii_strcasecmp ("no", tmp->data) == 0)
+         set_quadoption (MuttVars[idx].data, M_NO);
+       else if (ascii_strcasecmp ("ask-yes", tmp->data) == 0)
+         set_quadoption (MuttVars[idx].data, M_ASKYES);
+       else if (ascii_strcasecmp ("ask-no", tmp->data) == 0)
+         set_quadoption (MuttVars[idx].data, M_ASKNO);
+       else
+       {
+         snprintf (err->data, err->dsize, _("%s: invalid value"), tmp->data);
+         r = -1;
+         break;
+       }
+      }
+      else
+      {
+       if (inv)
+         toggle_quadoption (MuttVars[idx].data);
+       else if (unset)
+         set_quadoption (MuttVars[idx].data, M_NO);
+       else
+         set_quadoption (MuttVars[idx].data, M_YES);
+      }
+    }
+    else if (DTYPE (MuttVars[idx].type) == DT_SORT)
+    {
+      const struct mapping_t *map = NULL;
+
+      switch (MuttVars[idx].type & DT_SUBTYPE_MASK)
+      {
+       case DT_SORT_ALIAS:
+         map = SortAliasMethods;
+         break;
+       case DT_SORT_BROWSER:
+         map = SortBrowserMethods;
+         break;
+       case DT_SORT_KEYS:
+          if ((WithCrypto & APPLICATION_PGP))
+            map = SortKeyMethods;
+         break;
+       case DT_SORT_AUX:
+         map = SortAuxMethods;
+         break;
+       default:
+         map = SortMethods;
+         break;
+      }
+
+      if (!map)
+      {
+       snprintf (err->data, err->dsize, _("%s: Unknown type."), 
MuttVars[idx].option);
+       r = -1;
+       break;
+      }
+      
+      if (query || *s->dptr != '=')
+      {
+       p = mutt_getnamebyvalue (*((short *) MuttVars[idx].data) & SORT_MASK, 
map);
+
+       snprintf (err->data, err->dsize, "%s=%s%s%s", MuttVars[idx].option,
+                 (*((short *) MuttVars[idx].data) & SORT_REVERSE) ? "reverse-" 
: "",
+                 (*((short *) MuttVars[idx].data) & SORT_LAST) ? "last-" : "",
+                 p);
+       return 0;
+      }
+      s->dptr++;
+      mutt_extract_token (tmp, s , 0);
+
+      if (parse_sort ((short *) MuttVars[idx].data, tmp->data, map, err) == -1)
+      {
+       r = -1;
+       break;
+      }
+    }
+    else
+    {
+      snprintf (err->data, err->dsize, _("%s: unknown type"), 
MuttVars[idx].option);
+      r = -1;
+      break;
+    }
+
+    if (MuttVars[idx].flags & R_INDEX)
+      set_option (OPTFORCEREDRAWINDEX);
+    if (MuttVars[idx].flags & R_PAGER)
+      set_option (OPTFORCEREDRAWPAGER);
+    if (MuttVars[idx].flags & R_RESORT_SUB)
+      set_option (OPTSORTSUBTHREADS);
+    if (MuttVars[idx].flags & R_RESORT)
+      set_option (OPTNEEDRESORT);
+    if (MuttVars[idx].flags & R_RESORT_INIT)
+      set_option (OPTRESORTINIT);
+    if (MuttVars[idx].flags & R_TREE)
+      set_option (OPTREDRAWTREE);
+  }
+  return (r);
+}
+
+#define MAXERRS 128
+
+/* reads the specified initialization file.  returns -1 if errors were found
+   so that we can pause to let the user know...  */
+static int source_rc (const char *rcfile, BUFFER *err)
+{
+  FILE *f;
+  int line = 0, rc = 0, conv = 0;
+  BUFFER token;
+  char *linebuf = NULL;
+  char *currentline = NULL;
+  size_t buflen;
+  pid_t pid;
+
+  dprint (2, (debugfile, "Reading configuration file '%s'.\n",
+         rcfile));
+  
+  if ((f = mutt_open_read (rcfile, &pid)) == NULL)
+  {
+    snprintf (err->data, err->dsize, "%s: %s", rcfile, strerror (errno));
+    return (-1);
+  }
+
+  memset (&token, 0, sizeof (token));
+  while ((linebuf = mutt_read_line (linebuf, &buflen, f, &line)) != NULL)
+  {
+    conv=ConfigCharset && (*ConfigCharset) && Charset;
+    if (conv) 
+    {
+      currentline=safe_strdup(linebuf);
+      if (!currentline) continue;
+      mutt_convert_string(&currentline, ConfigCharset, Charset, 0);
+    } 
+    else 
+      currentline=linebuf;
+
+    if (mutt_parse_rc_line (currentline, &token, err) == -1)
+    {
+      mutt_error (_("Error in %s, line %d: %s"), rcfile, line, err->data);
+      if (--rc < -MAXERRS) 
+      {
+        if (conv) FREE(&currentline);
+        break;
+      }
+    }
+    else
+    {
+      if (rc < 0)
+        rc = -1;
+    }
+    if (conv) 
+      FREE(&currentline);
+  }
+  FREE (&token.data);
+  FREE (&linebuf);
+  fclose (f);
+  if (pid != -1)
+    mutt_wait_filter (pid);
+  if (rc)
+  {
+    /* the muttrc source keyword */
+    snprintf (err->data, err->dsize, rc >= -MAXERRS ? _("source: errors in %s")
+      : _("source: reading aborted due too many errors in %s"), rcfile);
+    rc = -1;
+  }
+  return (rc);
+}
+
+#undef MAXERRS
+
+static int parse_source (BUFFER *tmp, BUFFER *s, unsigned long data, BUFFER 
*err)
+{
+  char path[_POSIX_PATH_MAX];
+
+  if (mutt_extract_token (tmp, s, 0) != 0)
+  {
+    snprintf (err->data, err->dsize, _("source: error at %s"), s->dptr);
+    return (-1);
+  }
+  if (MoreArgs (s))
+  {
+    strfcpy (err->data, _("source: too many arguments"), err->dsize);
+    return (-1);
+  }
+  strfcpy (path, tmp->data, sizeof (path));
+  mutt_expand_path (path, sizeof (path));
+  return (source_rc (path, err));
+}
+
+/* line                command to execute
+
+   token       scratch buffer to be used by parser.  caller should free
+               token->data when finished.  the reason for this variable is
+               to avoid having to allocate and deallocate a lot of memory
+               if we are parsing many lines.  the caller can pass in the
+               memory to use, which avoids having to create new space for
+               every call to this function.
+
+   err         where to write error messages */
+int mutt_parse_rc_line (/* const */ char *line, BUFFER *token, BUFFER *err)
+{
+  int i, r = -1;
+  BUFFER expn;
+
+  memset (&expn, 0, sizeof (expn));
+  expn.data = expn.dptr = line;
+  expn.dsize = mutt_strlen (line);
+
+  *err->data = 0;
+
+  SKIPWS (expn.dptr);
+  while (*expn.dptr)
+  {
+    if (*expn.dptr == '#')
+      break; /* rest of line is a comment */
+    if (*expn.dptr == ';')
+    {
+      expn.dptr++;
+      continue;
+    }
+    mutt_extract_token (token, &expn, 0);
+    for (i = 0; Commands[i].name; i++)
+    {
+      if (!mutt_strcmp (token->data, Commands[i].name))
+      {
+       if (Commands[i].func (token, &expn, Commands[i].data, err) != 0)
+         goto finish;
+        break;
+      }
+    }
+    if (!Commands[i].name)
+    {
+      snprintf (err->data, err->dsize, _("%s: unknown command"), NONULL 
(token->data));
+      goto finish;
+    }
+  }
+  r = 0;
+finish:
+  if (expn.destroy)
+    FREE (&expn.data);
+  return (r);
+}
+
+
+#define NUMVARS (sizeof (MuttVars)/sizeof (MuttVars[0]))
+#define NUMCOMMANDS (sizeof (Commands)/sizeof (Commands[0]))
+/* initial string that starts completion. No telling how much crap 
+ * the user has typed so far. Allocate LONG_STRING just to be sure! */
+char User_typed [LONG_STRING] = {0}; 
+
+int  Num_matched = 0; /* Number of matches for completion */
+char Completed [STRING] = {0}; /* completed string (command or variable) */
+char *Matches[MAX(NUMVARS,NUMCOMMANDS) + 1]; /* all the matches + User_typed */
+
+/* helper function for completion.  Changes the dest buffer if
+   necessary/possible to aid completion.
+       dest == completion result gets here.
+       src == candidate for completion.
+       try == user entered data for completion.
+       len == length of dest buffer.
+*/
+static void candidate (char *dest, char *try, char *src, int len)
+{
+  int l;
+
+  if (strstr (src, try) == src)
+  {
+    Matches[Num_matched++] = src;
+    if (dest[0] == 0)
+      strfcpy (dest, src, len);
+    else
+    {
+      for (l = 0; src[l] && src[l] == dest[l]; l++);
+      dest[l] = 0;
+    }
+  }
+}
+
+int mutt_command_complete (char *buffer, size_t len, int pos, int numtabs)
+{
+  char *pt = buffer;
+  int num;
+  int spaces; /* keep track of the number of leading spaces on the line */
+
+  SKIPWS (buffer);
+  spaces = buffer - pt;
+
+  pt = buffer + pos - spaces;
+  while ((pt > buffer) && !isspace ((unsigned char) *pt))
+    pt--;
+
+  if (pt == buffer) /* complete cmd */
+  {
+    /* first TAB. Collect all the matches */
+    if (numtabs == 1)
+    {
+      Num_matched = 0;
+      strfcpy (User_typed, pt, sizeof (User_typed));
+      memset (Matches, 0, sizeof (Matches));
+      memset (Completed, 0, sizeof (Completed));
+      for (num = 0; Commands[num].name; num++)
+       candidate (Completed, User_typed, Commands[num].name, sizeof 
(Completed));
+      Matches[Num_matched++] = User_typed;
+
+      /* All matches are stored. Longest non-ambiguous string is ""
+       * i.e. dont change 'buffer'. Fake successful return this time */
+      if (User_typed[0] == 0)
+       return 1;
+    }
+
+    if (Completed[0] == 0 && User_typed[0])
+      return 0;
+
+     /* Num_matched will _always_ be atleast 1 since the initial
+      * user-typed string is always stored */
+    if (numtabs == 1 && Num_matched == 2)
+      snprintf(Completed, sizeof(Completed),"%s", Matches[0]);
+    else if (numtabs > 1 && Num_matched > 2)
+      /* cycle thru all the matches */
+      snprintf(Completed, sizeof(Completed), "%s", 
+              Matches[(numtabs - 2) % Num_matched]);
+
+    /* return the completed command */
+    strncpy (buffer, Completed, len - spaces);
+  }
+  else if (!mutt_strncmp (buffer, "set", 3)
+          || !mutt_strncmp (buffer, "unset", 5)
+          || !mutt_strncmp (buffer, "reset", 5)
+          || !mutt_strncmp (buffer, "toggle", 6))
+  {            /* complete variables */
+    char *prefixes[] = { "no", "inv", "?", "&", 0 };
+    
+    pt++;
+    /* loop through all the possible prefixes (no, inv, ...) */
+    if (!mutt_strncmp (buffer, "set", 3))
+    {
+      for (num = 0; prefixes[num]; num++)
+      {
+       if (!mutt_strncmp (pt, prefixes[num], mutt_strlen (prefixes[num])))
+       {
+         pt += mutt_strlen (prefixes[num]);
+         break;
+       }
+      }
+    }
+    
+    /* first TAB. Collect all the matches */
+    if (numtabs == 1)
+    {
+      Num_matched = 0;
+      strfcpy (User_typed, pt, sizeof (User_typed));
+      memset (Matches, 0, sizeof (Matches));
+      memset (Completed, 0, sizeof (Completed));
+      for (num = 0; MuttVars[num].option; num++)
+       candidate (Completed, User_typed, MuttVars[num].option, sizeof 
(Completed));
+      Matches[Num_matched++] = User_typed;
+
+      /* All matches are stored. Longest non-ambiguous string is ""
+       * i.e. dont change 'buffer'. Fake successful return this time */
+      if (User_typed[0] == 0)
+       return 1;
+    }
+
+    if (Completed[0] == 0 && User_typed[0])
+      return 0;
+
+    /* Num_matched will _always_ be atleast 1 since the initial
+     * user-typed string is always stored */
+    if (numtabs == 1 && Num_matched == 2)
+      snprintf(Completed, sizeof(Completed),"%s", Matches[0]);
+    else if (numtabs > 1 && Num_matched > 2)
+    /* cycle thru all the matches */
+      snprintf(Completed, sizeof(Completed), "%s", 
+              Matches[(numtabs - 2) % Num_matched]);
+
+    strncpy (pt, Completed, buffer + len - pt - spaces);
+  }
+  else if (!mutt_strncmp (buffer, "exec", 4))
+  {
+    struct binding_t *menu = km_get_table (CurrentMenu);
+
+    if (!menu && CurrentMenu != MENU_PAGER)
+      menu = OpGeneric;
+    
+    pt++;
+    /* first TAB. Collect all the matches */
+    if (numtabs == 1)
+    {
+      Num_matched = 0;
+      strfcpy (User_typed, pt, sizeof (User_typed));
+      memset (Matches, 0, sizeof (Matches));
+      memset (Completed, 0, sizeof (Completed));
+      for (num = 0; menu[num].name; num++)
+       candidate (Completed, User_typed, menu[num].name, sizeof (Completed));
+      /* try the generic menu */
+      if (Completed[0] == 0 && CurrentMenu != MENU_PAGER) 
+      {
+       menu = OpGeneric;
+       for (num = 0; menu[num].name; num++)
+         candidate (Completed, User_typed, menu[num].name, sizeof (Completed));
+      }
+      Matches[Num_matched++] = User_typed;
+
+      /* All matches are stored. Longest non-ambiguous string is ""
+       * i.e. dont change 'buffer'. Fake successful return this time */
+      if (User_typed[0] == 0)
+       return 1;
+    }
+
+    if (Completed[0] == 0 && User_typed[0])
+      return 0;
+
+    /* Num_matched will _always_ be atleast 1 since the initial
+     * user-typed string is always stored */
+    if (numtabs == 1 && Num_matched == 2)
+      snprintf(Completed, sizeof(Completed),"%s", Matches[0]);
+    else if (numtabs > 1 && Num_matched > 2)
+    /* cycle thru all the matches */
+      snprintf(Completed, sizeof(Completed), "%s", 
+              Matches[(numtabs - 2) % Num_matched]);
+
+    strncpy (pt, Completed, buffer + len - pt - spaces);
+  }
+  else
+    return 0;
+
+  return 1;
+}
+
+int mutt_var_value_complete (char *buffer, size_t len, int pos)
+{
+  char var[STRING], *pt = buffer;
+  int spaces;
+  
+  if (buffer[0] == 0)
+    return 0;
+
+  SKIPWS (buffer);
+  spaces = buffer - pt;
+
+  pt = buffer + pos - spaces;
+  while ((pt > buffer) && !isspace ((unsigned char) *pt))
+    pt--;
+  pt++; /* move past the space */
+  if (*pt == '=') /* abort if no var before the '=' */
+    return 0;
+
+  if (mutt_strncmp (buffer, "set", 3) == 0)
+  {
+    int idx;
+    strfcpy (var, pt, sizeof (var));
+    /* ignore the trailing '=' when comparing */
+    var[mutt_strlen (var) - 1] = 0;
+    if ((idx = mutt_option_index (var)) == -1) 
+      return 0; /* no such variable. */
+    else
+    {
+      char tmp [LONG_STRING], tmp2[LONG_STRING];
+      char *s, *d;
+      size_t dlen = buffer + len - pt - spaces;
+      char *vals[] = { "no", "yes", "ask-no", "ask-yes" };
+
+      tmp[0] = '\0';
+
+      if ((DTYPE(MuttVars[idx].type) == DT_STR) || 
+         (DTYPE(MuttVars[idx].type) == DT_PATH) ||
+         (DTYPE(MuttVars[idx].type) == DT_RX))
+      {
+       strfcpy (tmp, NONULL (*((char **) MuttVars[idx].data)), sizeof (tmp));
+       if (DTYPE (MuttVars[idx].type) == DT_PATH)
+         mutt_pretty_mailbox (tmp);
+      }
+      else if (DTYPE (MuttVars[idx].type) == DT_ADDR)
+      {
+       rfc822_write_address (tmp, sizeof (tmp), *((ADDRESS **) 
MuttVars[idx].data), 0);
+      }
+      else if (DTYPE (MuttVars[idx].type) == DT_QUAD)
+       strfcpy (tmp, vals[quadoption (MuttVars[idx].data)], sizeof (tmp));
+      else if (DTYPE (MuttVars[idx].type) == DT_NUM)
+       snprintf (tmp, sizeof (tmp), "%d", (*((short *) MuttVars[idx].data)));
+      else if (DTYPE (MuttVars[idx].type) == DT_SORT)
+      {
+       const struct mapping_t *map;
+       char *p;
+
+       switch (MuttVars[idx].type & DT_SUBTYPE_MASK)
+       {
+         case DT_SORT_ALIAS:
+           map = SortAliasMethods;
+           break;
+         case DT_SORT_BROWSER:
+           map = SortBrowserMethods;
+           break;
+         case DT_SORT_KEYS:
+            if ((WithCrypto & APPLICATION_PGP))
+              map = SortKeyMethods;
+            else
+              map = SortMethods;
+           break;
+         default:
+           map = SortMethods;
+           break;
+       }
+       p = mutt_getnamebyvalue (*((short *) MuttVars[idx].data) & SORT_MASK, 
map);
+       snprintf (tmp, sizeof (tmp), "%s%s%s",
+                 (*((short *) MuttVars[idx].data) & SORT_REVERSE) ? "reverse-" 
: "",
+                 (*((short *) MuttVars[idx].data) & SORT_LAST) ? "last-" : "",
+                 p);
+      }
+      else if (DTYPE (MuttVars[idx].type) == DT_BOOL)
+       strfcpy (tmp, option (MuttVars[idx].data) ? "yes" : "no", sizeof (tmp));
+      else
+       return 0;
+      
+      for (s = tmp, d = tmp2; *s && (d - tmp2) < sizeof (tmp2) - 2;)
+      {
+       if (*s == '\\' || *s == '"')
+         *d++ = '\\';
+       *d++ = *s++;
+      }
+      *d = '\0';
+      
+      strfcpy (tmp, pt, sizeof (tmp));
+      snprintf (pt, dlen, "%s\"%s\"", tmp, tmp2);
+         
+      return 1;
+    }
+  }
+  return 0;
+}
+
+/* Implement the -Q command line flag */
+int mutt_query_variables (LIST *queries)
+{
+  LIST *p;
+  
+  char errbuff[STRING];
+  char command[STRING];
+  
+  BUFFER err, token;
+  
+  memset (&err, 0, sizeof (err));
+  memset (&token, 0, sizeof (token));
+  
+  err.data = errbuff;
+  err.dsize = sizeof (errbuff);
+  
+  for (p = queries; p; p = p->next)
+  {
+    snprintf (command, sizeof (command), "set ?%s\n", p->data);
+    if (mutt_parse_rc_line (command, &token, &err) == -1)
+    {
+      fprintf (stderr, "%s\n", err.data);
+      FREE (&token.data);
+      return 1;
+    }
+    printf ("%s\n", err.data);
+  }
+  
+  FREE (&token.data);
+  return 0;
+}
+
+char *mutt_getnamebyvalue (int val, const struct mapping_t *map)
+{
+  int i;
+
+  for (i=0; map[i].name; i++)
+    if (map[i].value == val)
+      return (map[i].name);
+  return NULL;
+}
+
+int mutt_getvaluebyname (const char *name, const struct mapping_t *map)
+{
+  int i;
+
+  for (i = 0; map[i].name; i++)
+    if (ascii_strcasecmp (map[i].name, name) == 0)
+      return (map[i].value);
+  return (-1);
+}
+
+#ifdef DEBUG
+static void start_debug (void)
+{
+  time_t t;
+  int i;
+  char buf[_POSIX_PATH_MAX];
+  char buf2[_POSIX_PATH_MAX];
+
+  /* rotate the old debug logs */
+  for (i=3; i>=0; i--)
+  {
+    snprintf (buf, sizeof(buf), "%s/.muttdebug%d", NONULL(Homedir), i);
+    snprintf (buf2, sizeof(buf2), "%s/.muttdebug%d", NONULL(Homedir), i+1);
+    rename (buf, buf2);
+  }
+  if ((debugfile = safe_fopen(buf, "w")) != NULL)
+  {
+    t = time (0);
+    setbuf (debugfile, NULL); /* don't buffer the debugging output! */
+    fprintf (debugfile, "Mutt %s started at %s.\nDebugging at level %d.\n\n",
+            MUTT_VERSION, asctime (localtime (&t)), debuglevel);
+  }
+}
+#endif
+
+static int mutt_execute_commands (LIST *p)
+{
+  BUFFER err, token;
+  char errstr[SHORT_STRING];
+
+  memset (&err, 0, sizeof (err));
+  err.data = errstr;
+  err.dsize = sizeof (errstr);
+  memset (&token, 0, sizeof (token));
+  for (; p; p = p->next)
+  {
+    if (mutt_parse_rc_line (p->data, &token, &err) != 0)
+    {
+      fprintf (stderr, _("Error in command line: %s\n"), err.data);
+      FREE (&token.data);
+      return (-1);
+    }
+  }
+  FREE (&token.data);
+  return 0;
+}
+
+void mutt_init (int skip_sys_rc, LIST *commands)
+{
+  struct passwd *pw;
+  struct utsname utsname;
+  char *p, buffer[STRING], error[STRING];
+  int i, default_rc = 0, need_pause = 0;
+  BUFFER err;
+
+  memset (&err, 0, sizeof (err));
+  err.data = error;
+  err.dsize = sizeof (error);
+
+  /* 
+   * XXX - use something even more difficult to predict?
+   */
+  snprintf (AttachmentMarker, sizeof (AttachmentMarker),
+           "\033]9;%ld\a", (long) time (NULL));
+  
+  /* on one of the systems I use, getcwd() does not return the same prefix
+     as is listed in the passwd file */
+  if ((p = getenv ("HOME")))
+    Homedir = safe_strdup (p);
+
+  /* Get some information about the user */
+  if ((pw = getpwuid (getuid ())))
+  {
+    char rnbuf[STRING];
+
+    Username = safe_strdup (pw->pw_name);
+    if (!Homedir)
+      Homedir = safe_strdup (pw->pw_dir);
+
+    Realname = safe_strdup (mutt_gecos_name (rnbuf, sizeof (rnbuf), pw));
+    Shell = safe_strdup (pw->pw_shell);
+  }
+  else 
+  {
+    if (!Homedir)
+    {
+      mutt_endwin (NULL);
+      fputs (_("unable to determine home directory"), stderr);
+      exit (1);
+    }
+    if ((p = getenv ("USER")))
+      Username = safe_strdup (p);
+    else
+    {
+      mutt_endwin (NULL);
+      fputs (_("unable to determine username"), stderr);
+      exit (1);
+    }
+    Shell = safe_strdup ((p = getenv ("SHELL")) ? p : "/bin/sh");
+  }
+
+#ifdef DEBUG
+  /* Start up debugging mode if requested */
+  if (debuglevel > 0)
+    start_debug ();
+#endif
+
+  /* And about the host... */
+  uname (&utsname);
+  /* some systems report the FQDN instead of just the hostname */
+  if ((p = strchr (utsname.nodename, '.')))
+  {
+    Hostname = mutt_substrdup (utsname.nodename, p);
+    p++;
+    strfcpy (buffer, p, sizeof (buffer)); /* save the domain for below */
+  }
+  else
+    Hostname = safe_strdup (utsname.nodename);
+
+#ifndef DOMAIN
+#define DOMAIN buffer
+  if (!p && getdnsdomainname (buffer, sizeof (buffer)) == -1)
+    Fqdn = safe_strdup ("@");
+  else
+#endif /* DOMAIN */
+    if (*DOMAIN != '@')
+  {
+    Fqdn = safe_malloc (mutt_strlen (DOMAIN) + mutt_strlen (Hostname) + 2);
+    sprintf (Fqdn, "%s.%s", NONULL(Hostname), DOMAIN); /* __SPRINTF_CHECKED__ 
*/
+  }
+  else
+    Fqdn = safe_strdup(NONULL(Hostname));
+
+  if ((p = getenv ("MAIL")))
+    Spoolfile = safe_strdup (p);
+  else if ((p = getenv ("MAILDIR")))
+    Spoolfile = safe_strdup (p);
+  else
+  {
+#ifdef HOMESPOOL
+    mutt_concat_path (buffer, NONULL (Homedir), MAILPATH, sizeof (buffer));
+#else
+    mutt_concat_path (buffer, MAILPATH, NONULL(Username), sizeof (buffer));
+#endif
+    Spoolfile = safe_strdup (buffer);
+  }
+
+  if ((p = getenv ("MAILCAPS")))
+    MailcapPath = safe_strdup (p);
+  else
+  {
+    /* Default search path from RFC1524 */
+    MailcapPath = safe_strdup ("~/.mailcap:" PKGDATADIR "/mailcap:" SYSCONFDIR 
"/mailcap:/etc/mailcap:/usr/etc/mailcap:/usr/local/etc/mailcap");
+  }
+
+  Tempdir = safe_strdup ((p = getenv ("TMPDIR")) ? p : "/tmp");
+
+  p = getenv ("VISUAL");
+  if (!p)
+  {
+    p = getenv ("EDITOR");
+    if (!p)
+      p = "vi";
+  }
+  Editor = safe_strdup (p);
+  Visual = safe_strdup (p);
+
+  if ((p = getenv ("REPLYTO")) != NULL)
+  {
+    BUFFER buf, token;
+
+    snprintf (buffer, sizeof (buffer), "Reply-To: %s", p);
+
+    memset (&buf, 0, sizeof (buf));
+    buf.data = buf.dptr = buffer;
+    buf.dsize = mutt_strlen (buffer);
+
+    memset (&token, 0, sizeof (token));
+    parse_my_hdr (&token, &buf, 0, &err);
+    FREE (&token.data);
+  }
+
+  if ((p = getenv ("EMAIL")) != NULL)
+    From = rfc822_parse_adrlist (NULL, p);
+  
+  mutt_set_langinfo_charset ();
+  mutt_set_charset (Charset);
+  
+  
+  /* Set standard defaults */
+  for (i = 0; MuttVars[i].option; i++)
+  {
+    mutt_set_default (&MuttVars[i]);
+    mutt_restore_default (&MuttVars[i]);
+  }
+
+  CurrentMenu = MENU_MAIN;
+
+
+#ifndef LOCALES_HACK
+  /* Do we have a locale definition? */
+  if (((p = getenv ("LC_ALL")) != NULL && p[0]) ||
+      ((p = getenv ("LANG")) != NULL && p[0]) ||
+      ((p = getenv ("LC_CTYPE")) != NULL && p[0]))
+    set_option (OPTLOCALES);
+#endif
+
+#ifdef HAVE_GETSID
+  /* Unset suspend by default if we're the session leader */
+  if (getsid(0) == getpid())
+    unset_option (OPTSUSPEND);
+#endif
+
+  mutt_init_history ();
+
+  
+  
+  
+  /*
+   * 
+   *                      BIG FAT WARNING
+   * 
+   * When changing the code which looks for a configuration file,
+   * please also change the corresponding code in muttbug.sh.in.
+   * 
+   * 
+   */
+  
+  
+  
+  
+  if (!Muttrc)
+  {
+    snprintf (buffer, sizeof(buffer), "%s/.muttrc-%s", NONULL(Homedir), 
MUTT_VERSION);
+    if (access(buffer, F_OK) == -1)
+      snprintf (buffer, sizeof(buffer), "%s/.muttrc", NONULL(Homedir));
+    if (access(buffer, F_OK) == -1)
+      snprintf (buffer, sizeof (buffer), "%s/.mutt/muttrc-%s", 
NONULL(Homedir), MUTT_VERSION);
+    if (access(buffer, F_OK) == -1)
+      snprintf (buffer, sizeof (buffer), "%s/.mutt/muttrc", NONULL(Homedir));
+    
+    default_rc = 1;
+    Muttrc = safe_strdup (buffer);
+  }
+  else
+  {
+    strfcpy (buffer, Muttrc, sizeof (buffer));
+    FREE (&Muttrc);
+    mutt_expand_path (buffer, sizeof (buffer));
+    Muttrc = safe_strdup (buffer);
+  }
+  FREE (&AliasFile);
+  AliasFile = safe_strdup (NONULL(Muttrc));
+
+  /* Process the global rc file if it exists and the user hasn't explicity
+     requested not to via "-n".  */
+  if (!skip_sys_rc)
+  {
+    snprintf (buffer, sizeof(buffer), "%s/Muttrc-%s", SYSCONFDIR, 
MUTT_VERSION);
+    if (access (buffer, F_OK) == -1)
+      snprintf (buffer, sizeof(buffer), "%s/Muttrc", SYSCONFDIR);
+    if (access (buffer, F_OK) == -1)
+      snprintf (buffer, sizeof (buffer), "%s/Muttrc-%s", PKGDATADIR, 
MUTT_VERSION);
+    if (access (buffer, F_OK) == -1)
+      snprintf (buffer, sizeof (buffer), "%s/Muttrc", PKGDATADIR);
+    if (access (buffer, F_OK) != -1)
+    {
+      if (source_rc (buffer, &err) != 0)
+      {
+       fputs (err.data, stderr);
+       fputc ('\n', stderr);
+       need_pause = 1;
+      }
+    }
+  }
+
+  /* Read the user's initialization file.  */
+  if (access (Muttrc, F_OK) != -1)
+  {
+    if (!option (OPTNOCURSES))
+      endwin ();
+    if (source_rc (Muttrc, &err) != 0)
+    {
+      fputs (err.data, stderr);
+      fputc ('\n', stderr);
+      need_pause = 1;
+    }
+  }
+  else if (!default_rc)
+  {
+    /* file specified by -F does not exist */
+    snprintf (buffer, sizeof (buffer), "%s: %s", Muttrc, strerror (errno));
+    mutt_endwin (buffer);
+    exit (1);
+  }
+
+  if (mutt_execute_commands (commands) != 0)
+    need_pause = 1;
+
+  if (need_pause && !option (OPTNOCURSES))
+  {
+    if (mutt_any_key_to_continue (NULL) == -1)
+      mutt_exit(1);
+  }
+
+#if 0
+  set_option (OPTWEED); /* turn weeding on by default */
+#endif
+}
+
+int mutt_get_hook_type (const char *name)
+{
+  struct command_t *c;
+
+  for (c = Commands ; c->name ; c++)
+    if (c->func == mutt_parse_hook && ascii_strcasecmp (c->name, name) == 0)
+      return c->data;
+  return 0;
+}
diff -urN mutt.20041014.orig/init.h mutt.20041014/init.h
--- mutt.20041014.orig/init.h   Mon Aug 30 14:05:40 2004
+++ mutt.20041014/init.h        Thu Oct 14 13:45:16 2004
@@ -2834,6 +2834,8 @@
 struct command_t Commands[] = {
   { "alternates",      parse_rx_list,          UL &Alternates },
   { "unalternates",    parse_rx_unlist,        UL &Alternates },
+  { "notalternates",   parse_rx_list,          UL &Notalternates },
+  { "unnotalternates", parse_rx_unlist,        UL &Notalternates },
 #ifdef USE_SOCKET
   { "account-hook",     mutt_parse_hook,        M_ACCOUNTHOOK },
 #endif
diff -urN mutt.20041014.orig/init.h.orig mutt.20041014/init.h.orig
--- mutt.20041014.orig/init.h.orig      Wed Dec 31 18:00:00 1969
+++ mutt.20041014/init.h.orig   Mon Aug 30 14:05:40 2004
@@ -0,0 +1,2895 @@
+/*
+ * Copyright (C) 1996-2002 Michael R. Elkins <me@xxxxxxxx>
+ * Copyright (C) 2004 g10 Code GmbH
+ * 
+ *     This program is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation; either version 2 of the License, or
+ *     (at your option) any later version.
+ * 
+ *     This program is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ * 
+ *     You should have received a copy of the GNU General Public License
+ *     along with this program; if not, write to the Free Software
+ *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ */ 
+
+#ifdef _MAKEDOC
+# include "config.h"
+#else
+# include "sort.h"
+#endif
+
+#include "buffy.h"
+
+#ifndef _MAKEDOC
+#define DT_MASK                0x0f
+#define DT_BOOL                1 /* boolean option */
+#define DT_NUM         2 /* a number */
+#define DT_STR         3 /* a string */
+#define DT_PATH                4 /* a pathname */
+#define DT_QUAD                5 /* quad-option (yes/no/ask-yes/ask-no) */
+#define DT_SORT                6 /* sorting methods */
+#define DT_RX          7 /* regular expressions */
+#define DT_MAGIC       8 /* mailbox type */
+#define DT_SYN         9 /* synonym for another variable */
+#define DT_ADDR               10 /* e-mail address */
+
+#define DTYPE(x) ((x) & DT_MASK)
+
+/* subtypes */
+#define DT_SUBTYPE_MASK        0xf0
+#define DT_SORT_ALIAS  0x10
+#define DT_SORT_BROWSER 0x20
+#define DT_SORT_KEYS   0x40
+#define DT_SORT_AUX    0x80
+
+/* flags to parse_set() */
+#define M_SET_INV      (1<<0)  /* default is to invert all vars */
+#define M_SET_UNSET    (1<<1)  /* default is to unset all vars */
+#define M_SET_RESET    (1<<2)  /* default is to reset all vars to default */
+
+/* forced redraw/resort types */
+#define R_NONE         0
+#define R_INDEX                (1<<0)
+#define R_PAGER                (1<<1)
+#define R_RESORT       (1<<2)  /* resort the mailbox */
+#define R_RESORT_SUB   (1<<3)  /* resort subthreads */
+#define R_RESORT_INIT  (1<<4)  /* resort from scratch */
+#define R_TREE         (1<<5)  /* redraw the thread tree */
+#define R_BOTH         (R_INDEX | R_PAGER)
+#define R_RESORT_BOTH  (R_RESORT | R_RESORT_SUB)
+
+struct option_t
+{
+  char *option;
+  short type;
+  short flags;
+  unsigned long data;
+  unsigned long init; /* initial value */
+};
+
+#define UL (unsigned long)
+
+#endif /* _MAKEDOC */
+
+#ifndef ISPELL
+#define ISPELL "ispell"
+#endif
+
+/* build complete documentation */
+
+#ifdef _MAKEDOC
+# ifndef USE_IMAP
+#  define USE_IMAP
+# endif
+# ifndef MIXMASTER
+#  define MIXMASTER "mixmaster"
+# endif
+# ifndef USE_POP
+#  define USE_POP
+# endif
+# ifndef USE_SSL
+#  define USE_SSL
+# endif
+# ifndef USE_SOCKET
+#  define USE_SOCKET
+# endif
+#endif
+
+struct option_t MuttVars[] = {
+  /*++*/
+  { "abort_nosubject", DT_QUAD, R_NONE, OPT_SUBJECT, M_ASKYES },
+  /*
+  ** .pp
+  ** If set to \fIyes\fP, when composing messages and no subject is given
+  ** at the subject prompt, composition will be aborted.  If set to
+  ** \fIno\fP, composing messages with no subject given at the subject
+  ** prompt will never be aborted.
+  */
+  { "abort_unmodified",        DT_QUAD, R_NONE, OPT_ABORT, M_YES },
+  /*
+  ** .pp
+  ** If set to \fIyes\fP, composition will automatically abort after
+  ** editing the message body if no changes are made to the file (this
+  ** check only happens after the \fIfirst\fP edit of the file).  When set
+  ** to \fIno\fP, composition will never be aborted.
+  */
+  { "alias_file",      DT_PATH, R_NONE, UL &AliasFile, UL "~/.muttrc" },
+  /*
+  ** .pp
+  ** The default file in which to save aliases created by the 
+  ** ``$create-alias'' function.
+  ** .pp
+  ** \fBNote:\fP Mutt will not automatically source this file; you must
+  ** explicitly use the ``$source'' command for it to be executed.
+  */
+  { "alias_format",    DT_STR,  R_NONE, UL &AliasFmt, UL "%4n %2f %t %-10a   
%r" },
+  /*
+  ** .pp
+  ** Specifies the format of the data displayed for the `alias' menu.  The
+  ** following printf(3)-style sequences are available:
+  ** .pp
+  ** .dl
+  ** .dt %a .dd alias name
+  ** .dt %f .dd flags - currently, a "d" for an alias marked for deletion
+  ** .dt %n .dd index number
+  ** .dt %r .dd address which alias expands to
+  ** .dt %t .dd character which indicates if the alias is tagged for inclusion
+  ** .de
+  */
+  { "allow_8bit",      DT_BOOL, R_NONE, OPTALLOW8BIT, 1 },
+  /*
+  ** .pp
+  ** Controls whether 8-bit data is converted to 7-bit using either Quoted-
+  ** Printable or Base64 encoding when sending mail.
+  */
+  { "allow_ansi",      DT_BOOL, R_NONE, OPTALLOWANSI, 0 },
+  /*
+  ** .pp
+  ** Controls whether ANSI color codes in messages (and color tags in 
+  ** rich text messages) are to be interpreted.
+  ** Messages containing these codes are rare, but if this option is set,
+  ** their text will be colored accordingly. Note that this may override
+  ** your color choices, and even present a security problem, since a
+  ** message could include a line like "[-- PGP output follows ..." and
+  ** give it the same color as your attachment color.
+  */
+  { "arrow_cursor",    DT_BOOL, R_BOTH, OPTARROWCURSOR, 0 },
+  /*
+  ** .pp
+  ** When set, an arrow (``->'') will be used to indicate the current entry
+  ** in menus instead of highlighting the whole line.  On slow network or modem
+  ** links this will make response faster because there is less that has to
+  ** be redrawn on the screen when moving to the next or previous entries
+  ** in the menu.
+  */
+  { "ascii_chars",     DT_BOOL, R_BOTH, OPTASCIICHARS, 0 },
+  /*
+  ** .pp
+  ** If set, Mutt will use plain ASCII characters when displaying thread
+  ** and attachment trees, instead of the default \fIACS\fP characters.
+  */
+  { "askbcc",          DT_BOOL, R_NONE, OPTASKBCC, 0 },
+  /*
+  ** .pp
+  ** If set, Mutt will prompt you for blind-carbon-copy (Bcc) recipients
+  ** before editing an outgoing message.
+  */
+  { "askcc",           DT_BOOL, R_NONE, OPTASKCC, 0 },
+  /*
+  ** .pp
+  ** If set, Mutt will prompt you for carbon-copy (Cc) recipients before
+  ** editing the body of an outgoing message.
+  */  
+  { "attach_format",   DT_STR,  R_NONE, UL &AttachFormat, UL "%u%D%I %t%4n 
%T%.40d%> [%.7m/%.10M, %.6e%?C?, %C?, %s] " },
+  /*
+  ** .pp
+  ** This variable describes the format of the `attachment' menu.  The
+  ** following printf-style sequences are understood:
+  ** .pp
+  ** .dl
+  ** .dt %C  .dd charset
+  ** .dt %c  .dd requires charset conversion (n or c)
+  ** .dt %D  .dd deleted flag
+  ** .dt %d  .dd description
+  ** .dt %e  .dd MIME content-transfer-encoding
+  ** .dt %f  .dd filename
+  ** .dt %I  .dd disposition (I=inline, A=attachment)
+  ** .dt %m  .dd major MIME type
+  ** .dt %M  .dd MIME subtype
+  ** .dt %n  .dd attachment number
+  ** .dt %s  .dd size
+  ** .dt %t  .dd tagged flag
+  ** .dt %T  .dd graphic tree characters
+  ** .dt %u  .dd unlink (=to delete) flag
+  ** .dt %>X .dd right justify the rest of the string and pad with character 
"X"
+  ** .dt %|X .dd pad to the end of the line with character "X"
+  ** .de
+  */
+  { "attach_sep",      DT_STR,  R_NONE, UL &AttachSep, UL "\n" },
+  /*
+  ** .pp
+  ** The separator to add between attachments when operating (saving,
+  ** printing, piping, etc) on a list of tagged attachments.
+  */
+  { "attach_split",    DT_BOOL, R_NONE, OPTATTACHSPLIT, 1 },
+  /*
+  ** .pp
+  ** If this variable is unset, when operating (saving, printing, piping,
+  ** etc) on a list of tagged attachments, Mutt will concatenate the
+  ** attachments and will operate on them as a single attachment. The
+  ** ``$$attach_sep'' separator is added after each attachment. When set,
+  ** Mutt will operate on the attachments one by one.
+  */
+  { "attribution",     DT_STR,  R_NONE, UL &Attribution, UL "On %d, %n wrote:" 
},
+  /*
+  ** .pp
+  ** This is the string that will precede a message which has been included
+  ** in a reply.  For a full listing of defined printf()-like sequences see
+  ** the section on ``$$index_format''.
+  */
+  { "autoedit",                DT_BOOL, R_NONE, OPTAUTOEDIT, 0 },
+  /*
+  ** .pp
+  ** When set along with ``$$edit_headers'', Mutt will skip the initial
+  ** send-menu and allow you to immediately begin editing the body of your
+  ** message.  The send-menu may still be accessed once you have finished
+  ** editing the body of your message.
+  ** .pp
+  ** Also see ``$$fast_reply''.
+  */
+  { "auto_tag",                DT_BOOL, R_NONE, OPTAUTOTAG, 0 },
+  /*
+  ** .pp
+  ** When set, functions in the \fIindex\fP menu which affect a message
+  ** will be applied to all tagged messages (if there are any).  When
+  ** unset, you must first use the tag-prefix function (default: ";") to
+  ** make the next function apply to all tagged messages.
+  */
+  { "beep",            DT_BOOL, R_NONE, OPTBEEP, 1 },
+  /*
+  ** .pp
+  ** When this variable is set, mutt will beep when an error occurs.
+  */
+  { "beep_new",                DT_BOOL, R_NONE, OPTBEEPNEW, 0 },
+  /*
+  ** .pp
+  ** When this variable is set, mutt will beep whenever it prints a message
+  ** notifying you of new mail.  This is independent of the setting of the
+  ** ``$$beep'' variable.
+  */
+  { "bounce",  DT_QUAD, R_NONE, OPT_BOUNCE, M_ASKYES },
+  /*
+  ** .pp
+  ** Controls whether you will be asked to confirm bouncing messages.
+  ** If set to \fIyes\fP you don't get asked if you want to bounce a
+  ** message. Setting this variable to \fIno\fP is not generally useful,
+  ** and thus not recommended, because you are unable to bounce messages.
+  */
+  { "bounce_delivered", DT_BOOL, R_NONE, OPTBOUNCEDELIVERED, 1 },
+  /*
+  ** .pp
+  ** When this variable is set, mutt will include Delivered-To headers when
+  ** bouncing messages.  Postfix users may wish to unset this variable.
+  */
+  { "charset",         DT_STR,  R_NONE, UL &Charset, UL 0 },
+  /*
+  ** .pp
+  ** Character set your terminal uses to display and enter textual data.
+  */
+  { "check_new",       DT_BOOL, R_NONE, OPTCHECKNEW, 1 },
+  /*
+  ** .pp
+  ** \fBNote:\fP this option only affects \fImaildir\fP and \fIMH\fP style
+  ** mailboxes.
+  ** .pp
+  ** When \fIset\fP, Mutt will check for new mail delivered while the
+  ** mailbox is open.  Especially with MH mailboxes, this operation can
+  ** take quite some time since it involves scanning the directory and
+  ** checking each file to see if it has already been looked at.  If
+  ** \fIcheck_new\fP is \fIunset\fP, no check for new mail is performed
+  ** while the mailbox is open.
+  */
+  { "collapse_unread", DT_BOOL, R_NONE, OPTCOLLAPSEUNREAD, 1 },
+  /*
+  ** .pp
+  ** When \fIunset\fP, Mutt will not collapse a thread if it contains any
+  ** unread messages.
+  */
+  { "uncollapse_jump",         DT_BOOL, R_NONE, OPTUNCOLLAPSEJUMP, 0 },
+  /*
+  ** .pp
+  ** When \fIset\fP, Mutt will jump to the next unread message, if any,
+  ** when the current thread is \fIun\fPcollapsed.
+  */
+  { "compose_format",  DT_STR,  R_BOTH, UL &ComposeFormat, UL "-- Mutt: 
Compose  [Approx. msg size: %l   Atts: %a]%>-" },
+  /*
+  ** .pp
+  ** Controls the format of the status line displayed in the \fICompose\fP
+  ** menu.  This string is similar to ``$$status_format'', but has its own
+  ** set of printf()-like sequences:
+  ** .pp
+  ** .dl
+  ** .dt %a .dd total number of attachments 
+  ** .dt %h .dd local hostname
+  ** .dt %l .dd approximate size (in bytes) of the current message
+  ** .dt %v .dd Mutt version string
+  ** .de
+  ** .pp
+  ** See the text describing the ``$$status_format'' option for more 
+  ** information on how to set ``$$compose_format''.
+  */
+  { "config_charset",  DT_STR,  R_NONE, UL &ConfigCharset, UL 0 },
+  /*
+  ** .pp
+  ** When defined, Mutt will recode commands in rc files from this
+  ** encoding.
+  */
+  { "confirmappend",   DT_BOOL, R_NONE, OPTCONFIRMAPPEND, 1 },
+  /*
+  ** .pp
+  ** When set, Mutt will prompt for confirmation when appending messages to
+  ** an existing mailbox.
+  */
+  { "confirmcreate",   DT_BOOL, R_NONE, OPTCONFIRMCREATE, 1 },
+  /*
+  ** .pp
+  ** When set, Mutt will prompt for confirmation when saving messages to a
+  ** mailbox which does not yet exist before creating it.
+  */
+  { "connect_timeout", DT_NUM, R_NONE, UL &ConnectTimeout, 30 },
+  /*
+  ** .pp
+  ** Causes Mutt to timeout a network connection (for IMAP or POP) after this
+  ** many seconds if the connection is not able to be established.  A negative
+  ** value causes Mutt to wait indefinitely for the connection to succeed.
+  */
+  { "content_type",    DT_STR, R_NONE, UL &ContentType, UL "text/plain" },
+  /*
+  ** .pp
+  ** Sets the default Content-Type for the body of newly composed messages.
+  */
+  { "copy",            DT_QUAD, R_NONE, OPT_COPY, M_YES },
+  /*
+  ** .pp
+  ** This variable controls whether or not copies of your outgoing messages
+  ** will be saved for later references.  Also see ``$$record'',
+  ** ``$$save_name'', ``$$force_name'' and ``$fcc-hook''.
+  */
+  
+  { "crypt_use_gpgme",  DT_BOOL, R_NONE, OPTCRYPTUSEGPGME, 0 },
+  /*
+  ** .pp
+  ** This variable controls the use the GPGME enabled crypto backends.
+  ** If it is set and Mutt was build with gpgme support, the gpgme code for
+  ** S/MIME and PGP will be used instead of the classic code.  Note, that
+  ** you need to use this option in .muttrc as it won't have any effect when 
+  ** used interactively.
+  */
+  
+  { "crypt_autopgp",   DT_BOOL, R_NONE, OPTCRYPTAUTOPGP, 1 },
+  /*
+  ** .pp
+  ** This variable controls whether or not mutt may automatically enable
+  ** PGP encryption/signing for messages.  See also ``$$crypt_autoencrypt'',
+  ** ``$$crypt_replyencrypt'',
+  ** ``$$crypt_autosign'', ``$$crypt_replysign'' and ``$$smime_is_default''.
+  */
+  { "crypt_autosmime", DT_BOOL, R_NONE, OPTCRYPTAUTOSMIME, 1 },
+  /*
+  ** .pp
+  ** This variable controls whether or not mutt may automatically enable
+  ** S/MIME encryption/signing for messages. See also ``$$crypt_autoencrypt'',
+  ** ``$$crypt_replyencrypt'',
+  ** ``$$crypt_autosign'', ``$$crypt_replysign'' and ``$$smime_is_default''.
+  */
+  { "date_format",     DT_STR,  R_BOTH, UL &DateFmt, UL "!%a, %b %d, %Y at 
%I:%M:%S%p %Z" },
+  /*
+  ** .pp
+  ** This variable controls the format of the date printed by the ``%d''
+  ** sequence in ``$$index_format''.  This is passed to the \fIstrftime\fP
+  ** call to process the date. See the man page for \fIstrftime(3)\fP for
+  ** the proper syntax.
+  ** .pp
+  ** Unless the first character in the string is a bang (``!''), the month
+  ** and week day names are expanded according to the locale specified in
+  ** the variable ``$$locale''. If the first character in the string is a
+  ** bang, the bang is discarded, and the month and week day names in the
+  ** rest of the string are expanded in the \fIC\fP locale (that is in US
+  ** English).
+  */  
+  { "default_hook",    DT_STR,  R_NONE, UL &DefaultHook, UL "~f %s !~P | (~P 
~C %s)" },
+  /*
+  ** .pp
+  ** This variable controls how send-hooks, message-hooks, save-hooks,
+  ** and fcc-hooks will
+  ** be interpreted if they are specified with only a simple regexp,
+  ** instead of a matching pattern.  The hooks are expanded when they are
+  ** declared, so a hook will be interpreted according to the value of this
+  ** variable at the time the hook is declared.  The default value matches
+  ** if the message is either from a user matching the regular expression
+  ** given, or if it is from you (if the from address matches
+  ** ``alternates'') and is to or cc'ed to a user matching the given
+  ** regular expression.
+  */
+  { "delete",          DT_QUAD, R_NONE, OPT_DELETE, M_ASKYES },
+  /*
+  ** .pp
+  ** Controls whether or not messages are really deleted when closing or
+  ** synchronizing a mailbox.  If set to \fIyes\fP, messages marked for
+  ** deleting will automatically be purged without prompting.  If set to
+  ** \fIno\fP, messages marked for deletion will be kept in the mailbox.
+  */
+  { "delete_untag",    DT_BOOL, R_NONE, OPTDELETEUNTAG, 1 },
+  /*
+  ** .pp
+  ** If this option is \fIset\fP, mutt will untag messages when marking them
+  ** for deletion.  This applies when you either explicitly delete a message,
+  ** or when you save it to another folder.
+  */
+  { "digest_collapse", DT_BOOL, R_NONE, OPTDIGESTCOLLAPSE, 1},
+  /*
+  ** .pp
+  ** If this option is \fIset\fP, mutt's received-attachments menu will not 
show the subparts of
+  ** individual messages in a multipart/digest.  To see these subparts, press 
'v' on that menu.
+  */
+  { "display_filter",  DT_PATH, R_PAGER, UL &DisplayFilter, UL "" },
+  /*
+  ** .pp
+  ** When set, specifies a command used to filter messages.  When a message
+  ** is viewed it is passed as standard input to $$display_filter, and the
+  ** filtered message is read from the standard output.
+  */
+#if defined(DL_STANDALONE) && defined(USE_DOTLOCK)
+  { "dotlock_program",  DT_PATH, R_NONE, UL &MuttDotlock, UL BINDIR 
"/mutt_dotlock" },
+  /*
+  ** .pp
+  ** Contains the path of the mutt_dotlock (8) binary to be used by
+  ** mutt.
+  */
+#endif
+  { "dsn_notify",      DT_STR,  R_NONE, UL &DsnNotify, UL "" },
+  /*
+  ** .pp
+  ** \fBNote:\fP you should not enable this unless you are using Sendmail
+  ** 8.8.x or greater.
+  ** .pp
+  ** This variable sets the request for when notification is returned.  The
+  ** string consists of a comma separated list (no spaces!) of one or more
+  ** of the following: \fInever\fP, to never request notification,
+  ** \fIfailure\fP, to request notification on transmission failure,
+  ** \fIdelay\fP, to be notified of message delays, \fIsuccess\fP, to be
+  ** notified of successful transmission.
+  ** .pp
+  ** Example: set dsn_notify="failure,delay"
+  */
+  { "dsn_return",      DT_STR,  R_NONE, UL &DsnReturn, UL "" },
+  /*
+  ** .pp
+  ** \fBNote:\fP you should not enable this unless you are using Sendmail
+  ** 8.8.x or greater.
+  ** .pp
+  ** This variable controls how much of your message is returned in DSN
+  ** messages.  It may be set to either \fIhdrs\fP to return just the
+  ** message header, or \fIfull\fP to return the full message.
+  ** .pp
+  ** Example: set dsn_return=hdrs
+  */
+  { "duplicate_threads",       DT_BOOL, R_RESORT|R_RESORT_INIT|R_INDEX, 
OPTDUPTHREADS, 1 },
+  /*
+  ** .pp
+  ** This variable controls whether mutt, when sorting by threads, threads
+  ** messages with the same message-id together.  If it is set, it will 
indicate
+  ** that it thinks they are duplicates of each other with an equals sign
+  ** in the thread diagram.
+  */
+  { "edit_headers",    DT_BOOL, R_NONE, OPTEDITHDRS, 0 },
+  /*
+  ** .pp
+  ** This option allows you to edit the header of your outgoing messages
+  ** along with the body of your message.
+  */
+  { "edit_hdrs",       DT_SYN,  R_NONE, UL "edit_headers", 0 },
+  /*
+  */  
+  { "editor",          DT_PATH, R_NONE, UL &Editor, 0 },
+  /*
+  ** .pp
+  ** This variable specifies which editor is used by mutt.
+  ** It defaults to the value of the VISUAL, or EDITOR, environment
+  ** variable, or to the string "vi" if neither of those are set.
+  */
+  { "encode_from",     DT_BOOL, R_NONE, OPTENCODEFROM, 0 },
+  /*
+  ** .pp
+  ** When \fIset\fP, mutt will quoted-printable encode messages when
+  ** they contain the string "From " in the beginning of a line.
+  ** Useful to avoid the tampering certain mail delivery and transport
+  ** agents tend to do with messages.
+  */
+  { "envelope_from",   DT_BOOL, R_NONE, OPTENVFROM, 0 },
+  /*
+  ** .pp
+  ** When \fIset\fP, mutt will try to derive the message's \fIenvelope\fP
+  ** sender from the "From:" header.  Note that this information is passed 
+  ** to sendmail command using the "-f" command line switch, so don't set this
+  ** option if you are using that switch in $$sendmail yourself,
+  ** or if the sendmail on your machine doesn't support that command
+  ** line switch.
+  */
+  { "escape",          DT_STR,  R_NONE, UL &EscChar, UL "~" },
+  /*
+  ** .pp
+  ** Escape character to use for functions in the builtin editor.
+  */
+  { "fast_reply",      DT_BOOL, R_NONE, OPTFASTREPLY, 0 },
+  /*
+  ** .pp
+  ** When set, the initial prompt for recipients and subject are skipped
+  ** when replying to messages, and the initial prompt for subject is
+  ** skipped when forwarding messages.
+  ** .pp
+  ** \fBNote:\fP this variable has no effect when the ``$$autoedit''
+  ** variable is set.
+  */
+  { "fcc_attach",      DT_BOOL, R_NONE, OPTFCCATTACH, 1 },
+  /*
+  ** .pp
+  ** This variable controls whether or not attachments on outgoing messages
+  ** are saved along with the main body of your message.
+  */
+  { "fcc_clear",       DT_BOOL, R_NONE, OPTFCCCLEAR, 0 },
+  /*
+  ** .pp
+  ** When this variable is set, FCCs will be stored unencrypted and
+  ** unsigned, even when the actual message is encrypted and/or
+  ** signed.
+  ** (PGP only)
+  */
+  { "folder",          DT_PATH, R_NONE, UL &Maildir, UL "~/Mail" },
+  /*
+  ** .pp
+  ** Specifies the default location of your mailboxes.  A `+' or `=' at the
+  ** beginning of a pathname will be expanded to the value of this
+  ** variable.  Note that if you change this variable from the default
+  ** value you need to make sure that the assignment occurs \fIbefore\fP
+  ** you use `+' or `=' for any other variables since expansion takes place
+  ** during the `set' command.
+  */
+  { "folder_format",   DT_STR,  R_INDEX, UL &FolderFormat, UL "%2C %t %N %F 
%2l %-8.8u %-8.8g %8s %d %f" },
+  /*
+  ** .pp
+  ** This variable allows you to customize the file browser display to your
+  ** personal taste.  This string is similar to ``$$index_format'', but has
+  ** its own set of printf()-like sequences:
+  ** .pp
+  ** .dl
+  ** .dt %C  .dd current file number
+  ** .dt %d  .dd date/time folder was last modified
+  ** .dt %f  .dd filename
+  ** .dt %F  .dd file permissions
+  ** .dt %g  .dd group name (or numeric gid, if missing)
+  ** .dt %l  .dd number of hard links
+  ** .dt %N  .dd N if folder has new mail, blank otherwise
+  ** .dt %s  .dd size in bytes
+  ** .dt %t  .dd * if the file is tagged, blank otherwise
+  ** .dt %u  .dd owner name (or numeric uid, if missing)
+  ** .dt %>X .dd right justify the rest of the string and pad with character 
"X"
+  ** .dt %|X .dd pad to the end of the line with character "X"
+  ** .de
+  */
+  { "followup_to",     DT_BOOL, R_NONE, OPTFOLLOWUPTO, 1 },
+  /*
+  ** .pp
+  ** Controls whether or not the \fIMail-Followup-To\fP header field is
+  ** generated when sending mail.  When \fIset\fP, Mutt will generate this
+  ** field when you are replying to a known mailing list, specified with
+  ** the ``subscribe'' or ``$lists'' commands.
+  ** .pp
+  ** This field has two purposes.  First, preventing you from
+  ** receiving duplicate copies of replies to messages which you send
+  ** to mailing lists, and second, ensuring that you do get a reply
+  ** separately for any messages sent to known lists to which you are
+  ** not subscribed.  The header will contain only the list's address
+  ** for subscribed lists, and both the list address and your own
+  ** email address for unsubscribed lists.  Without this header, a
+  ** group reply to your message sent to a subscribed list will be
+  ** sent to both the list and your address, resulting in two copies
+  ** of the same email for you.
+  */
+  { "force_name",      DT_BOOL, R_NONE, OPTFORCENAME, 0 },
+  /*
+  ** .pp
+  ** This variable is similar to ``$$save_name'', except that Mutt will
+  ** store a copy of your outgoing message by the username of the address
+  ** you are sending to even if that mailbox does not exist.
+  ** .pp
+  ** Also see the ``$$record'' variable.
+  */
+  { "forward_decode",  DT_BOOL, R_NONE, OPTFORWDECODE, 1 },
+  /*
+  ** .pp
+  ** Controls the decoding of complex MIME messages into text/plain when
+  ** forwarding a message.  The message header is also RFC2047 decoded.
+  ** This variable is only used, if ``$$mime_forward'' is \fIunset\fP,
+  ** otherwise ``$$mime_forward_decode'' is used instead.
+  */
+  { "forw_decode",     DT_SYN,  R_NONE, UL "forward_decode", 0 },
+  /*
+  */
+  { "forward_edit",    DT_QUAD, R_NONE, OPT_FORWEDIT, M_YES },
+  /*
+  ** .pp
+  ** This quadoption controls whether or not the user is automatically
+  ** placed in the editor when forwarding messages.  For those who always want
+  ** to forward with no modification, use a setting of ``no''.
+  */
+  { "forward_format",  DT_STR,  R_NONE, UL &ForwFmt, UL "[%a: %s]" },
+  /*
+  ** .pp
+  ** This variable controls the default subject when forwarding a message.
+  ** It uses the same format sequences as the ``$$index_format'' variable.
+  */
+  { "forw_format",     DT_SYN,  R_NONE, UL "forward_format", 0 },  
+  /*
+  */
+  { "forward_quote",   DT_BOOL, R_NONE, OPTFORWQUOTE, 0 },
+  /*
+  ** .pp
+  ** When \fIset\fP forwarded messages included in the main body of the
+  ** message (when ``$$mime_forward'' is \fIunset\fP) will be quoted using
+  ** ``$$indent_string''.
+  */
+  { "forw_quote",      DT_SYN,  R_NONE, UL "forward_quote", 0 },
+  /*
+  */
+  { "from",            DT_ADDR, R_NONE, UL &From, UL 0 },
+  /*
+  ** .pp
+  ** When set, this variable contains a default from address.  It
+  ** can be overridden using my_hdr (including from send-hooks) and
+  ** ``$$reverse_name''.  This variable is ignored if ``$$use_from''
+  ** is unset.
+  ** .pp
+  ** Defaults to the contents of the environment variable EMAIL.
+  */
+  { "gecos_mask",      DT_RX,   R_NONE, UL &GecosMask, UL "^[^,]*" },
+  /*
+  ** .pp
+  ** A regular expression used by mutt to parse the GECOS field of a password
+  ** entry when expanding the alias.  By default the regular expression is set
+  ** to "^[^,]*" which will return the string up to the first "," encountered.
+  ** If the GECOS field contains a string like "lastname, firstname" then you
+  ** should set the gecos_mask=".*".
+  ** .pp
+  ** This can be useful if you see the following behavior: you address a e-mail
+  ** to user ID stevef whose full name is Steve Franklin.  If mutt expands 
+  ** stevef to "Franklin" stevef@xxxxxxx then you should set the gecos_mask to
+  ** a regular expression that will match the whole name so mutt will expand
+  ** "Franklin" to "Franklin, Steve".
+  */
+  { "hdr_format",      DT_SYN,  R_NONE, UL "index_format", 0 },
+  /*
+  */
+  { "hdrs",            DT_BOOL, R_NONE, OPTHDRS, 1 },
+  /*
+  ** .pp
+  ** When unset, the header fields normally added by the ``$my_hdr''
+  ** command are not created.  This variable \fImust\fP be unset before
+  ** composing a new message or replying in order to take effect.  If set,
+  ** the user defined header fields are added to every new message.
+  */
+  { "header",          DT_BOOL, R_NONE, OPTHEADER, 0 },
+  /*
+  ** .pp
+  ** When set, this variable causes Mutt to include the header
+  ** of the message you are replying to into the edit buffer.
+  ** The ``$$weed'' setting applies.
+  */  
+  { "help",            DT_BOOL, R_BOTH, OPTHELP, 1 },
+  /*
+  ** .pp
+  ** When set, help lines describing the bindings for the major functions
+  ** provided by each menu are displayed on the first line of the screen.
+  ** .pp
+  ** \fBNote:\fP The binding will not be displayed correctly if the
+  ** function is bound to a sequence rather than a single keystroke.  Also,
+  ** the help line may not be updated if a binding is changed while Mutt is
+  ** running.  Since this variable is primarily aimed at new users, neither
+  ** of these should present a major problem.
+  */
+  { "hidden_host",     DT_BOOL, R_NONE, OPTHIDDENHOST, 0 },
+  /*
+  ** .pp
+  ** When set, mutt will skip the host name part of ``$$hostname'' variable
+  ** when adding the domain part to addresses.  This variable does not
+  ** affect the generation of Message-IDs, and it will not lead to the 
+  ** cut-off of first-level domains.
+  */
+  { "hide_limited",    DT_BOOL, R_TREE|R_INDEX, OPTHIDELIMITED, 0 },
+  /*
+  ** .pp
+  ** When set, mutt will not show the presence of messages that are hidden
+  ** by limiting, in the thread tree.
+  */
+  { "hide_missing",    DT_BOOL, R_TREE|R_INDEX, OPTHIDEMISSING, 1 },
+  /*
+  ** .pp
+  ** When set, mutt will not show the presence of missing messages in the
+  ** thread tree.
+  */
+  { "hide_thread_subject", DT_BOOL, R_TREE|R_INDEX, OPTHIDETHREADSUBJECT, 1 },
+  /*
+  ** .pp
+  ** When set, mutt will not show the subject of messages in the thread
+  ** tree that have the same subject as their parent or closest previously
+  ** displayed sibling.
+  */
+  { "hide_top_limited",        DT_BOOL, R_TREE|R_INDEX, OPTHIDETOPLIMITED, 0 },
+  /*
+  ** .pp
+  ** When set, mutt will not show the presence of messages that are hidden
+  ** by limiting, at the top of threads in the thread tree.  Note that when
+  ** $$hide_missing is set, this option will have no effect.
+  */
+  { "hide_top_missing",        DT_BOOL, R_TREE|R_INDEX, OPTHIDETOPMISSING, 1 },
+  /*
+  ** .pp
+  ** When set, mutt will not show the presence of missing messages at the
+  ** top of threads in the thread tree.  Note that when $$hide_limited is
+  ** set, this option will have no effect.
+  */
+  { "history",         DT_NUM,  R_NONE, UL &HistSize, 10 },
+  /*
+  ** .pp
+  ** This variable controls the size (in number of strings remembered) of
+  ** the string history buffer. The buffer is cleared each time the
+  ** variable is set.
+  */
+  { "honor_followup_to", DT_QUAD, R_NONE, OPT_MFUPTO, M_YES },
+  /*
+  ** .pp
+  ** This variable controls whether or not a Mail-Followup-To header is
+  ** honored when group-replying to a message.
+  */
+  { "hostname",                DT_STR,  R_NONE, UL &Fqdn, 0 },
+  /*
+  ** .pp
+  ** Specifies the hostname to use after the ``@'' in local e-mail
+  ** addresses.  This overrides the compile time definition obtained from
+  ** /etc/resolv.conf.
+  */
+  { "ignore_list_reply_to", DT_BOOL, R_NONE, OPTIGNORELISTREPLYTO, 0 },
+  /*
+  ** .pp
+  ** Affects the behaviour of the \fIreply\fP function when replying to
+  ** messages from mailing lists.  When set, if the ``Reply-To:'' field is
+  ** set to the same value as the ``To:'' field, Mutt assumes that the
+  ** ``Reply-To:'' field was set by the mailing list to automate responses
+  ** to the list, and will ignore this field.  To direct a response to the
+  ** mailing list when this option is set, use the \fIlist-reply\fP
+  ** function; \fIgroup-reply\fP will reply to both the sender and the
+  ** list.
+  */
+#ifdef USE_IMAP
+  { "imap_authenticators", DT_STR, R_NONE, UL &ImapAuthenticators, UL 0 },
+  /*
+  ** .pp
+  ** This is a colon-delimited list of authentication methods mutt may
+  ** attempt to use to log in to an IMAP server, in the order mutt should
+  ** try them.  Authentication methods are either 'login' or the right
+  ** side of an IMAP 'AUTH=xxx' capability string, eg 'digest-md5', 'gssapi'
+  ** or 'cram-md5'. This parameter is case-insensitive. If this
+  ** parameter is unset (the default) mutt will try all available methods,
+  ** in order from most-secure to least-secure.
+  ** .pp
+  ** Example: set imap_authenticators="gssapi:cram-md5:login"
+  ** .pp
+  ** \fBNote:\fP Mutt will only fall back to other authentication methods if
+  ** the previous methods are unavailable. If a method is available but
+  ** authentication fails, mutt will not connect to the IMAP server.
+  */
+  { "imap_delim_chars",                DT_STR, R_NONE, UL &ImapDelimChars, UL 
"/." },
+  /*
+  ** .pp
+  ** This contains the list of characters which you would like to treat
+  ** as folder separators for displaying IMAP paths. In particular it
+  ** helps in using the '=' shortcut for your \fIfolder\fP variable.
+  */
+# ifdef USE_SSL
+  { "imap_force_ssl",          DT_BOOL, R_NONE, OPTIMAPFORCESSL, 0 },
+  /*
+  ** .pp
+  ** If this variable is set, Mutt will always use SSL when
+  ** connecting to IMAP servers.
+  */
+# endif
+  { "imap_headers",    DT_STR, R_INDEX, UL &ImapHeaders, UL 0},
+  /*
+  ** .pp
+  ** Mutt requests these header fields in addition to the default headers
+  ** ("DATE FROM SUBJECT TO CC MESSAGE-ID REFERENCES CONTENT-TYPE
+  ** CONTENT-DESCRIPTION IN-REPLY-TO REPLY-TO LINES X-LABEL") from IMAP
+  ** servers before displaying the index menu. You may want to add more
+  ** headers for spam detection. \fBNote:\fP This is a space separated list.
+  */
+  { "imap_home_namespace",     DT_STR, R_NONE, UL &ImapHomeNamespace, UL 0},
+  /*
+  ** .pp
+  ** You normally want to see your personal folders alongside
+  ** your INBOX in the IMAP browser. If you see something else, you may set
+  ** this variable to the IMAP path to your folders.
+  */
+  { "imap_keepalive",           DT_NUM,  R_NONE, UL &ImapKeepalive, 900 },
+  /*
+  ** .pp
+  ** This variable specifies the maximum amount of time in seconds that mutt
+  ** will wait before polling open IMAP connections, to prevent the server
+  ** from closing them before mutt has finished with them. The default is
+  ** well within the RFC-specified minimum amount of time (30 minutes) before
+  ** a server is allowed to do this, but in practice the RFC does get
+  ** violated every now and then. Reduce this number if you find yourself
+  ** getting disconnected from your IMAP server due to inactivity.
+  */
+  { "imap_list_subscribed",    DT_BOOL, R_NONE, OPTIMAPLSUB, 0 },
+  /*
+  ** .pp
+  ** This variable configures whether IMAP folder browsing will look for
+  ** only subscribed folders or all folders.  This can be toggled in the
+  ** IMAP browser with the \fItoggle-subscribed\fP function.
+  */
+  { "imap_pass",       DT_STR,  R_NONE, UL &ImapPass, UL 0 },
+  /*
+  ** .pp
+  ** Specifies the password for your IMAP account.  If unset, Mutt will
+  ** prompt you for your password when you invoke the fetch-mail function.
+  ** \fBWarning\fP: you should only use this option when you are on a
+  ** fairly secure machine, because the superuser can read your muttrc even
+  ** if you are the only one who can read the file.
+  */
+  { "imap_passive",            DT_BOOL, R_NONE, OPTIMAPPASSIVE, 1 },
+  /*
+  ** .pp
+  ** When set, mutt will not open new IMAP connections to check for new
+  ** mail.  Mutt will only check for new mail over existing IMAP
+  ** connections.  This is useful if you don't want to be prompted to
+  ** user/password pairs on mutt invocation, or if opening the connection
+  ** is slow.
+  */
+  { "imap_peek", DT_BOOL, R_NONE, OPTIMAPPEEK, 1 },
+  /*
+  ** .pp
+  ** If set, mutt will avoid implicitly marking your mail as read whenever
+  ** you fetch a message from the server. This is generally a good thing,
+  ** but can make closing an IMAP folder somewhat slower. This option
+  ** exists to appease speed freaks.
+  */
+  { "imap_servernoise",                DT_BOOL, R_NONE, OPTIMAPSERVERNOISE, 1 
},
+  /*
+  ** .pp
+  ** When set, mutt will display warning messages from the IMAP
+  ** server as error messages. Since these messages are often
+  ** harmless, or generated due to configuration problems on the
+  ** server which are out of the users' hands, you may wish to suppress
+  ** them at some point.
+  */
+  { "imap_user",       DT_STR,  R_NONE, UL &ImapUser, UL 0 },
+  /*
+  ** .pp
+  ** Your login name on the IMAP server.
+  ** .pp
+  ** This variable defaults to your user name on the local machine.
+  */
+#endif
+  { "implicit_autoview", DT_BOOL,R_NONE, OPTIMPLICITAUTOVIEW, 0},
+  /*
+  ** .pp
+  ** If set to ``yes'', mutt will look for a mailcap entry with the
+  ** copiousoutput flag set for \fIevery\fP MIME attachment it doesn't have
+  ** an internal viewer defined for.  If such an entry is found, mutt will
+  ** use the viewer defined in that entry to convert the body part to text
+  ** form.
+  */
+  { "include",         DT_QUAD, R_NONE, OPT_INCLUDE, M_ASKYES },
+  /*
+  ** .pp
+  ** Controls whether or not a copy of the message(s) you are replying to
+  ** is included in your reply.
+  */
+  { "include_onlyfirst",       DT_BOOL, R_NONE, OPTINCLUDEONLYFIRST, 0},
+  /*
+  ** .pp
+  ** Controls whether or not Mutt includes only the first attachment
+  ** of the message you are replying.
+  */
+  { "indent_string",   DT_STR,  R_NONE, UL &Prefix, UL "> " },
+  /*
+  ** .pp
+  ** Specifies the string to prepend to each line of text quoted in a
+  ** message to which you are replying.  You are strongly encouraged not to
+  ** change this value, as it tends to agitate the more fanatical netizens.
+  */
+  { "indent_str",      DT_SYN,  R_NONE, UL "indent_string", 0 },
+  /*
+  */
+  { "index_format",    DT_STR,  R_BOTH, UL &HdrFmt, UL "%4C %Z %{%b %d} 
%-15.15L (%?l?%4l&%4c?) %s" },
+  /*
+  ** .pp
+  ** This variable allows you to customize the message index display to
+  ** your personal taste.
+  ** .pp
+  ** ``Format strings'' are similar to the strings used in the ``C''
+  ** function printf to format output (see the man page for more detail).
+  ** The following sequences are defined in Mutt:
+  ** .pp
+  ** .dl
+  ** .dt %a .dd address of the author
+  ** .dt %A .dd reply-to address (if present; otherwise: address of author)
+  ** .dt %b .dd filename of the original message folder (think mailBox)
+  ** .dt %B .dd the list to which the letter was sent, or else the folder name 
(%b).
+  ** .dt %c .dd number of characters (bytes) in the message
+  ** .dt %C .dd current message number
+  ** .dt %d .dd date and time of the message in the format specified by
+  **            ``date_format'' converted to sender's time zone
+  ** .dt %D .dd date and time of the message in the format specified by
+  **            ``date_format'' converted to the local time zone
+  ** .dt %e .dd current message number in thread
+  ** .dt %E .dd number of messages in current thread
+  ** .dt %f .dd entire From: line (address + real name)
+  ** .dt %F .dd author name, or recipient name if the message is from you
+  ** .dt %H .dd spam attribute(s) of this message
+  ** .dt %i .dd message-id of the current message
+  ** .dt %l .dd number of lines in the message (does not work with maildir,
+  **            mh, and possibly IMAP folders)
+  ** .dt %L .dd If an address in the To or CC header field matches an address
+  **            defined by the users ``subscribe'' command, this displays
+  **            "To <list-name>", otherwise the same as %F.
+  ** .dt %m .dd total number of message in the mailbox
+  ** .dt %M .dd number of hidden messages if the thread is collapsed.
+  ** .dt %N .dd message score
+  ** .dt %n .dd author's real name (or address if missing)
+  ** .dt %O .dd (_O_riginal save folder)  Where mutt would formerly have
+  **            stashed the message: list name or recipient name if no list
+  ** .dt %s .dd subject of the message
+  ** .dt %S .dd status of the message (N/D/d/!/r/\(as)
+  ** .dt %t .dd `to:' field (recipients)
+  ** .dt %T .dd the appropriate character from the $$to_chars string
+  ** .dt %u .dd user (login) name of the author
+  ** .dt %v .dd first name of the author, or the recipient if the message is 
from you
+  ** .dt %y .dd `x-label:' field, if present
+  ** .dt %Y .dd `x-label' field, if present, and (1) not at part of a thread 
tree,
+  **            (2) at the top of a thread, or (3) `x-label' is different from
+  **            preceding message's `x-label'.
+  ** .dt %Z .dd message status flags
+  ** .dt %{fmt} .dd the date and time of the message is converted to sender's
+  **                time zone, and ``fmt'' is expanded by the library function
+  **                ``strftime''; a leading bang disables locales
+  ** .dt %[fmt] .dd the date and time of the message is converted to the local
+  **                time zone, and ``fmt'' is expanded by the library function
+  **                ``strftime''; a leading bang disables locales
+  ** .dt %(fmt) .dd the local date and time when the message was received.
+  **                ``fmt'' is expanded by the library function ``strftime'';
+  **                a leading bang disables locales
+  ** .dt %<fmt> .dd the current local time. ``fmt'' is expanded by the library
+  **                function ``strftime''; a leading bang disables locales.
+  ** .dt %>X    .dd right justify the rest of the string and pad with 
character "X"
+  ** .dt %|X    .dd pad to the end of the line with character "X"
+  ** .de
+  ** .pp
+  ** See also: ``$$to_chars''.
+  */
+  { "ispell",          DT_PATH, R_NONE, UL &Ispell, UL ISPELL },
+  /*
+  ** .pp
+  ** How to invoke ispell (GNU's spell-checking software).
+  */
+  { "keep_flagged", DT_BOOL, R_NONE, OPTKEEPFLAGGED, 0 },
+  /*
+  ** .pp
+  ** If set, read messages marked as flagged will not be moved
+  ** from your spool mailbox to your ``$$mbox'' mailbox, or as a result of
+  ** a ``$mbox-hook'' command.
+  */
+  { "locale",          DT_STR,  R_BOTH, UL &Locale, UL "C" },
+  /*
+  ** .pp
+  ** The locale used by \fIstrftime(3)\fP to format dates. Legal values are
+  ** the strings your system accepts for the locale variable \fILC_TIME\fP.
+  */
+  { "mail_check",      DT_NUM,  R_NONE, UL &BuffyTimeout, 5 },
+  /*
+  ** .pp
+  ** This variable configures how often (in seconds) mutt should look for
+  ** new mail.
+  */
+  { "mailcap_path",    DT_STR,  R_NONE, UL &MailcapPath, 0 },
+  /*
+  ** .pp
+  ** This variable specifies which files to consult when attempting to
+  ** display MIME bodies not directly supported by Mutt.
+  */
+  { "mailcap_sanitize",        DT_BOOL, R_NONE, OPTMAILCAPSANITIZE, 1 },
+  /*
+  ** .pp
+  ** If set, mutt will restrict possible characters in mailcap % expandos
+  ** to a well-defined set of safe characters.  This is the safe setting,
+  ** but we are not sure it doesn't break some more advanced MIME stuff.
+  ** .pp
+  ** \fBDON'T CHANGE THIS SETTING UNLESS YOU ARE REALLY SURE WHAT YOU ARE
+  ** DOING!\fP
+  */
+  { "maildir_trash", DT_BOOL, R_NONE, OPTMAILDIRTRASH, 0 },
+  /*
+  ** .pp
+  ** If set, messages marked as deleted will be saved with the maildir
+  ** (T)rashed flag instead of unlinked.  \fBNOTE:\fP this only applies
+  ** to maildir-style mailboxes.  Setting it will have no effect on other
+  ** mailbox types.
+  */
+  { "mark_old",                DT_BOOL, R_BOTH, OPTMARKOLD, 1 },
+  /*
+  ** .pp
+  ** Controls whether or not mutt marks \fInew\fP \fBunread\fP
+  ** messages as \fIold\fP if you exit a mailbox without reading them.
+  ** With this option set, the next time you start mutt, the messages
+  ** will show up with an "O" next to them in the index menu,
+  ** indicating that they are old.
+  */
+  { "markers",         DT_BOOL, R_PAGER, OPTMARKERS, 1 },
+  /*
+  ** .pp
+  ** Controls the display of wrapped lines in the internal pager. If set, a
+  ** ``+'' marker is displayed at the beginning of wrapped lines. Also see
+  ** the ``$$smart_wrap'' variable.
+  */
+  { "mask",            DT_RX,   R_NONE, UL &Mask, UL "!^\\.[^.]" },
+  /*
+  ** .pp
+  ** A regular expression used in the file browser, optionally preceded by
+  ** the \fInot\fP operator ``!''.  Only files whose names match this mask
+  ** will be shown. The match is always case-sensitive.
+  */
+  { "mbox",            DT_PATH, R_BOTH, UL &Inbox, UL "~/mbox" },
+  /*
+  ** .pp
+  ** This specifies the folder into which read mail in your ``$$spoolfile''
+  ** folder will be appended.
+  */
+  { "mbox_type",       DT_MAGIC,R_NONE, UL &DefaultMagic, M_MBOX },
+  /*
+  ** .pp
+  ** The default mailbox type used when creating new folders. May be any of
+  ** mbox, MMDF, MH and Maildir.
+  */
+  { "metoo",           DT_BOOL, R_NONE, OPTMETOO, 0 },
+  /*
+  ** .pp
+  ** If unset, Mutt will remove your address (see the ``alternates''
+  ** command) from the list of recipients when replying to a message.
+  */
+  { "menu_scroll",     DT_BOOL, R_NONE, OPTMENUSCROLL, 0 },
+  /*
+  ** .pp
+  ** When \fIset\fP, menus will be scrolled up or down one line when you
+  ** attempt to move across a screen boundary.  If \fIunset\fP, the screen
+  ** is cleared and the next or previous page of the menu is displayed
+  ** (useful for slow links to avoid many redraws).
+  */
+  { "meta_key",                DT_BOOL, R_NONE, OPTMETAKEY, 0 },
+  /*
+  ** .pp
+  ** If set, forces Mutt to interpret keystrokes with the high bit (bit 8)
+  ** set as if the user had pressed the ESC key and whatever key remains
+  ** after having the high bit removed.  For example, if the key pressed
+  ** has an ASCII value of 0xf4, then this is treated as if the user had
+  ** pressed ESC then ``x''.  This is because the result of removing the
+  ** high bit from ``0xf4'' is ``0x74'', which is the ASCII character
+  ** ``x''.
+  */
+  { "mh_purge",                DT_BOOL, R_NONE, OPTMHPURGE, 0 },
+  /*
+  ** .pp
+  ** When unset, mutt will mimic mh's behaviour and rename deleted messages
+  ** to \fI,<old file name>\fP in mh folders instead of really deleting
+  ** them.  If the variable is set, the message files will simply be
+  ** deleted.
+  */
+  { "mh_seq_flagged",  DT_STR, R_NONE, UL &MhFlagged, UL "flagged" },
+  /*
+  ** .pp
+  ** The name of the MH sequence used for flagged messages.
+  */
+  { "mh_seq_replied",  DT_STR, R_NONE, UL &MhReplied, UL "replied" },
+  /*
+  ** .pp
+  ** The name of the MH sequence used to tag replied messages.
+  */
+  { "mh_seq_unseen",   DT_STR, R_NONE, UL &MhUnseen, UL "unseen" },
+  /*
+  ** .pp
+  ** The name of the MH sequence used for unseen messages.
+  */
+  { "mime_forward",    DT_QUAD, R_NONE, OPT_MIMEFWD, M_NO },
+  /*
+  ** .pp
+  ** When set, the message you are forwarding will be attached as a
+  ** separate MIME part instead of included in the main body of the
+  ** message.  This is useful for forwarding MIME messages so the receiver
+  ** can properly view the message as it was delivered to you. If you like
+  ** to switch between MIME and not MIME from mail to mail, set this
+  ** variable to ask-no or ask-yes.
+  ** .pp
+  ** Also see ``$$forward_decode'' and ``$$mime_forward_decode''.
+  */
+  { "mime_forward_decode", DT_BOOL, R_NONE, OPTMIMEFORWDECODE, 0 },
+  /*
+  ** .pp
+  ** Controls the decoding of complex MIME messages into text/plain when
+  ** forwarding a message while ``$$mime_forward'' is \fIset\fP. Otherwise
+  ** ``$$forward_decode'' is used instead.
+  */
+  { "mime_fwd",                DT_SYN,  R_NONE, UL "mime_forward", 0 },
+  /*
+  */
+
+  { "mime_forward_rest", DT_QUAD, R_NONE, OPT_MIMEFWDREST, M_YES },
+  /*
+  ** .pp
+  ** When forwarding multiple attachments of a MIME message from the recvattach
+  ** menu, attachments which cannot be decoded in a reasonable manner will
+  ** be attached to the newly composed message if this option is set.
+  */
+
+#ifdef MIXMASTER
+  { "mix_entry_format", DT_STR,  R_NONE, UL &MixEntryFormat, UL "%4n %c %-16s 
%a" },
+  /*
+  ** .pp
+  ** This variable describes the format of a remailer line on the mixmaster
+  ** chain selection screen.  The following printf-like sequences are 
+  ** supported:
+  ** .pp
+  ** .dl
+  ** .dt %n .dd The running number on the menu.
+  ** .dt %c .dd Remailer capabilities.
+  ** .dt %s .dd The remailer's short name.
+  ** .dt %a .dd The remailer's e-mail address.
+  ** .de
+  */
+  { "mixmaster",       DT_PATH, R_NONE, UL &Mixmaster, UL MIXMASTER },
+  /*
+  ** .pp
+  ** This variable contains the path to the Mixmaster binary on your
+  ** system.  It is used with various sets of parameters to gather the
+  ** list of known remailers, and to finally send a message through the
+  ** mixmaster chain.
+  */
+#endif
+
+
+  { "move",            DT_QUAD, R_NONE, OPT_MOVE, M_ASKNO },
+  /*
+  ** .pp
+  ** Controls whether you will be asked to confirm moving read messages
+  ** from your spool mailbox to your ``$$mbox'' mailbox, or as a result of
+  ** a ``$mbox-hook'' command.
+  */
+  { "message_format",  DT_STR,  R_NONE, UL &MsgFmt, UL "%s" },
+  /*
+  ** .pp
+  ** This is the string displayed in the ``attachment'' menu for
+  ** attachments of type message/rfc822.  For a full listing of defined
+  ** printf()-like sequences see the section on ``$$index_format''.
+  */
+  { "msg_format",      DT_SYN,  R_NONE, UL "message_format", 0 },
+  /*
+  */
+  { "narrow_tree",     DT_BOOL, R_TREE|R_INDEX, OPTNARROWTREE, 0 },
+  /*
+  ** .pp
+  ** This variable, when set, makes the thread tree narrower, allowing
+  ** deeper threads to fit on the screen.
+  */
+  { "pager",           DT_PATH, R_NONE, UL &Pager, UL "builtin" },
+  /*
+  ** .pp
+  ** This variable specifies which pager you would like to use to view
+  ** messages.  builtin means to use the builtin pager, otherwise this
+  ** variable should specify the pathname of the external pager you would
+  ** like to use.
+  ** .pp
+  ** Using an external pager may have some disadvantages: Additional
+  ** keystrokes are necessary because you can't call mutt functions
+  ** directly from the pager, and screen resizes cause lines longer than
+  ** the screen width to be badly formatted in the help menu.
+  */
+  { "pager_context",   DT_NUM,  R_NONE, UL &PagerContext, 0 },
+  /*
+  ** .pp
+  ** This variable controls the number of lines of context that are given
+  ** when displaying the next or previous page in the internal pager.  By
+  ** default, Mutt will display the line after the last one on the screen
+  ** at the top of the next page (0 lines of context).
+  */
+  { "pager_format",    DT_STR,  R_PAGER, UL &PagerFmt, UL "-%Z- %C/%m: 
%-20.20n   %s" },
+  /*
+  ** .pp
+  ** This variable controls the format of the one-line message ``status''
+  ** displayed before each message in either the internal or an external
+  ** pager.  The valid sequences are listed in the ``$$index_format''
+  ** section.
+  */
+  { "pager_index_lines",DT_NUM,         R_PAGER, UL &PagerIndexLines, 0 },
+  /*
+  ** .pp
+  ** Determines the number of lines of a mini-index which is shown when in
+  ** the pager.  The current message, unless near the top or bottom of the
+  ** folder, will be roughly one third of the way down this mini-index,
+  ** giving the reader the context of a few messages before and after the
+  ** message.  This is useful, for example, to determine how many messages
+  ** remain to be read in the current thread.  One of the lines is reserved
+  ** for the status bar from the index, so a \fIpager_index_lines\fP of 6
+  ** will only show 5 lines of the actual index.  A value of 0 results in
+  ** no index being shown.  If the number of messages in the current folder
+  ** is less than \fIpager_index_lines\fP, then the index will only use as
+  ** many lines as it needs.
+  */
+  { "pager_stop",      DT_BOOL, R_NONE, OPTPAGERSTOP, 0 },
+  /*
+  ** .pp
+  ** When set, the internal-pager will \fBnot\fP move to the next message
+  ** when you are at the end of a message and invoke the \fInext-page\fP
+  ** function.
+  */
+  { "pgp_autosign",    DT_SYN,  R_NONE, UL "crypt_autosign", 0 },
+  { "crypt_autosign",  DT_BOOL, R_NONE, OPTCRYPTAUTOSIGN, 0 },
+  /*
+  ** .pp
+  ** Setting this variable will cause Mutt to always attempt to
+  ** cryptographically sign outgoing messages.  This can be overridden
+  ** by use of the \fIpgp-menu\fP, when signing is not required or
+  ** encryption is requested as well. If ``$$smime_is_default'' is set,
+  ** then OpenSSL is used instead to create S/MIME messages and settings can
+  ** be overridden by use of the \fIsmime-menu\fP.
+  ** (Crypto only)
+  */
+  { "pgp_autoencrypt",         DT_SYN,  R_NONE, UL "crypt_autoencrypt", 0 },
+  { "crypt_autoencrypt",       DT_BOOL, R_NONE, OPTCRYPTAUTOENCRYPT, 0 },
+  /*
+  ** .pp
+  ** Setting this variable will cause Mutt to always attempt to PGP
+  ** encrypt outgoing messages.  This is probably only useful in
+  ** connection to the \fIsend-hook\fP command.  It can be overridden
+  ** by use of the \fIpgp-menu\fP, when encryption is not required or
+  ** signing is requested as well.  IF ``$$smime_is_default'' is set,
+  ** then OpenSSL is used instead to create S/MIME messages and
+  ** settings can be overridden by use of the \fIsmime-menu\fP.
+  ** (Crypto only)
+  */
+  { "pgp_ignore_subkeys", DT_BOOL, R_NONE, OPTPGPIGNORESUB, 1},
+  /*
+  ** .pp
+  ** Setting this variable will cause Mutt to ignore OpenPGP subkeys. Instead,
+  ** the principal key will inherit the subkeys' capabilities.  Unset this
+  ** if you want to play interesting key selection games.
+  ** (PGP only)
+  */
+  { "pgp_replyencrypt",                DT_SYN,  R_NONE, UL 
"crypt_replyencrypt", 1  },
+  { "crypt_replyencrypt",      DT_BOOL, R_NONE, OPTCRYPTREPLYENCRYPT, 1 },
+  /*
+  ** .pp
+  ** If set, automatically PGP or OpenSSL encrypt replies to messages which are
+  ** encrypted.
+  ** (Crypto only)
+  */
+  { "pgp_replysign",   DT_SYN, R_NONE, UL "crypt_replysign", 0 },
+  { "crypt_replysign", DT_BOOL, R_NONE, OPTCRYPTREPLYSIGN, 0 },
+  /*
+  ** .pp
+  ** If set, automatically PGP or OpenSSL sign replies to messages which are
+  ** signed.
+  ** .pp
+  ** \fBNote:\fP this does not work on messages that are encrypted
+  ** \fBand\fP signed!
+  ** (Crypto only)
+  */
+  { "pgp_replysignencrypted",   DT_SYN,  R_NONE, UL 
"crypt_replysignencrypted", 0},
+  { "crypt_replysignencrypted", DT_BOOL, R_NONE, OPTCRYPTREPLYSIGNENCRYPTED, 0 
},
+  /*
+  ** .pp
+  ** If set, automatically PGP or OpenSSL sign replies to messages
+  ** which are encrypted. This makes sense in combination with
+  ** ``$$crypt_replyencrypt'', because it allows you to sign all
+  ** messages which are automatically encrypted.  This works around
+  ** the problem noted in ``$$crypt_replysign'', that mutt is not able
+  ** to find out whether an encrypted message is also signed.
+  ** (Crypto only)
+  */
+  { "crypt_timestamp", DT_BOOL, R_NONE, OPTCRYPTTIMESTAMP, 1 },
+  /*
+  ** .pp
+  ** If set, mutt will include a time stamp in the lines surrounding
+  ** PGP or S/MIME output, so spoofing such lines is more difficult.
+  ** If you are using colors to mark these lines, and rely on these,
+  ** you may unset this setting.
+  ** (Crypto only)
+  */
+  { "pgp_use_gpg_agent", DT_BOOL, R_NONE, OPTUSEGPGAGENT, 0},
+  /*
+  ** .pp
+  ** If set, mutt will use a possibly-running gpg-agent process.
+  ** (PGP only)
+  */
+  { "pgp_verify_sig",   DT_SYN,  R_NONE, UL "crypt_verify_sig", 0},
+  { "crypt_verify_sig",        DT_QUAD, R_NONE, OPT_VERIFYSIG, M_YES },
+  /*
+  ** .pp
+  ** If ``yes'', always attempt to verify PGP or S/MIME signatures.
+  ** If ``ask'', ask whether or not to verify the signature. 
+  ** If ``no'', never attempt to verify cryptographic signatures.
+  ** (Crypto only)
+  */
+  { "smime_is_default", DT_BOOL,  R_NONE, OPTSMIMEISDEFAULT, 0},
+  /*
+  ** .pp
+  ** The default behaviour of mutt is to use PGP on all auto-sign/encryption
+  ** operations. To override and to use OpenSSL instead this must be set.
+  ** However, this has no effect while replying, since mutt will automatically 
+  ** select the same application that was used to sign/encrypt the original
+  ** message.  (Note that this variable can be overridden by unsetting 
$$crypt_autosmime.)
+  ** (S/MIME only)
+  */
+  { "smime_ask_cert_label",    DT_BOOL, R_NONE, OPTASKCERTLABEL, 1 },
+  /*
+  ** .pp
+  ** This flag controls whether you want to be asked to enter a label
+  ** for a certificate about to be added to the database or not. It is
+  ** set by default.
+  ** (S/MIME only)
+  */
+  { "smime_decrypt_use_default_key",   DT_BOOL, R_NONE, OPTSDEFAULTDECRYPTKEY, 
1 },
+  /*
+  ** .pp
+  ** If set (default) this tells mutt to use the default key for decryption. 
Otherwise,
+  ** if manage multiple certificate-key-pairs, mutt will try to use the 
mailbox-address
+  ** to determine the key to use. It will ask you to supply a key, if it can't 
find one.
+  ** (S/MIME only)
+  */
+  { "pgp_entry_format", DT_STR,  R_NONE, UL &PgpEntryFormat, UL "%4n %t%f 
%4l/0x%k %-4a %2c %u" },
+  /*
+  ** .pp
+  ** This variable allows you to customize the PGP key selection menu to
+  ** your personal taste. This string is similar to ``$$index_format'', but
+  ** has its own set of printf()-like sequences:
+  ** .pp
+  ** .dl
+  ** .dt %n     .dd number
+  ** .dt %k     .dd key id
+  ** .dt %u     .dd user id
+  ** .dt %a     .dd algorithm
+  ** .dt %l     .dd key length
+  ** .dt %f     .dd flags
+  ** .dt %c     .dd capabilities
+  ** .dt %t     .dd trust/validity of the key-uid association
+  ** .dt %[<s>] .dd date of the key where <s> is an strftime(3) expression
+  ** .de
+  ** .pp
+  ** (PGP only)
+  */
+  { "pgp_good_sign",   DT_RX,  R_NONE, UL &PgpGoodSign, 0 },
+  /*
+  ** .pp
+  ** If you assign a text to this variable, then a PGP signature is only
+  ** considered verified if the output from $$pgp_verify_command contains
+  ** the text. Use this variable if the exit code from the command is 0
+  ** even for bad signatures.
+  ** (PGP only)
+  */ 
+  { "pgp_check_exit",  DT_BOOL, R_NONE, OPTPGPCHECKEXIT, 1 },
+  /*
+  ** .pp
+  ** If set, mutt will check the exit code of the PGP subprocess when
+  ** signing or encrypting.  A non-zero exit code means that the
+  ** subprocess failed.
+  ** (PGP only)
+  */
+  { "pgp_long_ids",    DT_BOOL, R_NONE, OPTPGPLONGIDS, 0 },
+  /*
+  ** .pp
+  ** If set, use 64 bit PGP key IDs. Unset uses the normal 32 bit Key IDs.
+  ** (PGP only)
+  */
+  { "pgp_retainable_sigs", DT_BOOL, R_NONE, OPTPGPRETAINABLESIG, 0 },
+  /*
+  ** .pp
+  ** If set, signed and encrypted messages will consist of nested
+  ** multipart/signed and multipart/encrypted body parts.
+  ** .pp
+  ** This is useful for applications like encrypted and signed mailing
+  ** lists, where the outer layer (multipart/encrypted) can be easily
+  ** removed, while the inner multipart/signed part is retained.
+  ** (PGP only)
+  */
+  { "pgp_create_traditional",  DT_SYN, R_NONE, UL "pgp_autoinline", 0 },
+  { "pgp_autoinline",          DT_BOOL, R_NONE, OPTPGPAUTOINLINE, 0 },
+  /*
+  ** .pp
+  ** This option controls whether Mutt generates old-style inline
+  ** (traditional) PGP encrypted or signed messages under certain
+  ** circumstances.  This can be overridden by use of the \fIpgp-menu\fP,
+  ** when inline is not required.
+  ** .pp
+  ** Note that Mutt might automatically use PGP/MIME for messages
+  ** which consist of more than a single MIME part.  Mutt can be
+  ** configured to ask before sending PGP/MIME messages when inline
+  ** (traditional) would not work.
+  ** See also: ``$$pgp_mime_auto''.
+  ** .pp
+  ** Also note that using the old-style PGP message format is \fBstrongly\fP
+  ** \fBdeprecated\fP.
+  ** (PGP only)
+  */
+  { "pgp_auto_traditional",    DT_SYN, R_NONE, UL "pgp_replyinline", 0 },
+  { "pgp_replyinline",         DT_BOOL, R_NONE, OPTPGPREPLYINLINE, 0 },
+  /*
+  ** .pp
+  ** Setting this variable will cause Mutt to always attempt to
+  ** create an inline (traditional) message when replying to a
+  ** message which is PGP encrypted/signed inline.  This can be
+  ** overridden by use of the \fIpgp-menu\fP, when inline is not
+  ** required.  This option does not automatically detect if the
+  ** (replied-to) message is inline; instead it relies on Mutt
+  ** internals for previously checked/flagged messages.
+  ** .pp
+  ** Note that Mutt might automatically use PGP/MIME for messages
+  ** which consist of more than a single MIME part.  Mutt can be
+  ** configured to ask before sending PGP/MIME messages when inline
+  ** (traditional) would not work.
+  ** See also: ``$$pgp_mime_auto''.
+  ** .pp
+  ** Also note that using the old-style PGP message format is \fBstrongly\fP
+  ** \fBdeprecated\fP.
+  ** (PGP only)
+  ** 
+  */
+  { "pgp_show_unusable", DT_BOOL, R_NONE, OPTPGPSHOWUNUSABLE, 1 },
+  /*
+  ** .pp
+  ** If set, mutt will display non-usable keys on the PGP key selection
+  ** menu.  This includes keys which have been revoked, have expired, or
+  ** have been marked as ``disabled'' by the user.
+  ** (PGP only)
+  */
+  { "pgp_sign_as",     DT_STR,  R_NONE, UL &PgpSignAs, 0 },
+  /*
+  ** .pp
+  ** If you have more than one key pair, this option allows you to specify
+  ** which of your private keys to use.  It is recommended that you use the
+  ** keyid form to specify your key (e.g., ``0x00112233'').
+  ** (PGP only)
+  */
+  { "pgp_strict_enc",  DT_BOOL, R_NONE, OPTPGPSTRICTENC, 1 },
+  /*
+  ** .pp
+  ** If set, Mutt will automatically encode PGP/MIME signed messages as
+  ** \fIquoted-printable\fP.  Please note that unsetting this variable may
+  ** lead to problems with non-verifyable PGP signatures, so only change
+  ** this if you know what you are doing.
+  ** (PGP only)
+  */
+  { "pgp_timeout",     DT_NUM,  R_NONE, UL &PgpTimeout, 300 },
+  /*
+  ** .pp
+  ** The number of seconds after which a cached passphrase will expire if
+  ** not used.
+  ** (PGP only)
+  */
+  { "pgp_sort_keys",   DT_SORT|DT_SORT_KEYS, R_NONE, UL &PgpSortKeys, 
SORT_ADDRESS },
+  /*
+  ** .pp
+  ** Specifies how the entries in the `pgp keys' menu are sorted. The
+  ** following are legal values:
+  ** .pp
+  ** .dl
+  ** .dt address .dd sort alphabetically by user id
+  ** .dt keyid   .dd sort alphabetically by key id
+  ** .dt date    .dd sort by key creation date
+  ** .dt trust   .dd sort by the trust of the key
+  ** .de
+  ** .pp
+  ** If you prefer reverse order of the above values, prefix it with
+  ** `reverse-'.
+  ** (PGP only)
+  */
+  { "pgp_mime_auto", DT_QUAD, R_NONE, OPT_PGPMIMEAUTO, M_ASKYES },
+  /*
+  ** .pp
+  ** This option controls whether Mutt will prompt you for
+  ** automatically sending a (signed/encrypted) message using
+  ** PGP/MIME when inline (traditional) fails (for any reason).
+  ** .pp
+  ** Also note that using the old-style PGP message format is \fBstrongly\fP
+  ** \fBdeprecated\fP.
+  ** (PGP only)
+  */
+
+  /* XXX Default values! */
+  
+  { "pgp_decode_command",      DT_STR, R_NONE, UL &PgpDecodeCommand, 0},
+  /*
+  ** .pp
+  ** This format strings specifies a command which is used to decode 
+  ** application/pgp attachments.
+  ** .pp
+  ** The PGP command formats have their own set of printf-like sequences:
+  ** .pp
+  ** .dl
+  ** .dt %p .dd Expands to PGPPASSFD=0 when a pass phrase is needed, to an 
empty
+  **            string otherwise. Note: This may be used with a %? construct.
+  ** .dt %f .dd Expands to the name of a file containing a message.
+  ** .dt %s .dd Expands to the name of a file containing the signature part
+  ** .          of a multipart/signed attachment when verifying it.
+  ** .dt %a .dd The value of $$pgp_sign_as.
+  ** .dt %r .dd One or more key IDs.
+  ** .de
+  ** .pp
+  ** For examples on how to configure these formats for the various versions
+  ** of PGP which are floating around, see the pgp*.rc and gpg.rc files in
+  ** the samples/ subdirectory which has been installed on your system
+  ** alongside the documentation.
+  ** (PGP only)
+  */
+  { "pgp_getkeys_command",     DT_STR, R_NONE, UL &PgpGetkeysCommand, 0},
+  /*
+  ** .pp
+  ** This command is invoked whenever mutt will need public key information.
+  ** %r is the only printf-like sequence used with this format.
+  ** (PGP only)
+  */
+  { "pgp_verify_command",      DT_STR, R_NONE, UL &PgpVerifyCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to verify PGP signatures.
+  ** (PGP only)
+  */
+  { "pgp_decrypt_command",     DT_STR, R_NONE, UL &PgpDecryptCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to decrypt a PGP encrypted message.
+  ** (PGP only)
+  */  
+  { "pgp_clearsign_command",   DT_STR, R_NONE, UL &PgpClearSignCommand, 0 },
+  /*
+  ** .pp
+  ** This format is used to create a old-style "clearsigned" PGP
+  ** message.  Note that the use of this format is \fBstrongly\fP
+  ** \fBdeprecated\fP.
+  ** (PGP only)
+  */
+  { "pgp_sign_command",                DT_STR, R_NONE, UL &PgpSignCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to create the detached PGP signature for a 
+  ** multipart/signed PGP/MIME body part.
+  ** (PGP only)
+  */  
+  { "pgp_encrypt_sign_command",        DT_STR, R_NONE, UL 
&PgpEncryptSignCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to both sign and encrypt a body part.
+  ** (PGP only)
+  */  
+  { "pgp_encrypt_only_command", DT_STR, R_NONE, UL &PgpEncryptOnlyCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to encrypt a body part without signing it.
+  ** (PGP only)
+  */  
+  { "pgp_import_command",      DT_STR, R_NONE, UL &PgpImportCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to import a key from a message into 
+  ** the user's public key ring.
+  ** (PGP only)
+  */  
+  { "pgp_export_command",      DT_STR, R_NONE, UL &PgpExportCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to export a public key from the user's
+  ** key ring.
+  ** (PGP only)
+  */  
+  { "pgp_verify_key_command",  DT_STR, R_NONE, UL &PgpVerifyKeyCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to verify key information from the key selection
+  ** menu.
+  ** (PGP only)
+  */  
+  { "pgp_list_secring_command",        DT_STR, R_NONE, UL 
&PgpListSecringCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to list the secret key ring's contents.  The
+  ** output format must be analogous to the one used by 
+  ** gpg --list-keys --with-colons.
+  ** .pp
+  ** This format is also generated by the pgpring utility which comes 
+  ** with mutt.
+  ** (PGP only)
+  */  
+  { "pgp_list_pubring_command", DT_STR, R_NONE, UL &PgpListPubringCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to list the public key ring's contents.  The
+  ** output format must be analogous to the one used by 
+  ** gpg --list-keys --with-colons.
+  ** .pp
+  ** This format is also generated by the pgpring utility which comes 
+  ** with mutt.
+  ** (PGP only)
+  */  
+  { "forward_decrypt", DT_BOOL, R_NONE, OPTFORWDECRYPT, 1 },
+  /*
+  ** .pp
+  ** Controls the handling of encrypted messages when forwarding a message.
+  ** When set, the outer layer of encryption is stripped off.  This
+  ** variable is only used if ``$$mime_forward'' is \fIset\fP and
+  ** ``$$mime_forward_decode'' is \fIunset\fP.
+  ** (PGP only)
+  */
+  { "forw_decrypt",    DT_SYN,  R_NONE, UL "forward_decrypt", 0 },
+  /*
+  */
+  
+  { "smime_timeout",           DT_NUM,  R_NONE, UL &SmimeTimeout, 300 },
+  /*
+  ** .pp
+  ** The number of seconds after which a cached passphrase will expire if
+  ** not used.
+  ** (S/MIME only)
+  */
+  { "smime_encrypt_with",      DT_STR,  R_NONE, UL &SmimeCryptAlg, 0 },
+  /*
+  ** .pp
+  ** This sets the algorithm that should be used for encryption.
+  ** Valid choices are "des", "des3", "rc2-40", "rc2-64", "rc2-128".
+  ** If unset "3des" (TripleDES) is used.
+  ** (S/MIME only)
+  */
+  { "smime_keys",              DT_PATH, R_NONE, UL &SmimeKeys, 0 },
+  /*
+  ** .pp
+  ** Since there is no pubring/secring as with PGP, mutt has to handle
+  ** storage ad retrieval of keys/certs by itself. This is very basic right 
now,
+  ** and stores keys and certificates in two different directories, both
+  ** named as the hash-value retrieved from OpenSSL. There is an index file
+  ** which contains mailbox-address keyid pair, and which can be manually
+  ** edited. This one points to the location of the private keys.
+  ** (S/MIME only)
+  */
+  { "smime_ca_location",       DT_PATH, R_NONE, UL &SmimeCALocation, 0 },
+  /*
+  ** .pp
+  ** This variable contains the name of either a directory, or a file which
+  ** contains trusted certificates for use with OpenSSL.
+  ** (S/MIME only)
+  */
+  { "smime_certificates",      DT_PATH, R_NONE, UL &SmimeCertificates, 0 },
+  /*
+  ** .pp
+  ** Since there is no pubring/secring as with PGP, mutt has to handle
+  ** storage and retrieval of keys by itself. This is very basic right
+  ** now, and keys and certificates are stored in two different
+  ** directories, both named as the hash-value retrieved from
+  ** OpenSSL. There is an index file which contains mailbox-address
+  ** keyid pairs, and which can be manually edited. This one points to
+  ** the location of the certificates.
+  ** (S/MIME only)
+  */
+  { "smime_decrypt_command",   DT_STR, R_NONE, UL &SmimeDecryptCommand, 0},
+  /*
+  ** .pp
+  ** This format string specifies a command which is used to decrypt
+  ** application/x-pkcs7-mime attachments.
+  ** .pp
+  ** The OpenSSL command formats have their own set of printf-like sequences
+  ** similar to PGP's:
+  ** .pp
+  ** .dl
+  ** .dt %f .dd Expands to the name of a file containing a message.
+  ** .dt %s .dd Expands to the name of a file containing the signature part
+  ** .          of a multipart/signed attachment when verifying it.
+  ** .dt %k .dd The key-pair specified with $$smime_default_key
+  ** .dt %c .dd One or more certificate IDs.
+  ** .dt %a .dd The algorithm used for encryption.
+  ** .dt %C .dd CA location:  Depending on whether $$smime_ca_location
+  ** .          points to a directory or file, this expands to 
+  ** .          "-CApath $$smime_ca_location" or "-CAfile $$smime_ca_location".
+  ** .de
+  ** .pp
+  ** For examples on how to configure these formats, see the smime.rc in
+  ** the samples/ subdirectory which has been installed on your system
+  ** alongside the documentation.
+  ** (S/MIME only)
+  */
+  { "smime_verify_command",    DT_STR, R_NONE, UL &SmimeVerifyCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to verify S/MIME signatures of type multipart/signed.
+  ** (S/MIME only)
+  */
+  { "smime_verify_opaque_command",     DT_STR, R_NONE, UL 
&SmimeVerifyOpaqueCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to verify S/MIME signatures of type
+  ** application/x-pkcs7-mime.
+  ** (S/MIME only)
+  */
+  { "smime_sign_command",      DT_STR, R_NONE, UL &SmimeSignCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to created S/MIME signatures of type
+  ** multipart/signed, which can be read by all mail clients.
+  ** (S/MIME only)
+  */
+  { "smime_sign_opaque_command",       DT_STR, R_NONE, UL 
&SmimeSignOpaqueCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to created S/MIME signatures of type
+  ** application/x-pkcs7-signature, which can only be handled by mail
+  ** clients supporting the S/MIME extension.
+  ** (S/MIME only)
+  */
+  { "smime_encrypt_command",   DT_STR, R_NONE, UL &SmimeEncryptCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to create encrypted S/MIME messages.
+  ** (S/MIME only)
+  */
+  { "smime_pk7out_command",    DT_STR, R_NONE, UL &SmimePk7outCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to extract PKCS7 structures of S/MIME signatures,
+  ** in order to extract the public X509 certificate(s).
+  ** (S/MIME only)
+  */
+  { "smime_get_cert_command",  DT_STR, R_NONE, UL &SmimeGetCertCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to extract X509 certificates from a PKCS7 structure.
+  ** (S/MIME only)
+  */
+  { "smime_get_signer_cert_command",   DT_STR, R_NONE, UL 
&SmimeGetSignerCertCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to extract only the signers X509 certificate from a 
S/MIME
+  ** signature, so that the certificate's owner may get compared to the
+  ** email's 'From'-field.
+  ** (S/MIME only)
+  */
+  { "smime_import_cert_command",       DT_STR, R_NONE, UL 
&SmimeImportCertCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to import a certificate via smime_keys.
+  ** (S/MIME only)
+  */
+  { "smime_get_cert_email_command",    DT_STR, R_NONE, UL 
&SmimeGetCertEmailCommand, 0},
+  /*
+  ** .pp
+  ** This command is used to extract the mail address(es) used for storing
+  ** X509 certificates, and for verification purposes (to check whether the
+  ** certificate was issued for the sender's mailbox).
+  ** (S/MIME only)
+  */
+  { "smime_sign_as",                   DT_SYN,  R_NONE, UL 
"smime_default_key", 0 },
+  { "smime_default_key",               DT_STR,  R_NONE, UL &SmimeDefaultKey, 0 
},
+  /*
+  ** .pp
+  ** This is the default key-pair to use for signing. This must be set to the
+  ** keyid (the hash-value that OpenSSL generates) to work properly
+  ** (S/MIME only)
+  */
+  
+#if defined(USE_SSL)||defined(USE_NSS)
+# ifndef USE_NSS  
+  { "ssl_starttls", DT_QUAD, R_NONE, OPT_SSLSTARTTLS, M_YES },
+  /*
+  ** .pp
+  ** If set (the default), mutt will attempt to use STARTTLS on servers
+  ** advertising the capability. When unset, mutt will not attempt to
+  ** use STARTTLS regardless of the server's capabilities.
+  */
+# endif  
+  { "certificate_file",        DT_PATH, R_NONE, UL &SslCertFile, 0 },
+  /*
+  ** .pp
+  ** This variable specifies the file where the certificates you trust
+  ** are saved. When an unknown certificate is encountered, you are asked
+  ** if you accept it or not. If you accept it, the certificate can also 
+  ** be saved in this file and further connections are automatically 
+  ** accepted.
+  ** .pp
+  ** You can also manually add CA certificates in this file. Any server
+  ** certificate that is signed with one of these CA certificates are 
+  ** also automatically accepted.
+  ** .pp
+  ** Example: set certificate_file=~/.mutt/certificates
+  */
+  { "ssl_usesystemcerts", DT_BOOL, R_NONE, OPTSSLSYSTEMCERTS, 1 },
+  /*
+  ** .pp
+  ** If set to \fIyes\fP, mutt will use CA certificates in the
+  ** system-wide certificate store when checking if server certificate 
+  ** is signed by a trusted CA.
+  */
+  { "entropy_file",    DT_PATH, R_NONE, UL &SslEntropyFile, 0 },
+  /*
+  ** .pp
+  ** The file which includes random data that is used to initialize SSL
+  ** library functions.
+   */
+  { "ssl_use_sslv2", DT_BOOL, R_NONE, OPTSSLV2, 1 },
+  /*
+  ** .pp
+  ** This variables specifies whether to attempt to use SSLv2 in the
+  ** SSL authentication process.
+  */
+  { "ssl_use_sslv3", DT_BOOL, R_NONE, OPTSSLV3, 1 },
+  /*
+  ** .pp
+  ** This variables specifies whether to attempt to use SSLv3 in the
+  ** SSL authentication process.
+  */
+  { "ssl_use_tlsv1", DT_BOOL, R_NONE, OPTTLSV1, 1 },
+  /*
+  ** .pp
+  ** This variables specifies whether to attempt to use TLSv1 in the
+  ** SSL authentication process.
+  */
+  { "ssl_client_cert", DT_PATH, R_NONE, UL &SslClientCert, 0 },
+  /*
+  ** .pp
+  ** The file containing a client certificate and its associated private
+  ** key.
+  */
+#endif
+
+  { "pipe_split",      DT_BOOL, R_NONE, OPTPIPESPLIT, 0 },
+  /*
+  ** .pp
+  ** Used in connection with the \fIpipe-message\fP command and the ``tag-
+  ** prefix'' operator.  If this variable is unset, when piping a list of
+  ** tagged messages Mutt will concatenate the messages and will pipe them
+  ** as a single folder.  When set, Mutt will pipe the messages one by one.
+  ** In both cases the messages are piped in the current sorted order,
+  ** and the ``$$pipe_sep'' separator is added after each message.
+  */
+  { "pipe_decode",     DT_BOOL, R_NONE, OPTPIPEDECODE, 0 },
+  /*
+  ** .pp
+  ** Used in connection with the \fIpipe-message\fP command.  When unset,
+  ** Mutt will pipe the messages without any preprocessing. When set, Mutt
+  ** will weed headers and will attempt to PGP/MIME decode the messages
+  ** first.
+  */
+  { "pipe_sep",                DT_STR,  R_NONE, UL &PipeSep, UL "\n" },
+  /*
+  ** .pp
+  ** The separator to add between messages when piping a list of tagged
+  ** messages to an external Unix command.
+  */
+#ifdef USE_POP
+  { "pop_authenticators", DT_STR, R_NONE, UL &PopAuthenticators, UL 0 },
+  /*
+  ** .pp
+  ** This is a colon-delimited list of authentication methods mutt may
+  ** attempt to use to log in to an POP server, in the order mutt should
+  ** try them.  Authentication methods are either 'user', 'apop' or any
+  ** SASL mechanism, eg 'digest-md5', 'gssapi' or 'cram-md5'.
+  ** This parameter is case-insensitive. If this parameter is unset
+  ** (the default) mutt will try all available methods, in order from
+  ** most-secure to least-secure.
+  ** .pp
+  ** Example: set pop_authenticators="digest-md5:apop:user"
+  */
+  { "pop_auth_try_all",        DT_BOOL, R_NONE, OPTPOPAUTHTRYALL, 1 },
+  /*
+  ** .pp
+  ** If set, Mutt will try all available methods. When unset, Mutt will
+  ** only fall back to other authentication methods if the previous
+  ** methods are unavailable. If a method is available but authentication
+  ** fails, Mutt will not connect to the POP server.
+  */
+  { "pop_checkinterval", DT_NUM, R_NONE, UL &PopCheckTimeout, 60 },
+  /*
+  ** .pp
+  ** This variable configures how often (in seconds) POP should look for
+  ** new mail.
+  */
+  { "pop_delete",      DT_QUAD, R_NONE, OPT_POPDELETE, M_ASKNO },
+  /*
+  ** .pp
+  ** If set, Mutt will delete successfully downloaded messages from the POP
+  ** server when using the fetch-mail function.  When unset, Mutt will
+  ** download messages but also leave them on the POP server.
+  */
+  { "pop_host",                DT_STR,  R_NONE, UL &PopHost, UL "" },
+  /*
+  ** .pp
+  ** The name of your POP server for the fetch-mail function.  You
+  ** can also specify an alternative port, username and password, ie:
+  ** .pp
+  ** [pop[s]://][username[:password]@]popserver[:port]
+  */
+  { "pop_last",                DT_BOOL, R_NONE, OPTPOPLAST, 0 },
+  /*
+  ** .pp
+  ** If this variable is set, mutt will try to use the "LAST" POP command
+  ** for retrieving only unread messages from the POP server when using
+  ** the fetch-mail function.
+  */
+  { "pop_reconnect",   DT_QUAD, R_NONE, OPT_POPRECONNECT, M_ASKYES },
+  /*
+  ** .pp
+  ** Controls whether or not Mutt will try to reconnect to POP server when
+  ** connection lost.
+  */
+  { "pop_user",                DT_STR,  R_NONE, UL &PopUser, 0 },
+  /*
+  ** .pp
+  ** Your login name on the POP server.
+  ** .pp
+  ** This variable defaults to your user name on the local machine.
+  */
+  { "pop_pass",                DT_STR,  R_NONE, UL &PopPass, UL "" },
+  /*
+  ** .pp
+  ** Specifies the password for your POP account.  If unset, Mutt will
+  ** prompt you for your password when you open POP mailbox.
+  ** \fBWarning\fP: you should only use this option when you are on a
+  ** fairly secure machine, because the superuser can read your muttrc
+  ** even if you are the only one who can read the file.
+  */
+#endif /* USE_POP */
+  { "post_indent_string",DT_STR, R_NONE, UL &PostIndentString, UL "" },
+  /*
+  ** .pp
+  ** Similar to the ``$$attribution'' variable, Mutt will append this
+  ** string after the inclusion of a message which is being replied to.
+  */
+  { "post_indent_str",  DT_SYN,  R_NONE, UL "post_indent_string", 0 },
+  /*
+  */
+  { "postpone",                DT_QUAD, R_NONE, OPT_POSTPONE, M_ASKYES },
+  /*
+  ** .pp
+  ** Controls whether or not messages are saved in the ``$$postponed''
+  ** mailbox when you elect not to send immediately.
+  */
+  { "postponed",       DT_PATH, R_NONE, UL &Postponed, UL "~/postponed" },
+  /*
+  ** .pp
+  ** Mutt allows you to indefinitely ``$postpone sending a message'' which
+  ** you are editing.  When you choose to postpone a message, Mutt saves it
+  ** in the mailbox specified by this variable.  Also see the ``$$postpone''
+  ** variable.
+  */
+#ifdef USE_SOCKET
+  { "preconnect",      DT_STR, R_NONE, UL &Preconnect, UL 0},
+  /*
+  ** .pp
+  ** If set, a shell command to be executed if mutt fails to establish
+  ** a connection to the server. This is useful for setting up secure
+  ** connections, e.g. with ssh(1). If the command returns a  nonzero
+  ** status, mutt gives up opening the server. Example:
+  ** .pp
+  ** preconnect="ssh -f -q -L 1234:mailhost.net:143 mailhost.net
+  **                   sleep 20 < /dev/null > /dev/null"
+  ** .pp
+  ** Mailbox 'foo' on mailhost.net can now be reached
+  ** as '{localhost:1234}foo'.
+  ** .pp
+  ** NOTE: For this example to work, you must be able to log in to the
+  ** remote machine without having to enter a password.
+  */
+#endif /* USE_SOCKET */
+  { "print",           DT_QUAD, R_NONE, OPT_PRINT, M_ASKNO },
+  /*
+  ** .pp
+  ** Controls whether or not Mutt asks for confirmation before printing.
+  ** This is useful for people (like me) who accidentally hit ``p'' often.
+  */
+  { "print_command",   DT_PATH, R_NONE, UL &PrintCmd, UL "lpr" },
+  /*
+  ** .pp
+  ** This specifies the command pipe that should be used to print messages.
+  */
+  { "print_cmd",       DT_SYN,  R_NONE, UL "print_command", 0 },
+  /*
+  */
+  { "print_decode",    DT_BOOL, R_NONE, OPTPRINTDECODE, 1 },
+  /*
+  ** .pp
+  ** Used in connection with the print-message command.  If this
+  ** option is set, the message is decoded before it is passed to the
+  ** external command specified by $$print_command.  If this option
+  ** is unset, no processing will be applied to the message when
+  ** printing it.  The latter setting may be useful if you are using
+  ** some advanced printer filter which is able to properly format
+  ** e-mail messages for printing.
+  */
+  { "print_split",     DT_BOOL, R_NONE, OPTPRINTSPLIT,  0 },
+  /*
+  ** .pp
+  ** Used in connection with the print-message command.  If this option
+  ** is set, the command specified by $$print_command is executed once for
+  ** each message which is to be printed.  If this option is unset, 
+  ** the command specified by $$print_command is executed only once, and
+  ** all the messages are concatenated, with a form feed as the message
+  ** separator.
+  ** .pp
+  ** Those who use the \fBenscript\fP(1) program's mail-printing mode will
+  ** most likely want to set this option.
+  */
+  { "prompt_after",    DT_BOOL, R_NONE, OPTPROMPTAFTER, 1 },
+  /*
+  ** .pp
+  ** If you use an \fIexternal\fP ``$$pager'', setting this variable will
+  ** cause Mutt to prompt you for a command when the pager exits rather
+  ** than returning to the index menu.  If unset, Mutt will return to the
+  ** index menu when the external pager exits.
+  */
+  { "query_command",   DT_PATH, R_NONE, UL &QueryCmd, UL "" },
+  /*
+  ** .pp
+  ** This specifies the command that mutt will use to make external address
+  ** queries.  The string should contain a %s, which will be substituted
+  ** with the query string the user types.  See ``$query'' for more
+  ** information.
+  */
+  { "quit",            DT_QUAD, R_NONE, OPT_QUIT, M_YES },
+  /*
+  ** .pp
+  ** This variable controls whether ``quit'' and ``exit'' actually quit
+  ** from mutt.  If it set to yes, they do quit, if it is set to no, they
+  ** have no effect, and if it is set to ask-yes or ask-no, you are
+  ** prompted for confirmation when you try to quit.
+  */
+  { "quote_regexp",    DT_RX,   R_PAGER, UL &QuoteRegexp, UL "^([ 
\t]*[|>:}#])+" },
+  /*
+  ** .pp
+  ** A regular expression used in the internal-pager to determine quoted
+  ** sections of text in the body of a message.
+  ** .pp
+  ** \fBNote:\fP In order to use the \fIquoted\fP\fBx\fP patterns in the
+  ** internal pager, you need to set this to a regular expression that
+  ** matches \fIexactly\fP the quote characters at the beginning of quoted
+  ** lines.
+  */
+  { "read_inc",                DT_NUM,  R_NONE, UL &ReadInc, 10 },
+  /*
+  ** .pp
+  ** If set to a value greater than 0, Mutt will display which message it
+  ** is currently on when reading a mailbox.  The message is printed after
+  ** \fIread_inc\fP messages have been read (e.g., if set to 25, Mutt will
+  ** print a message when it reads message 25, and then again when it gets
+  ** to message 50).  This variable is meant to indicate progress when
+  ** reading large mailboxes which may take some time.
+  ** When set to 0, only a single message will appear before the reading
+  ** the mailbox.
+  ** .pp
+  ** Also see the ``$$write_inc'' variable.
+  */
+  { "read_only",       DT_BOOL, R_NONE, OPTREADONLY, 0 },
+  /*
+  ** .pp
+  ** If set, all folders are opened in read-only mode.
+  */
+  { "realname",                DT_STR,  R_BOTH, UL &Realname, 0 },
+  /*
+  ** .pp
+  ** This variable specifies what "real" or "personal" name should be used
+  ** when sending messages.
+  ** .pp
+  ** By default, this is the GECOS field from /etc/passwd.  Note that this
+  ** variable will \fInot\fP be used when the user has set a real name
+  ** in the $$from variable.
+  */
+  { "recall",          DT_QUAD, R_NONE, OPT_RECALL, M_ASKYES },
+  /*
+  ** .pp
+  ** Controls whether or not you are prompted to recall postponed messages
+  ** when composing a new message.  Also see ``$$postponed''.
+  ** .pp
+  ** Setting this variable to ``yes'' is not generally useful, and thus not
+  ** recommended.
+  */
+  { "record",          DT_PATH, R_NONE, UL &Outbox, UL "" },
+  /*
+  ** .pp
+  ** This specifies the file into which your outgoing messages should be
+  ** appended.  (This is meant as the primary method for saving a copy of
+  ** your messages, but another way to do this is using the ``$my_hdr''
+  ** command to create a \fIBcc:\fP field with your email address in it.)
+  ** .pp
+  ** The value of \fI$$record\fP is overridden by the ``$$force_name'' and
+  ** ``$$save_name'' variables, and the ``$fcc-hook'' command.
+  */
+  { "reply_regexp",    DT_RX,   R_INDEX|R_RESORT, UL &ReplyRegexp, UL 
"^(re([\\[0-9\\]+])*|aw):[ \t]*" },
+  /*
+  ** .pp
+  ** A regular expression used to recognize reply messages when threading
+  ** and replying. The default value corresponds to the English "Re:" and
+  ** the German "Aw:".
+  */
+  { "reply_self",      DT_BOOL, R_NONE, OPTREPLYSELF, 0 },
+  /*
+  ** .pp
+  ** If unset and you are replying to a message sent by you, Mutt will
+  ** assume that you want to reply to the recipients of that message rather
+  ** than to yourself.
+  */
+  { "reply_to",                DT_QUAD, R_NONE, OPT_REPLYTO, M_ASKYES },
+  /*
+  ** .pp
+  ** If set, Mutt will ask you if you want to use the address listed in the
+  ** Reply-To: header field when replying to a message.  If you answer no,
+  ** it will use the address in the From: header field instead.  This
+  ** option is useful for reading a mailing list that sets the Reply-To:
+  ** header field to the list address and you want to send a private
+  ** message to the author of a message.
+  */
+  { "resolve",         DT_BOOL, R_NONE, OPTRESOLVE, 1 },
+  /*
+  ** .pp
+  ** When set, the cursor will be automatically advanced to the next
+  ** (possibly undeleted) message whenever a command that modifies the
+  ** current message is executed.
+  */
+  { "reverse_alias",   DT_BOOL, R_BOTH, OPTREVALIAS, 0 },
+  /*
+  ** .pp
+  ** This variable controls whether or not Mutt will display the "personal"
+  ** name from your aliases in the index menu if it finds an alias that
+  ** matches the message's sender.  For example, if you have the following
+  ** alias:
+  ** .pp
+  ** .ts
+  **  alias juser abd30425@xxxxxxxxxxxxx (Joe User)
+  ** .te
+  ** .pp
+  ** and then you receive mail which contains the following header:
+  ** .pp
+  ** .ts
+  **  From: abd30425@xxxxxxxxxxxxx
+  ** .te
+  ** .pp
+  ** It would be displayed in the index menu as ``Joe User'' instead of
+  ** ``abd30425@xxxxxxxxxxxxxx''  This is useful when the person's e-mail
+  ** address is not human friendly (like CompuServe addresses).
+  */
+  { "reverse_name",    DT_BOOL, R_BOTH, OPTREVNAME, 0 },
+  /*
+  ** .pp
+  ** It may sometimes arrive that you receive mail to a certain machine,
+  ** move the messages to another machine, and reply to some the messages
+  ** from there.  If this variable is set, the default \fIFrom:\fP line of
+  ** the reply messages is built using the address where you received the
+  ** messages you are replying to.  If the variable is unset, the
+  ** \fIFrom:\fP line will use your address on the current machine.
+  */
+  { "reverse_realname",        DT_BOOL, R_BOTH, OPTREVREAL, 1 },
+  /*
+  ** .pp
+  ** This variable fine-tunes the behaviour of the $reverse_name feature.
+  ** When it is set, mutt will use the address from incoming messages as-is,
+  ** possibly including eventual real names.  When it is unset, mutt will
+  ** override any such real names with the setting of the $realname variable.
+  */
+  { "rfc2047_parameters", DT_BOOL, R_NONE, OPTRFC2047PARAMS, 0 },
+  /*
+  ** .pp
+  ** When this variable is set, Mutt will decode RFC-2047-encoded MIME 
+  ** parameters. You want to set this variable when mutt suggests you
+  ** to save attachments to files named like this: 
+  ** =?iso-8859-1?Q?file=5F=E4=5F991116=2Ezip?=
+  ** .pp
+  ** When this variable is set interactively, the change doesn't have
+  ** the desired effect before you have changed folders.
+  ** .pp
+  ** Note that this use of RFC 2047's encoding is explicitly,
+  ** prohibited by the standard, but nevertheless encountered in the
+  ** wild.
+  ** Also note that setting this parameter will \fInot\fP have the effect 
+  ** that mutt \fIgenerates\fP this kind of encoding.  Instead, mutt will
+  ** unconditionally use the encoding specified in RFC 2231.
+  */
+  { "save_address",    DT_BOOL, R_NONE, OPTSAVEADDRESS, 0 },
+  /*
+  ** .pp
+  ** If set, mutt will take the sender's full address when choosing a
+  ** default folder for saving a mail. If ``$$save_name'' or ``$$force_name''
+  ** is set too, the selection of the fcc folder will be changed as well.
+  */
+  { "save_empty",      DT_BOOL, R_NONE, OPTSAVEEMPTY, 1 },
+  /*
+  ** .pp
+  ** When unset, mailboxes which contain no saved messages will be removed
+  ** when closed (the exception is ``$$spoolfile'' which is never removed).
+  ** If set, mailboxes are never removed.
+  ** .pp
+  ** \fBNote:\fP This only applies to mbox and MMDF folders, Mutt does not
+  ** delete MH and Maildir directories.
+  */
+  { "save_name",       DT_BOOL, R_NONE, OPTSAVENAME, 0 },
+  /*
+  ** .pp
+  ** This variable controls how copies of outgoing messages are saved.
+  ** When set, a check is made to see if a mailbox specified by the
+  ** recipient address exists (this is done by searching for a mailbox in
+  ** the ``$$folder'' directory with the \fIusername\fP part of the
+  ** recipient address).  If the mailbox exists, the outgoing message will
+  ** be saved to that mailbox, otherwise the message is saved to the
+  ** ``$$record'' mailbox.
+  ** .pp
+  ** Also see the ``$$force_name'' variable.
+  */
+  { "score",           DT_BOOL, R_NONE, OPTSCORE, 1 },
+  /*
+  ** .pp
+  ** When this variable is \fIunset\fP, scoring is turned off.  This can
+  ** be useful to selectively disable scoring for certain folders when the
+  ** ``$$score_threshold_delete'' variable and friends are used.
+  **
+  */
+  { "score_threshold_delete", DT_NUM, R_NONE, UL &ScoreThresholdDelete, UL -1 
},
+  /*
+  ** .pp
+  ** Messages which have been assigned a score equal to or lower than the value
+  ** of this variable are automatically marked for deletion by mutt.  Since
+  ** mutt scores are always greater than or equal to zero, the default setting
+  ** of this variable will never mark a message for deletion.
+  */
+  { "score_threshold_flag", DT_NUM, R_NONE, UL &ScoreThresholdFlag, 9999 },
+  /* 
+  ** .pp
+  ** Messages which have been assigned a score greater than or equal to this 
+  ** variable's value are automatically marked "flagged".
+  */
+  { "score_threshold_read", DT_NUM, R_NONE, UL &ScoreThresholdRead, UL -1 },
+  /*
+  ** .pp
+  ** Messages which have been assigned a score equal to or lower than the value
+  ** of this variable are automatically marked as read by mutt.  Since
+  ** mutt scores are always greater than or equal to zero, the default setting
+  ** of this variable will never mark a message read.
+  */
+  { "send_charset",    DT_STR,  R_NONE, UL &SendCharset, UL 
"us-ascii:iso-8859-1:utf-8" },
+  /*
+  ** .pp
+  ** A list of character sets for outgoing messages. Mutt will use the
+  ** first character set into which the text can be converted exactly.
+  ** If your ``$$charset'' is not iso-8859-1 and recipients may not
+  ** understand UTF-8, it is advisable to include in the list an
+  ** appropriate widely used standard character set (such as
+  ** iso-8859-2, koi8-r or iso-2022-jp) either instead of or after
+  ** "iso-8859-1".
+  */
+  { "sendmail",                DT_PATH, R_NONE, UL &Sendmail, UL SENDMAIL " 
-oem -oi" },
+  /*
+  ** .pp
+  ** Specifies the program and arguments used to deliver mail sent by Mutt.
+  ** Mutt expects that the specified program interprets additional
+  ** arguments as recipient addresses.
+  */
+  { "sendmail_wait",   DT_NUM,  R_NONE, UL &SendmailWait, 0 },
+  /*
+  ** .pp
+  ** Specifies the number of seconds to wait for the ``$$sendmail'' process
+  ** to finish before giving up and putting delivery in the background.
+  ** .pp
+  ** Mutt interprets the value of this variable as follows:
+  ** .dl
+  ** .dt >0 .dd number of seconds to wait for sendmail to finish before 
continuing
+  ** .dt 0  .dd wait forever for sendmail to finish
+  ** .dt <0 .dd always put sendmail in the background without waiting
+  ** .de
+  ** .pp
+  ** Note that if you specify a value other than 0, the output of the child
+  ** process will be put in a temporary file.  If there is some error, you
+  ** will be informed as to where to find the output.
+  */
+  { "shell",           DT_PATH, R_NONE, UL &Shell, 0 },
+  /*
+  ** .pp
+  ** Command to use when spawning a subshell.  By default, the user's login
+  ** shell from /etc/passwd is used.
+  */
+  { "sig_dashes",      DT_BOOL, R_NONE, OPTSIGDASHES, 1 },
+  /*
+  ** .pp
+  ** If set, a line containing ``-- '' will be inserted before your
+  ** ``$$signature''.  It is \fBstrongly\fP recommended that you not unset
+  ** this variable unless your ``signature'' contains just your name.  The
+  ** reason for this is because many software packages use ``-- \n'' to
+  ** detect your signature.  For example, Mutt has the ability to highlight
+  ** the signature in a different color in the builtin pager.
+  */
+  { "sig_on_top",      DT_BOOL, R_NONE, OPTSIGONTOP, 0},
+  /*
+  ** .pp
+  ** If set, the signature will be included before any quoted or forwarded
+  ** text.  It is \fBstrongly\fP recommended that you do not set this variable
+  ** unless you really know what you are doing, and are prepared to take
+  ** some heat from netiquette guardians.
+  */
+  { "signature",       DT_PATH, R_NONE, UL &Signature, UL "~/.signature" },
+  /*
+  ** .pp
+  ** Specifies the filename of your signature, which is appended to all
+  ** outgoing messages.   If the filename ends with a pipe (``|''), it is
+  ** assumed that filename is a shell command and input should be read from
+  ** its stdout.
+  */
+  { "simple_search",   DT_STR,  R_NONE, UL &SimpleSearch, UL "~f %s | ~s %s" },
+  /*
+  ** .pp
+  ** Specifies how Mutt should expand a simple search into a real search
+  ** pattern.  A simple search is one that does not contain any of the ~
+  ** operators.  See ``$patterns'' for more information on search patterns.
+  ** .pp
+  ** For example, if you simply type joe at a search or limit prompt, Mutt
+  ** will automatically expand it to the value specified by this variable.
+  ** For the default value it would be:
+  ** .pp
+  ** ~f joe | ~s joe
+  */
+  { "smart_wrap",      DT_BOOL, R_PAGER, OPTWRAP, 1 },
+  /*
+  ** .pp
+  ** Controls the display of lines longer than the screen width in the
+  ** internal pager. If set, long lines are wrapped at a word boundary.  If
+  ** unset, lines are simply wrapped at the screen edge. Also see the
+  ** ``$$markers'' variable.
+  */
+  { "smileys",         DT_RX,   R_PAGER, UL &Smileys, UL "(>From 
)|(:[-^]?[][)(><}{|/DP])" },
+  /*
+  ** .pp
+  ** The \fIpager\fP uses this variable to catch some common false
+  ** positives of ``$$quote_regexp'', most notably smileys in the beginning
+  ** of a line
+  */
+  { "sleep_time",      DT_NUM, R_NONE, UL &SleepTime, 1 },
+  /*
+  ** .pp
+  ** Specifies time, in seconds, to pause while displaying certain 
informational
+  ** messages, while moving from folder to folder and after expunging
+  ** messages from the current folder.  The default is to pause one second, so 
+  ** a value of zero for this option suppresses the pause.
+  */
+  { "sort",            DT_SORT, R_INDEX|R_RESORT, UL &Sort, SORT_DATE },
+  /*
+  ** .pp
+  ** Specifies how to sort messages in the \fIindex\fP menu.  Valid values
+  ** are:
+  ** .pp
+  ** .ts
+  ** .  date or date-sent
+  ** .  date-received
+  ** .  from
+  ** .  mailbox-order (unsorted)
+  ** .  score
+  ** .  size
+  ** .  spam
+  ** .  subject
+  ** .  threads
+  ** .  to
+  ** .te
+  ** .pp
+  ** You may optionally use the reverse- prefix to specify reverse sorting
+  ** order (example: set sort=reverse-date-sent).
+  */
+  { "sort_alias",      DT_SORT|DT_SORT_ALIAS,  R_NONE, UL &SortAlias, 
SORT_ALIAS },
+  /*
+  ** .pp
+  ** Specifies how the entries in the `alias' menu are sorted.  The
+  ** following are legal values:
+  ** .pp
+  ** .ts
+  ** .  address (sort alphabetically by email address)
+  ** .  alias (sort alphabetically by alias name)
+  ** .  unsorted (leave in order specified in .muttrc)
+  ** .te
+  */
+  { "sort_aux",                DT_SORT|DT_SORT_AUX, R_INDEX|R_RESORT_BOTH, UL 
&SortAux, SORT_DATE },
+  /*
+  ** .pp
+  ** When sorting by threads, this variable controls how threads are sorted
+  ** in relation to other threads, and how the branches of the thread trees
+  ** are sorted.  This can be set to any value that ``$$sort'' can, except
+  ** threads (in that case, mutt will just use date-sent).  You can also
+  ** specify the last- prefix in addition to the reverse- prefix, but last-
+  ** must come after reverse-.  The last- prefix causes messages to be
+  ** sorted against its siblings by which has the last descendant, using
+  ** the rest of sort_aux as an ordering.  For instance, set sort_aux=last-
+  ** date-received would mean that if a new message is received in a
+  ** thread, that thread becomes the last one displayed (or the first, if
+  ** you have set sort=reverse-threads.) Note: For reversed ``$$sort''
+  ** order $$sort_aux is reversed again (which is not the right thing to do,
+  ** but kept to not break any existing configuration setting).
+  */
+  { "sort_browser",    DT_SORT|DT_SORT_BROWSER, R_NONE, UL &BrowserSort, 
SORT_ALPHA },
+  /*
+  ** .pp
+  ** Specifies how to sort entries in the file browser.  By default, the
+  ** entries are sorted alphabetically.  Valid values:
+  ** .pp
+  ** .ts
+  ** .  alpha (alphabetically)
+  ** .  date
+  ** .  size
+  ** .  unsorted
+  ** .te
+  ** .pp
+  ** You may optionally use the reverse- prefix to specify reverse sorting
+  ** order (example: set sort_browser=reverse-date).
+  */
+  { "sort_re",         DT_BOOL, R_INDEX|R_RESORT|R_RESORT_INIT, OPTSORTRE, 1 },
+  /*
+  ** .pp
+  ** This variable is only useful when sorting by threads with
+  ** ``$$strict_threads'' unset.  In that case, it changes the heuristic
+  ** mutt uses to thread messages by subject.  With sort_re set, mutt will
+  ** only attach a message as the child of another message by subject if
+  ** the subject of the child message starts with a substring matching the
+  ** setting of ``$$reply_regexp''.  With sort_re unset, mutt will attach
+  ** the message whether or not this is the case, as long as the
+  ** non-``$$reply_regexp'' parts of both messages are identical.
+  */
+  { "spam_separator",   DT_STR, R_NONE, UL &SpamSep, UL "," },
+  /*
+  ** .pp
+  ** ``$spam_separator'' controls what happens when multiple spam headers
+  ** are matched: if unset, each successive header will overwrite any
+  ** previous matches value for the spam label. If set, each successive
+  ** match will append to the previous, using ``$spam_separator'' as a
+  ** separator.
+  */
+  { "spoolfile",       DT_PATH, R_NONE, UL &Spoolfile, 0 },
+  /*
+  ** .pp
+  ** If your spool mailbox is in a non-default place where Mutt cannot find
+  ** it, you can specify its location with this variable.  Mutt will
+  ** automatically set this variable to the value of the environment
+  ** variable $$$MAIL if it is not set.
+  */
+  { "status_chars",    DT_STR,  R_BOTH, UL &StChars, UL "-*%A" },
+  /*
+  ** .pp
+  ** Controls the characters used by the "%r" indicator in
+  ** ``$$status_format''. The first character is used when the mailbox is
+  ** unchanged. The second is used when the mailbox has been changed, and
+  ** it needs to be resynchronized. The third is used if the mailbox is in
+  ** read-only mode, or if the mailbox will not be written when exiting
+  ** that mailbox (You can toggle whether to write changes to a mailbox
+  ** with the toggle-write operation, bound by default to "%"). The fourth
+  ** is used to indicate that the current folder has been opened in attach-
+  ** message mode (Certain operations like composing a new mail, replying,
+  ** forwarding, etc. are not permitted in this mode).
+  */
+  { "status_format",   DT_STR,  R_BOTH, UL &Status, UL "-%r-Mutt: %f 
[Msgs:%?M?%M/?%m%?n? New:%n?%?o? Old:%o?%?d? Del:%d?%?F? Flag:%F?%?t? 
Tag:%t?%?p? Post:%p?%?b? Inc:%b?%?l? %l?]---(%s/%S)-%>-(%P)---" },
+  /*
+  ** .pp
+  ** Controls the format of the status line displayed in the \fIindex\fP
+  ** menu.  This string is similar to ``$$index_format'', but has its own
+  ** set of printf()-like sequences:
+  ** .pp
+  ** .dl
+  ** .dt %b  .dd number of mailboxes with new mail *
+  ** .dt %d  .dd number of deleted messages *
+  ** .dt %f  .dd the full pathname of the current mailbox
+  ** .dt %F  .dd number of flagged messages *
+  ** .dt %h  .dd local hostname
+  ** .dt %l  .dd size (in bytes) of the current mailbox *
+  ** .dt %L  .dd size (in bytes) of the messages shown 
+  **             (i.e., which match the current limit) *
+  ** .dt %m  .dd the number of messages in the mailbox *
+  ** .dt %M  .dd the number of messages shown (i.e., which match the current 
limit) *
+  ** .dt %n  .dd number of new messages in the mailbox *
+  ** .dt %o  .dd number of old unread messages
+  ** .dt %p  .dd number of postponed messages *
+  ** .dt %P  .dd percentage of the way through the index
+  ** .dt %r  .dd modified/read-only/won't-write/attach-message indicator,
+  **             according to $$status_chars
+  ** .dt %s  .dd current sorting mode ($$sort)
+  ** .dt %S  .dd current aux sorting method ($$sort_aux)
+  ** .dt %t  .dd number of tagged messages *
+  ** .dt %u  .dd number of unread messages *
+  ** .dt %v  .dd Mutt version string
+  ** .dt %V  .dd currently active limit pattern, if any *
+  ** .dt %>X .dd right justify the rest of the string and pad with "X"
+  ** .dt %|X .dd pad to the end of the line with "X"
+  ** .de
+  ** .pp
+  ** * = can be optionally printed if nonzero
+  ** .pp
+  ** Some of the above sequences can be used to optionally print a string
+  ** if their value is nonzero.  For example, you may only want to see the
+  ** number of flagged messages if such messages exist, since zero is not
+  ** particularly meaningful.  To optionally print a string based upon one
+  ** of the above sequences, the following construct is used
+  ** .pp
+  **  %?<sequence_char>?<optional_string>?
+  ** .pp
+  ** where \fIsequence_char\fP is a character from the table above, and
+  ** \fIoptional_string\fP is the string you would like printed if
+  ** \fIstatus_char\fP is nonzero.  \fIoptional_string\fP \fBmay\fP contain
+  ** other sequence as well as normal text, but you may \fBnot\fP nest
+  ** optional strings.
+  ** .pp
+  ** Here is an example illustrating how to optionally print the number of
+  ** new messages in a mailbox:
+  ** %?n?%n new messages.?
+  ** .pp
+  ** Additionally you can switch between two strings, the first one, if a
+  ** value is zero, the second one, if the value is nonzero, by using the
+  ** following construct:
+  ** %?<sequence_char>?<if_string>&<else_string>?
+  ** .pp
+  ** You can additionally force the result of any printf-like sequence to
+  ** be lowercase by prefixing the sequence character with an underscore
+  ** (_) sign.  For example, if you want to display the local hostname in
+  ** lowercase, you would use:
+  ** %_h
+  ** .pp
+  ** If you prefix the sequence character with a colon (:) character, mutt
+  ** will replace any dots in the expansion by underscores. This might be 
helpful 
+  ** with IMAP folders that don't like dots in folder names.
+  */
+  { "status_on_top",   DT_BOOL, R_BOTH, OPTSTATUSONTOP, 0 },
+  /*
+  ** .pp
+  ** Setting this variable causes the ``status bar'' to be displayed on
+  ** the first line of the screen rather than near the bottom.
+  */
+  { "strict_threads",  DT_BOOL, R_RESORT|R_RESORT_INIT|R_INDEX, 
OPTSTRICTTHREADS, 0 },
+  /*
+  ** .pp
+  ** If set, threading will only make use of the ``In-Reply-To'' and
+  ** ``References'' fields when you ``$$sort'' by message threads.  By
+  ** default, messages with the same subject are grouped together in
+  ** ``pseudo threads.''  This may not always be desirable, such as in a
+  ** personal mailbox where you might have several unrelated messages with
+  ** the subject ``hi'' which will get grouped together.
+  */
+  { "suspend",         DT_BOOL, R_NONE, OPTSUSPEND, 1 },
+  /*
+  ** .pp
+  ** When \fIunset\fP, mutt won't stop when the user presses the terminal's
+  ** \fIsusp\fP key, usually ``control-Z''. This is useful if you run mutt
+  ** inside an xterm using a command like xterm -e mutt.
+  */
+  { "text_flowed",     DT_BOOL, R_NONE, OPTTEXTFLOWED,  0 },
+  /*
+  ** .pp
+  ** When set, mutt will generate text/plain; format=flowed attachments.
+  ** This format is easier to handle for some mailing software, and generally
+  ** just looks like ordinary text.  To actually make use of this format's 
+  ** features, you'll need support in your editor.
+  ** .pp
+  ** Note that $$indent_string is ignored when this option is set.
+  */
+  { "thread_received", DT_BOOL, R_RESORT|R_RESORT_INIT|R_INDEX, 
OPTTHREADRECEIVED, 0 },
+  /*
+  ** .pp
+  ** When set, mutt uses the date received rather than the date sent
+  ** to thread messages by subject.
+  */
+  { "thorough_search", DT_BOOL, R_NONE, OPTTHOROUGHSRC, 0 },
+  /*
+  ** .pp
+  ** Affects the \fI~b\fP and \fI~h\fP search operations described in
+  ** section ``$patterns'' above.  If set, the headers and attachments of
+  ** messages to be searched are decoded before searching.  If unset,
+  ** messages are searched as they appear in the folder.
+  */
+  { "tilde",           DT_BOOL, R_PAGER, OPTTILDE, 0 },
+  /*
+  ** .pp
+  ** When set, the internal-pager will pad blank lines to the bottom of the
+  ** screen with a tilde (~).
+  */
+  { "timeout",         DT_NUM,  R_NONE, UL &Timeout, 600 },
+  /*
+  ** .pp
+  ** This variable controls the \fInumber of seconds\fP Mutt will wait
+  ** for a key to be pressed in the main menu before timing out and
+  ** checking for new mail.  A value of zero or less will cause Mutt
+  ** to never time out.
+  */
+  { "tmpdir",          DT_PATH, R_NONE, UL &Tempdir, 0 },
+  /*
+  ** .pp
+  ** This variable allows you to specify where Mutt will place its
+  ** temporary files needed for displaying and composing messages.  If
+  ** this variable is not set, the environment variable TMPDIR is
+  ** used.  If TMPDIR is not set then "/tmp" is used.
+  */
+  { "to_chars",                DT_STR,  R_BOTH, UL &Tochars, UL " +TCFL" },
+  /*
+  ** .pp
+  ** Controls the character used to indicate mail addressed to you.  The
+  ** first character is the one used when the mail is NOT addressed to your
+  ** address (default: space).  The second is used when you are the only
+  ** recipient of the message (default: +).  The third is when your address
+  ** appears in the TO header field, but you are not the only recipient of
+  ** the message (default: T).  The fourth character is used when your
+  ** address is specified in the CC header field, but you are not the only
+  ** recipient.  The fifth character is used to indicate mail that was sent
+  ** by \fIyou\fP.  The sixth character is used to indicate when a mail
+  ** was sent to a mailing-list you subscribe to (default: L).
+  */
+#ifdef USE_SOCKET
+  { "tunnel",            DT_STR, R_NONE, UL &Tunnel, UL 0 },
+  /*
+  ** .pp
+  ** Setting this variable will cause mutt to open a pipe to a command
+  ** instead of a raw socket. You may be able to use this to set up
+  ** preauthenticated connections to your IMAP/POP3 server. Example:
+  ** .pp
+  ** tunnel="ssh -q mailhost.net /usr/local/libexec/imapd"
+  ** .pp
+  ** NOTE: For this example to work you must be able to log in to the remote
+  ** machine without having to enter a password.
+  */
+#endif
+  { "use_8bitmime",    DT_BOOL, R_NONE, OPTUSE8BITMIME, 0 },
+  /*
+  ** .pp
+  ** \fBWarning:\fP do not set this variable unless you are using a version
+  ** of sendmail which supports the -B8BITMIME flag (such as sendmail
+  ** 8.8.x) or you may not be able to send mail.
+  ** .pp
+  ** When \fIset\fP, Mutt will invoke ``$$sendmail'' with the -B8BITMIME
+  ** flag when sending 8-bit messages to enable ESMTP negotiation.
+  */
+  { "use_domain",      DT_BOOL, R_NONE, OPTUSEDOMAIN, 1 },
+  /*
+  ** .pp
+  ** When set, Mutt will qualify all local addresses (ones without the
+  ** @host portion) with the value of ``$$hostname''.  If \fIunset\fP, no
+  ** addresses will be qualified.
+  */
+  { "use_from",                DT_BOOL, R_NONE, OPTUSEFROM, 1 },
+  /*
+  ** .pp
+  ** When \fIset\fP, Mutt will generate the `From:' header field when
+  ** sending messages.  If \fIunset\fP, no `From:' header field will be
+  ** generated unless the user explicitly sets one using the ``$my_hdr''
+  ** command.
+  */
+#ifdef HAVE_GETADDRINFO
+  { "use_ipv6",                DT_BOOL, R_NONE, OPTUSEIPV6, 1},
+  /*
+  ** .pp
+  ** When \fIset\fP, Mutt will look for IPv6 addresses of hosts it tries to
+  ** contact.  If this option is unset, Mutt will restrict itself to IPv4 
addresses.
+  ** Normally, the default should work.
+  */
+#endif /* HAVE_GETADDRINFO */
+  { "user_agent",      DT_BOOL, R_NONE, OPTXMAILER, 1},
+  /*
+  ** .pp
+  ** When \fIset\fP, mutt will add a "User-Agent" header to outgoing
+  ** messages, indicating which version of mutt was used for composing
+  ** them.
+  */
+  { "visual",          DT_PATH, R_NONE, UL &Visual, 0 },
+  /*
+  ** .pp
+  ** Specifies the visual editor to invoke when the \fI~v\fP command is
+  ** given in the builtin editor.
+  */
+  { "wait_key",                DT_BOOL, R_NONE, OPTWAITKEY, 1 },
+  /*
+  ** .pp
+  ** Controls whether Mutt will ask you to press a key after \fIshell-
+  ** escape\fP, \fIpipe-message\fP, \fIpipe-entry\fP, \fIprint-message\fP,
+  ** and \fIprint-entry\fP commands.
+  ** .pp
+  ** It is also used when viewing attachments with ``$auto_view'', provided
+  ** that the corresponding mailcap entry has a \fIneedsterminal\fP flag,
+  ** and the external program is interactive.
+  ** .pp
+  ** When set, Mutt will always ask for a key. When unset, Mutt will wait
+  ** for a key only if the external command returned a non-zero status.
+  */
+  { "weed",            DT_BOOL, R_NONE, OPTWEED, 1 },
+  /*
+  ** .pp
+  ** When set, mutt will weed headers when when displaying, forwarding,
+  ** printing, or replying to messages.
+  */
+  { "wrap_search",     DT_BOOL, R_NONE, OPTWRAPSEARCH, 1 },
+  /*
+  ** .pp
+  ** Controls whether searches wrap around the end of the mailbox.
+  ** .pp
+  ** When set, searches will wrap around the first (or last) message. When
+  ** unset, searches will not wrap.
+  */
+  { "wrapmargin",      DT_NUM,  R_PAGER, UL &WrapMargin, 0 },
+  /*
+  ** .pp
+  ** Controls the size of the margin remaining at the right side of
+  ** the terminal when mutt's pager does smart wrapping.
+  */
+  { "write_inc",       DT_NUM,  R_NONE, UL &WriteInc, 10 },
+  /*
+  ** .pp
+  ** When writing a mailbox, a message will be printed every
+  ** \fIwrite_inc\fP messages to indicate progress.  If set to 0, only a
+  ** single message will be displayed before writing a mailbox.
+  ** .pp
+  ** Also see the ``$$read_inc'' variable.
+  */
+  { "write_bcc",       DT_BOOL, R_NONE, OPTWRITEBCC, 1},
+  /*
+  ** .pp
+  ** Controls whether mutt writes out the Bcc header when preparing
+  ** messages to be sent.  Exim users may wish to use this.
+  */
+  /*--*/
+  { NULL }
+};
+
+const struct mapping_t SortMethods[] = {
+  { "date",            SORT_DATE },
+  { "date-sent",       SORT_DATE },
+  { "date-received",   SORT_RECEIVED },
+  { "mailbox-order",   SORT_ORDER },
+  { "subject",         SORT_SUBJECT },
+  { "from",            SORT_FROM },
+  { "size",            SORT_SIZE },
+  { "threads",         SORT_THREADS },
+  { "to",              SORT_TO },
+  { "score",           SORT_SCORE },
+  { "spam",            SORT_SPAM },
+  { NULL,              0 }
+};
+
+/* same as SortMethods, but with "threads" replaced by "date" */
+
+const struct mapping_t SortAuxMethods[] = {
+  { "date",            SORT_DATE },
+  { "date-sent",       SORT_DATE },
+  { "date-received",   SORT_RECEIVED },
+  { "mailbox-order",   SORT_ORDER },
+  { "subject",         SORT_SUBJECT },
+  { "from",            SORT_FROM },
+  { "size",            SORT_SIZE },
+  { "threads",         SORT_DATE },    /* note: sort_aux == threads
+                                        * isn't possible. 
+                                        */
+  { "to",              SORT_TO },
+  { "score",           SORT_SCORE },
+  { "spam",            SORT_SPAM },
+  { NULL,              0 }
+};
+  
+
+const struct mapping_t SortBrowserMethods[] = {
+  { "alpha",   SORT_SUBJECT },
+  { "date",    SORT_DATE },
+  { "size",    SORT_SIZE },
+  { "unsorted",        SORT_ORDER },
+  { NULL }
+};
+
+const struct mapping_t SortAliasMethods[] = {
+  { "alias",   SORT_ALIAS },
+  { "address", SORT_ADDRESS },
+  { "unsorted", SORT_ORDER },
+  { NULL }
+};
+
+const struct mapping_t SortKeyMethods[] = {
+  { "address", SORT_ADDRESS },
+  { "date",    SORT_DATE },
+  { "keyid",   SORT_KEYID },
+  { "trust",   SORT_TRUST },
+  { NULL }
+};
+
+
+/* functions used to parse commands in a rc file */
+
+static int parse_list (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+static int parse_rx_list (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+static int parse_spam_list (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+static int parse_unlist (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+static int parse_rx_unlist (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+
+static int parse_unlists (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+static int parse_alias (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+static int parse_unalias (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+static int parse_ignore (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+static int parse_unignore (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+static int parse_source (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+static int parse_set (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+static int parse_my_hdr (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+static int parse_unmy_hdr (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+static int parse_subscribe (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+
+struct command_t
+{
+  char *name;
+  int (*func) (BUFFER *, BUFFER *, unsigned long, BUFFER *);
+  unsigned long data;
+};
+
+struct command_t Commands[] = {
+  { "alternates",      parse_rx_list,          UL &Alternates },
+  { "unalternates",    parse_rx_unlist,        UL &Alternates },
+#ifdef USE_SOCKET
+  { "account-hook",     mutt_parse_hook,        M_ACCOUNTHOOK },
+#endif
+  { "alias",           parse_alias,            0 },
+  { "auto_view",       parse_list,             UL &AutoViewList },
+  { "alternative_order",       parse_list,     UL &AlternativeOrderList},
+  { "bind",            mutt_parse_bind,        0 },
+  { "charset-hook",    mutt_parse_hook,        M_CHARSETHOOK },
+#ifdef HAVE_COLOR
+  { "color",           mutt_parse_color,       0 },
+  { "uncolor",         mutt_parse_uncolor,     0 },
+#endif
+  { "exec",            mutt_parse_exec,        0 },
+  { "fcc-hook",                mutt_parse_hook,        M_FCCHOOK },
+  { "fcc-save-hook",   mutt_parse_hook,        M_FCCHOOK | M_SAVEHOOK },
+  { "folder-hook",     mutt_parse_hook,        M_FOLDERHOOK },
+  { "hdr_order",       parse_list,             UL &HeaderOrderList },
+#ifdef HAVE_ICONV
+  { "iconv-hook",      mutt_parse_hook,        M_ICONVHOOK }, 
+#endif
+  { "ignore",          parse_ignore,           0 },
+  { "lists",           parse_rx_list,          UL &MailLists },
+  { "macro",           mutt_parse_macro,       0 },
+  { "mailboxes",       mutt_parse_mailboxes,   M_MAILBOXES },
+  { "unmailboxes",     mutt_parse_mailboxes,   M_UNMAILBOXES },
+  { "message-hook",    mutt_parse_hook,        M_MESSAGEHOOK },
+  { "mbox-hook",       mutt_parse_hook,        M_MBOXHOOK },
+  { "mime_lookup",     parse_list,     UL &MimeLookupList },
+  { "unmime_lookup",   parse_unlist,   UL &MimeLookupList },
+  { "mono",            mutt_parse_mono,        0 },
+  { "my_hdr",          parse_my_hdr,           0 },
+  { "pgp-hook",                mutt_parse_hook,        M_CRYPTHOOK },
+  { "crypt-hook",      mutt_parse_hook,        M_CRYPTHOOK },
+  { "push",            mutt_parse_push,        0 },
+  { "reply-hook",      mutt_parse_hook,        M_REPLYHOOK },
+  { "reset",           parse_set,              M_SET_RESET },
+  { "save-hook",       mutt_parse_hook,        M_SAVEHOOK },
+  { "score",           mutt_parse_score,       0 },
+  { "send-hook",       mutt_parse_hook,        M_SENDHOOK },
+  { "set",             parse_set,              0 },
+  { "source",          parse_source,           0 },
+  { "spam",            parse_spam_list,        M_SPAM },
+  { "nospam",          parse_spam_list,        M_NOSPAM },
+  { "subscribe",       parse_subscribe,        0 },
+  { "toggle",          parse_set,              M_SET_INV },
+  { "unalias",         parse_unalias,          0 },
+  { "unalternative_order",parse_unlist,                UL 
&AlternativeOrderList },
+  { "unauto_view",     parse_unlist,           UL &AutoViewList },
+  { "unhdr_order",     parse_unlist,           UL &HeaderOrderList },
+  { "unhook",          mutt_parse_unhook,      0 },
+  { "unignore",                parse_unignore,         0 },
+  { "unlists",         parse_unlists,          0 },
+  { "unmono",          mutt_parse_unmono,      0 },
+  { "unmy_hdr",                parse_unmy_hdr,         0 },
+  { "unscore",         mutt_parse_unscore,     0 },
+  { "unset",           parse_set,              M_SET_UNSET },
+  { "unsubscribe",     parse_rx_unlist,        UL &SubscribedLists },
+  { NULL }
+};