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/[un]notalternates/ <em/regexp/ [ <em/regexp/ ...
]<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/ [
<em/regexp/ ... ]
<item>
<tt><ref id="alternates" name="unalternates"></tt> [ * | <em/regexp/ ...
]
+<item>
+<tt><ref id="notalternates" name="notalternates"></tt> <em/regexp/ [
<em/regexp/ ... ]
+<item>
+<tt><ref id="notalternates" name="unnotalternates"></tt> [ * |
<em/regexp/ ... ]
<item>
<tt><ref id="alternative_order" name="alternative_order"></tt>
<em/mimetype/ [ <em/mimetype/ ... ]
<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="<me@xxxxxxxxxx>">
+<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
+<me@xxxxxxxxxx> 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 <delete> 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="$to_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,
+``_'' 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="$index_format">.
+For example, you could use "%?M?(#%03M)&(%4l)?" in
<ref
+id="index_format"name="$index_format"> to optionally
+display the number of hidden messages if the thread is collapsed.
+
+See also: <ref id="strict_threads" name="$strict_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="$alias_file"> variable for future use. <bf/Note:/
+Specifying an <ref id="alias_file" name="$alias_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="$honor_followup_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="$pipe_decode">, <ref id="pipe_split"
+name="$pipe_split">, <ref id="pipe_sep"
+name="$pipe_sep"> and <ref id="wait_key"
+name="$wait_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="$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="$wait_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="$quote_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="$askcc">, <ref id="askbcc" name="$askbcc">, <ref
+id="autoedit" name="$autoedit">, <ref id="bounce"
+name="$bounce">, and <ref id="fast_reply"
+name="$fast_reply"> for changing how Mutt asks these
+questions.
+
+Mutt will then automatically start your <ref id="editor"
+name="$editor"> on the message body. If the <ref id="edit_headers"
+name="$edit_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="$attribution">, <ref id="indent_string"
+name="$indent_string"> and <ref id="post_indent_string"
+name="$post_indent_string">. When forwarding a
+message, if the <ref id="mime_forward" name="$mime_forward">
+variable is unset, a copy of the forwarded message will be included. If
+you have specified a <ref id="signature" name="$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="$status_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/ [ <em/description/ ]<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_headers">.
+
+<sect2>Using Mutt with PGP
+
+<p>
+If you want to use PGP, you can specify
+
+<tt/Pgp:/ [ <tt/E/ | <tt/S/ | <tt/S/<em/<id>/ ] <newline>
+
+``E'' encrypts, ``S'' signs and
+``S<id>'' signs with the given key, setting <ref
+id="pgp_sign_as" name="$pgp_sign_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="$pgp_entry_format">)
+have obvious meanings. But some explanations on the capabilities, flags,
+and validity fields are in order.
+
+The flags sequence (%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 (%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 %c entry of the remailer menu lines (see
+<ref id="mix_entry_format"
+name="$mix_entry_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="$mime_forward"> variable. Decoding of attachments,
+like in the pager, can be controlled by the <ref id="forward_decode"
+name="$forward_decode"> and <ref id="mime_forward_decode"
+name="$mime_forward_decode"> variables,
+respectively. The desired forwarding format may depend on the content,
+therefore <em/$mime_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="$weed"> variable, unless <ref
+id="mime_forward" name="mime_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="$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="$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
+(``#''), 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? # 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 [see
+next paragraph]), 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.
+
+\ 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
+``\'' to force the next character to be a literal instead of interpreted
+character.
+<tscreen><verb>
+set realname="Michael \"MuttDude\" Elkins"
+</verb></tscreen>
+
+``\\'' means to insert a literal ``\'' into the line.
+``\n'' and ``\r'' have their usual C meanings of linefeed and
+carriage-return, respectively.
+
+A \ 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 ``$''. 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/ [ , <em/address/, ... ]
+
+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/ [ * | <em/key/ <em/.../ ]
+
+<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="$alias_file"> variable (which is
+<tt>˜/.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="$edit_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/\Cx/, where <em/x/ is the
+letter of the control character (for example, to specify control-A use
+``\Ca''). Note that the case of <em/x/ as well as <em/\C/ is
+ignored, so that <em/\CA/, <em/\Ca/, <em/\cA/ and <em/\ca/
are all
+equivalent. An alternative form is to specify the key as a three digit
+octal number prefixed with a ``\'' (for example <em/\177/ is
+equivalent to <em/\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/ [!]<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="$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/ [ <em/description/
]
+
+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/ˆx/. In order to get a caret (`ˆ'') you need to use
+<em/ˆˆ/. Secondly, to specify a certain key such as <em/up/
+or to invoke a function directly, you can use the format
+<em/<key name>/ and <em/<function name>/. 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/ [
<em/regexp/ ]<newline>
+Usage: <tt/color/ index <em/foreground/ <em/background/ <em/pattern/<newline>
+Usage: <tt/uncolor/ index <em/pattern/ [ <em/pattern/ ... ]<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="$quote_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 ``˜'' 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/, …,
+<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/<object> <attribute>/ [ <em/regexp/
]<newline>
+Usage: <tt/mono/ index <em/attribute/ <em/pattern/<newline>
+Usage: <tt/unmono/ index <em/pattern/ [ <em/pattern/ ... ]<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/[un]ignore/ <em/pattern/ [ <em/pattern/ ... ]
+
+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/[un]alternates/ <em/regexp/ [ <em/regexp/ ...
]<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="$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/[un]lists/ <em/regexp/ [ <em/regexp/ ...
]<newline>
+Usage: <tt/[un]subscribe/ <em/regexp/ [ <em/regexp/ ... ]
+
+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="$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/ [!]<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/[un]mailboxes/ [!]<em/filename/ [
<em/filename/ ... ]
+
+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="$folder"> and <ref id="spoolfile" name="$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/ [ <em/field/ ... ]
+
+The ``my_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_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_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_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_order From Date: From: To: Cc: Subject:
+</verb></tscreen>
+
+<sect1>Specify default save filename<label id="save-hook">
+<p>
+Usage: <tt/save-hook/ [!]<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/ [!]<em/pattern/ <em/mailbox/
+
+This command is used to save outgoing mail in a mailbox other than
+<ref id="record" name="$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="$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$ +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/ [!]<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/ [!]<em/pattern/ <em/command/<newline>
+Usage: <tt/send-hook/ [!]<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_forward signature=''&dquot;/
+
+Another typical use for this command is to change the values of the
+<ref id="attribution" name="$attribution">, <ref id="signature"
+name="$signature"> and <ref id="locale" name="$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/ [!]<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/ [ <em/function/ ... ]
+
+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 <function>''.
+
+<sect1>Message Scoring<label id="score-command">
+<p>
+Usage: <tt/score/ <em/pattern/ <em/value/<newline>
+Usage: <tt/unscore/ <em/pattern/ [ <em/pattern/ ... ]
+
+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>˜b</tt>,
+<tt>˜B</tt> or <tt>˜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="$index_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 $spam_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 $spam_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 $spam_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/$index_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/ [no|inv]<em/variable/[=<em/value/] [
<em/variable/ ... ]<newline>
+Usage: <tt/toggle/ <em/variable/ [<em/variable/ ... ]<newline>
+Usage: <tt/unset/ <em/variable/ [<em/variable/ ... ]<newline>
+Usage: <tt/reset/ <em/variable/ [<em/variable/ ... ]
+
+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/\n/ and <bf/\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_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 ``&'' 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>˜/.mail_aliases</tt> so that I can make my
+<tt>˜/.muttrc</tt> readable and keep my aliases private.
+
+If the filename begins with a 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/ [ * | <em/hook-type/ ]
+
+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 ``\''
+must be quoted if used for a regular expression in an initialization
+command: ``\\''.
+
+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 ``ˆ'' 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 ``['' and ``]'' matches any
+single character in that list; if the first character of the list
+is a caret ``ˆ'' then it matches any character <bf/not/ in the
+list. For example, the regular expression <bf/[0123456789]/
+matches any single digit. A range of ASCII characters may be specified
+by giving the first and last characters, separated by a hyphen
+``‐''. Most metacharacters lose their special meaning inside
+lists. To include a literal ``]'' place it first in the list.
+Similarly, to include a literal ``ˆ'' place it anywhere but first.
+Finally, to include a literal hyphen ``‐'' place it last.
+
+Certain named classes of characters are predefined. Character classes
+consist of ``[:'', a keyword denoting the class, and ``:]''.
+The following classes are defined by the POSIX standard:
+
+<descrip>
+<tag/[:alnum:]/
+Alphanumeric characters.
+<tag/[:alpha:]/
+Alphabetic characters.
+<tag/[:blank:]/
+Space or tab characters.
+<tag/[:cntrl:]/
+Control characters.
+<tag/[:digit:]/
+Numeric characters.
+<tag/[:graph:]/
+Characters that are both printable and visible. (A space is printable,
+but not visible, while an ``a'' is both.)
+<tag/[:lower:]/
+Lower-case alphabetic characters.
+<tag/[:print:]/
+Printable characters (characters that are not control characters.)
+<tag/[:punct:]/
+Punctuation characters (characters that are not letter, digits, control
+characters, or space characters).
+<tag/[:space:]/
+Space characters (such as space, tab and formfeed, to name a few).
+<tag/[:upper:]/
+Upper-case alphabetic characters.
+<tag/[:xdigit:]/
+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/[[:digit:]]/ is equivalent to
+<bf/[0-9]/.
+
+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
+``[.'' and ``.]''. For example, if ``ch'' is a collating
+element, then <bf/[[.ch.]]/ is a regexp that matches
+this collating element, while <bf/[ch]/ 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 ``[=''
+and ``=]''. For example, the name ``e'' might be used to
+represent all of ``è'' ``é'' and ``e''. In this case,
+<bf/[[=e=]]/ is a regexp that matches any of
+``è'', ``é'' 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/{n}/
+The preceding item is matched exactly <em/n/ times.
+<tag/{n,}/
+The preceding item is matched <em/n/ or more times.
+<tag/{,m}/
+The preceding item is matched at most <em/m/ times.
+<tag/{n,m}/
+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/\\y/
+Matches the empty string at either the beginning or the end of a word.
+<tag/\\B/
+Matches the empty string within a word.
+<tag/\\</
+Matches the empty string at the beginning of a word.
+<tag/\\>/
+Matches the empty string at the end of a word.
+<tag/\\w/
+Matches any word-constituent character (letter, digit, or underscore).
+<tag/\\W/
+Matches any character that is not word-constituent.
+<tag/\\`/
+Matches the empty string at the beginning of a buffer (string).
+<tag/\\'/
+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/<[MAX]/, <tt/>[MIN]/,
+<tt/[MIN]-/ and <tt/-[MAX]/
+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/˜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>><em/offset/ (messages older than <em/offset/ units)
+<item><<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="$index_format"> to include a
+<tt/%[...]/ 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="$auto_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="$default_hook"> variable. The
+pattern is translated at the time the hook is declared, so the value of
+<ref id="default_hook" name="$default_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="$query_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="$mbox_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_'' 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_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="$spoolfile">
(incoming) mailbox
+<item>> -- refers to your <ref id="mbox" name="$mbox"> file
+<item>< -- refers to your <ref id="record" name="$record"> file
+<item>- or !! -- refers to the file you've last visited
+<item>˜ -- refers to your home directory
+<item>= or + -- refers to your <ref id="folder" name="$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="$index_format"> variable, the escape ``%L''
+will return the string ``To <list>'' when ``list'' appears in the
+``To'' field, and ``Cc <list>'' 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="$followup_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="$honor_followup_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="$reply_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="$index_format"> variable's ``%y'' and
+``%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="$dsn_notify"> is used to request receipts for
+different results (such as failed message, message delivered, etc.).
+<ref id="dsn_return" name="$dsn_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="$pop_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_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="$imap_list_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="$mail_check">
+and
+<ref id="timeout" name="$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="$imap_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="$imap_pass"> - a
+ password which you may preset, used by all authentication methods where
+ a password is needed.
+<item><ref id="imap_authenticators"
+ name="$imap_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>${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/$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 # 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 %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 %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 %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_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/$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="$wait_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="$wait_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=<command></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=<command></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=<command></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=<command></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=<template></tag>
+This field specifies the format for the file denoted by %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=<command></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/%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/%t/
+Mutt will expand %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>%{<parameter>}</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 %{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>\%</tag>
+This will be replaced by a %
+</descrip>
+Mutt does not currently support the %F and %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_view/ muttrc command to list the
+content-types that you wish to view automatically.
+
+For instance, if you set auto_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_order list to determine if one of the available types
+is preferred. The alternative_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_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_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_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_view) specified. Common usage would be:
+<tscreen><verb>
+mime_lookup application/octet-stream application/X-Lotus-Manuscript
+</verb></tscreen>
+
+In addition, the unmime_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/ [ -nz ] [ -F <em/muttrc/ ] [ -m <em/type/
] [ -f <em/mailbox/ ]
+
+To compose a new message
+
+<tt/mutt/ [ -n ] [ -F <em/muttrc/ ] [ -a <em/file/
] [ -c <em/address/ ] [ -i <em/filename/ ] [ -s
<em/subject/ ] <em/address/ [ <em/address/ ... ]
+
+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 #2&dquot; professor@xxxxxxxxxxxxx
+< ˜/run2.dat</tt>
+
+This command will send a message to ``professor@xxxxxxxxxxxxx'' with a subject
+of ``data set for run #2''. In the body of the message will be the
contents
+of the file ``˜/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/ [ ,
<em/address/, ... ]
+<item>
+<tt><ref id="alias" name="unalias"></tt> [ * | <em/key/ ... ]
+<item>
+<tt><ref id="alternates" name="alternates"></tt> <em/regexp/ [
<em/regexp/ ... ]
+<item>
+<tt><ref id="alternates" name="unalternates"></tt> [ * | <em/regexp/ ...
]
+<item>
+<tt><ref id="alternative_order" name="alternative_order"></tt>
<em/mimetype/ [ <em/mimetype/ ... ]
+<item>
+<tt><ref id="alternative_order" name="unalternative_order"></tt>
<em/mimetype/ [ <em/mimetype/ ... ]
+<item>
+<tt><ref id="auto_view" name="auto_view"></tt> <em/mimetype/ [
<em/mimetype/ ... ]
+<item>
+<tt><ref id="auto_view" name="unauto_view"></tt> <em/mimetype/ [
<em/mimetype/ ... ]
+<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/ [ <em/regexp/ ]
+<item>
+<tt><ref id="color" name="uncolor"></tt> <em/index/ <em/pattern/ [
<em/pattern/ ... ]
+<item>
+<tt><ref id="exec" name="exec"></tt> <em/function/ [ <em/function/ ...
]
+<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_order"></tt> <em/header/ [
<em/header/ ... ]
+<item>
+<tt><ref id="hdr_order" name="unhdr_order"></tt> <em/header/ [
<em/header/ ... ]
+<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/ [ <em/pattern/ ...
]
+<item>
+<tt><ref id="ignore" name="unignore"></tt> <em/pattern/ [ <em/pattern/
... ]
+<item>
+<tt><ref id="lists" name="lists"></tt> <em/regexp/ [ <em/regexp/ ...
]
+<item>
+<tt><ref id="lists" name="unlists"></tt> <em/regexp/ [ <em/regexp/ ...
]
+<item>
+<tt><ref id="macro" name="macro"></tt> <em/menu/ <em/key/ <em/sequence/ [
<em/description/ ]
+<item>
+<tt><ref id="mailboxes" name="mailboxes"></tt> <em/filename/ [
<em/filename/ ... ]
+<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_lookup"></tt> <em/mimetype/ [
<em/mimetype/ ... ]
+<item>
+<tt><ref id="mime_lookup" name="unmime_lookup"></tt> <em/mimetype/
[ <em/mimetype/ ... ]
+<item>
+<tt><ref id="color" name="mono"></tt> <em/object attribute/ [ <em/regexp/
]
+<item>
+<tt><ref id="color" name="unmono"></tt> <em/index/ <em/pattern/ [
<em/pattern/ ... ]
+<item>
+<tt><ref id="my_hdr" name="my_hdr"></tt> <em/string/
+<item>
+<tt><ref id="my_hdr" name="unmy_hdr"></tt> <em/field/ [ <em/field/
... ]
+<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/ [<em/variable/ ...
]
+<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/ [
<em/pattern/ ... ]
+<item>
+<tt><ref id="send-hook" name="send-hook"></tt> <em/regexp/ <em/command/
+<item>
+<tt><ref id="set" name="set"></tt>
[no|inv]<em/variable/[=<em/value/] [ <em/variable/ ...
]
+<item>
+<tt><ref id="set" name="unset"></tt> <em/variable/ [<em/variable/ ...
]
+<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/ [ <em/regexp/ ...
]
+<item>
+<tt><ref id="lists" name="unsubscribe"></tt> <em/regexp/ [ <em/regexp/
... ]
+<item>
+<tt><ref id="set" name="toggle"></tt> <em/variable/ [<em/variable/ ...
]
+<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(¤tline, 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(¤tline);
+ break;
+ }
+ }
+ else
+ {
+ if (rc < 0)
+ rc = -1;
+ }
+ if (conv)
+ FREE(¤tline);
+ }
+ 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 }
+};