diff options
Diffstat (limited to 'lisp/mh-e/mh-customize.el')
-rw-r--r-- | lisp/mh-e/mh-customize.el | 2902 |
1 files changed, 0 insertions, 2902 deletions
diff --git a/lisp/mh-e/mh-customize.el b/lisp/mh-e/mh-customize.el deleted file mode 100644 index 7089636d9fb..00000000000 --- a/lisp/mh-e/mh-customize.el +++ /dev/null @@ -1,2902 +0,0 @@ -;;; mh-customize.el --- MH-E customization - -;; Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. - -;; Author: Bill Wohler <wohler@newt.com> -;; Maintainer: Bill Wohler <wohler@newt.com> -;; Keywords: mail -;; See: mh-e.el - -;; This file is part of GNU Emacs. - -;; GNU Emacs 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, or (at your option) -;; any later version. - -;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. - -;;; Commentary: - -;; All of the defgroups, defcustoms, and deffaces in MH-E are found -;; here. This makes it possible to customize modules that aren't loaded -;; yet. It also makes it easier to organize the customization groups. - -;; This file contains the following sections: -;; -;; 1. MH-E Customization Groups -;; -;; These are the customization group definitions. Every group has a -;; associated manual node. The ordering is alphabetical, except for the -;; groups mh-faces and mh-hooks which are last . -;; -;; 2. MH-E Customization -;; -;; These are the actual customization variables. There is a sub-section for -;; each group in the MH-E Customization Groups section, in the same order, -;; separated by page breaks. Within each section, variables are sorted -;; alphabetically. -;; -;; 3. Hooks -;; -;; All hooks must be placed in the mh-hook group; in addition, add the -;; group associated with the manual node in which the hook is described. -;; Since the mh-hook group appears near the end of this file, the hooks -;; will appear at the end of these other groups. -;; -;; 4. Faces -;; -;; All faces must be placed in the mh-faces group; in addition, add the -;; group associated with the manual node in which the face is described. -;; Since the mh-faces group appears near the end of this file, the faces -;; will appear at the end of these other groups. -;; -;;; Change Log: - -;;; Code: - -;;(message "> mh-customize") -(provide 'mh-customize) - -(eval-when-compile (require 'mh-acros)) -(mh-require-cl) - -(eval-and-compile - (defvar mh-xemacs-flag (featurep 'xemacs) - "Non-nil means the current Emacs is XEmacs.") - (when mh-xemacs-flag - (require 'mh-xemacs))) - -(eval-and-compile - (require 'mh-identity) - (require 'mh-init) - (require 'mh-loaddefs)) -;;(message "< mh-customize") - -;; For compiler warnings... -(eval-when-compile - (defvar mh-show-buffer) - (defvar mh-show-folder-buffer)) - -(defun mh-customize (&optional delete-other-windows-flag) - "Customize MH-E variables. -If optional argument DELETE-OTHER-WINDOWS-FLAG is non-nil, other -windows in the frame are removed." - (interactive "P") - (customize-group 'mh-e) - (when delete-other-windows-flag - (delete-other-windows))) - - - -;;; MH-E Customization Groups - -(defgroup mh-e nil - "Emacs interface to the MH mail system. -MH is the Rand Mail Handler. Other implementations include nmh -and GNU mailutils." - :link '(custom-manual "(mh-e)Top") - :group 'mail) - -(defgroup mh-alias nil - "Aliases." - :link '(custom-manual "(mh-e)Aliases") - :prefix "mh-alias-" - :group 'mh-e) - -(defgroup mh-folder nil - "Organizing your mail with folders." - :prefix "mh-" - :link '(custom-manual "(mh-e)Folders") - :group 'mh-e) - -(defgroup mh-folder-selection nil - "Folder selection." - :prefix "mh-" - :link '(custom-manual "(mh-e)Folder Selection") - :group 'mh-e) - -(defgroup mh-identity nil - "Identities." - :link '(custom-manual "(mh-e)Identities") - :prefix "mh-identity-" - :group 'mh-e) - -(defgroup mh-inc nil - "Incorporating your mail." - :prefix "mh-inc-" - :link '(custom-manual "(mh-e)Incorporating Mail") - :group 'mh-e) - -(defgroup mh-junk nil - "Dealing with junk mail." - :link '(custom-manual "(mh-e)Junk") - :prefix "mh-junk-" - :group 'mh-e) - -(defgroup mh-letter nil - "Editing a draft." - :prefix "mh-" - :link '(custom-manual "(mh-e)Editing Drafts") - :group 'mh-e) - -(defgroup mh-ranges nil - "Ranges." - :prefix "mh-" - :link '(custom-manual "(mh-e)Ranges") - :group 'mh-e) - -(defgroup mh-scan-line-formats nil - "Scan line formats." - :link '(custom-manual "(mh-e)Scan Line Formats") - :prefix "mh-" - :group 'mh-e) - -(defgroup mh-search nil - "Searching." - :link '(custom-manual "(mh-e)Searching") - :prefix "mh-search-" - :group 'mh-e) - -(defgroup mh-sending-mail nil - "Sending mail." - :prefix "mh-" - :link '(custom-manual "(mh-e)Sending Mail") - :group 'mh-e) - -(defgroup mh-sequences nil - "Sequences." - :prefix "mh-" - :link '(custom-manual "(mh-e)Sequences") - :group 'mh-e) - -(defgroup mh-show nil - "Reading your mail." - :prefix "mh-" - :link '(custom-manual "(mh-e)Reading Mail") - :group 'mh-e) - -(defgroup mh-speedbar nil - "The speedbar." - :prefix "mh-speed-" - :link '(custom-manual "(mh-e)Speedbar") - :group 'mh-e) - -(defgroup mh-thread nil - "Threading." - :prefix "mh-thread-" - :link '(custom-manual "(mh-e)Threading") - :group 'mh-e) - -(defgroup mh-tool-bar nil - "The tool bar" - :link '(custom-manual "(mh-e)Tool Bar") - :prefix "mh-" - :group 'mh-e) - -(defgroup mh-hooks nil - "MH-E hooks." - :link '(custom-manual "(mh-e)Top") - :prefix "mh-" - :group 'mh-e) - -(defgroup mh-faces nil - "Faces used in MH-E." - :link '(custom-manual "(mh-e)Top") - :prefix "mh-" - :group 'faces - :group 'mh-e) - - - -;;; Emacs interface to the MH mail system (:group mh-e) -(eval-when (compile) - (setq mh-variant 'none)) - -(defcustom mh-path nil - "*Additional list of directories to search for MH. -See `mh-variant'." - :group 'mh-e - :type '(repeat (directory))) - -(defcustom mh-variant 'autodetect - "*Specifies the variant used by MH-E. - -The default setting of this option is \"Auto-detect\" which means -that MH-E will automatically choose the first of nmh, MH, or GNU -mailutils that it finds in the directories listed in -`mh-path' (which you can customize), `mh-sys-path', and -`exec-path'. If, for example, you have both nmh and mailutils -installed and `mh-variant-in-use' was initialized to nmh but you -want to use mailutils, then you can set this option to -\"mailutils\". - -When this variable is changed, MH-E resets `mh-progs', `mh-lib', -`mh-lib-progs', `mh-flists-present-flag', and `mh-variant-in-use' -accordingly." - :type `(radio - (const :tag "Auto-detect" autodetect) - ,@(mapcar (lambda (x) `(const ,(car x))) (mh-variants))) - :set (lambda (symbol value) - (set-default symbol value) ;Done in mh-variant-set-variant! - (mh-variant-set value)) - :group 'mh-e) - - - -;;; Aliases (:group 'mh-alias) - -(defcustom mh-alias-completion-ignore-case-flag t - "*Non-nil means don't consider case significant in MH alias completion. - -As MH ignores case in the aliases, so too does MH-E. However, you -may turn off this option to make case significant which can be -used to segregate completion of your aliases. You might use -lowercase for mailing lists and uppercase for people." - :type 'boolean - :group 'mh-alias) - -(defcustom mh-alias-expand-aliases-flag nil - "*Non-nil means to expand aliases entered in the minibuffer. - -In other words, aliases entered in the minibuffer will be -expanded to the full address in the message draft. By default, -this expansion is not performed." - :type 'boolean - :group 'mh-alias) - -(defcustom mh-alias-flash-on-comma t - "*Specify whether to flash address or warn on translation. - -This option controls the behavior when a [comma] is pressed while -entering aliases or addresses. The default setting flashes the -address associated with an address in the minibuffer briefly, but -does not display a warning if the alias is not found." - :type '(choice (const :tag "Flash but Don't Warn If No Alias" t) - (const :tag "Flash and Warn If No Alias" 1) - (const :tag "Don't Flash Nor Warn If No Alias" nil)) - :group 'mh-alias) - -(defcustom mh-alias-insert-file nil - "*Filename used to store a new MH-E alias. - -The default setting of this option is \"Use Aliasfile Profile -Component\". This option can also hold the name of a file or a -list a file names. If this option is set to a list of file names, -or the \"Aliasfile:\" profile component contains more than one file -name, MH-E will prompt for one of them when MH-E adds an alias." - :type '(choice (const :tag "Use Aliasfile Profile Component" nil) - (file :tag "Alias File") - (repeat :tag "List of Alias Files" file)) - :group 'mh-alias) - -(defcustom mh-alias-insertion-location 'sorted - "Specifies where new aliases are entered in alias files. - -This option is set to \"Alphabetical\" by default. If you organize -your alias file in other ways, then adding aliases to the \"Top\" -or \"Bottom\" of your alias file might be more appropriate." - :type '(choice (const :tag "Alphabetical" sorted) - (const :tag "Top" top) - (const :tag "Bottom" bottom)) - :group 'mh-alias) - -(defcustom mh-alias-local-users t - "*If on, local users are added to alias completion. - -Aliases are created from \"/etc/passwd\" entries with a user ID -larger than a magical number, typically 200. This can be a handy -tool on a machine where you and co-workers exchange messages. -These aliases have the form \"local.first.last\" if a real name is -present in the password file. Otherwise, the alias will have the -form \"local.login\". - -If you're on a system with thousands of users you don't know, and -the loading of local aliases slows MH-E down noticeably, then -turn this option off. - -This option also takes a string which is executed to generate the -password file. For example, use \"ypcat passwd\" to obtain the -NIS password file." - :type '(choice (boolean) (string)) - :group 'mh-alias) - -(defcustom mh-alias-local-users-prefix "local." - "*String prefixed to the real names of users from the password file. -This option can also be set to \"Use Login\". - -For example, consider the following password file entry: - - psg:x:1000:1000:Peter S Galbraith,,,:/home/psg:/bin/tcsh - -The following settings of this option will produce the associated -aliases: - - \"local.\" local.peter.galbraith - \"\" peter.galbraith - Use Login psg - -This option has no effect if variable `mh-alias-local-users' is -turned off." - :type '(choice (const :tag "Use Login" nil) - (string)) - :group 'mh-alias) - -(defcustom mh-alias-passwd-gecos-comma-separator-flag t - "*Non-nil means the gecos field in the password file uses a comma separator. - -In the example in `mh-alias-local-users-prefix', commas are used -to separate different values within the so-called gecos field. -This is a fairly common usage. However, in the rare case that the -gecos field in your password file is not separated by commas and -whose contents may contain commas, you can turn this option off." - :type 'boolean - :group 'mh-alias) - - - -;;; Organizing Your Mail with Folders (:group 'mh-folder) - -(defcustom mh-new-messages-folders t - "Folders searched for the \"unseen\" sequence. - -Set this option to \"Inbox\" to search the \"+inbox\" folder or -\"All\" to search all of the top level folders. Otherwise, list -the folders that should be searched with the \"Choose Folders\" -menu item. - -See also `mh-recursive-folders-flag'." - :type '(choice (const :tag "Inbox" t) - (const :tag "All" nil) - (repeat :tag "Choose Folders" (string :tag "Folder"))) - :group 'mh-folder) - -(defcustom mh-ticked-messages-folders t - "Folders searched for `mh-tick-seq'. - -Set this option to \"Inbox\" to search the \"+inbox\" folder or -\"All\" to search all of the top level folders. Otherwise, list -the folders that should be searched with the \"Choose Folders\" -menu item. - -See also `mh-recursive-folders-flag'." - :type '(choice (const :tag "Inbox" t) - (const :tag "All" nil) - (repeat :tag "Choose Folders" (string :tag "Folder"))) - :group 'mh-folder) - -(defcustom mh-large-folder 200 - "The number of messages that indicates a large folder. - -If a folder is deemed to be large, that is the number of messages -in it exceed this value, then confirmation is needed when it is -visited. Even when `mh-show-threads-flag' is non-nil, the folder -is not automatically threaded, if it is large. If set to nil all -folders are treated as if they are small." - :type '(choice (const :tag "No Limit") integer) - :group 'mh-folder) - -(defcustom mh-recenter-summary-flag nil - "*Non-nil means to recenter the summary window. - -If this option is turned on, recenter the summary window when the -show window is toggled off." - :type 'boolean - :group 'mh-folder) - -(defcustom mh-recursive-folders-flag nil - "*Non-nil means that commands which operate on folders do so recursively." - :type 'boolean - :group 'mh-folder) - -(defcustom mh-sortm-args nil - "*Additional arguments for \"sortm\"\\<mh-folder-mode-map>. - -This option is consulted when a prefix argument is used with -\\[mh-sort-folder]. Normally default arguments to \"sortm\" are -specified in the MH profile. This option may be used to provide -an alternate view. For example, \"'(\"-nolimit\" \"-textfield\" -\"subject\")\" is a useful setting." - :type 'string - :group 'mh-folder) - - - -;;; Folder Selection (:group 'mh-folder-selection) - -(defcustom mh-default-folder-for-message-function nil - "Function to select a default folder for refiling or \"Fcc:\". - -The current buffer is set to the message being refiled with point -at the start of the message. This function should return the -default folder as a string with a leading \"+\" sign. It can also -return nil so that the last folder name is used as the default, -or an empty string to suppress the default entirely." - :type 'function - :group 'mh-folder-selection) - -(defcustom mh-default-folder-list nil - "*List of addresses and folders. - -The folder name associated with the first address found in this -list is used as the default for `mh-refile-msg' and similar -functions. Each element in this list contains a \"Check Recipient\" -item. If this item is turned on, then the address is checked -against the recipient instead of the sender. This is useful for -mailing lists. - -See `mh-prompt-for-refile-folder' and `mh-folder-from-address' -for more information." - :type '(repeat (list (regexp :tag "Address") - (string :tag "Folder") - (boolean :tag "Check Recipient"))) - :group 'mh-folder-selection) - -(defcustom mh-default-folder-must-exist-flag t - "*Non-nil means guessed folder name must exist to be used. - -If the derived folder does not exist, and this option is on, then -the last folder name used is suggested. This is useful if you get -mail from various people for whom you have an alias, but file -them all in the same project folder. - -See `mh-prompt-for-refile-folder' and `mh-folder-from-address' -for more information." - :type 'boolean - :group 'mh-folder-selection) - -(defcustom mh-default-folder-prefix "" - "*Prefix used for folder names generated from aliases. -The prefix is used to prevent clutter in your mail directory. - -See `mh-prompt-for-refile-folder' and `mh-folder-from-address' -for more information." - :type 'string - :group 'mh-folder-selection) - - - -;;; Identities (:group 'mh-identity) - -(defcustom mh-identity-list nil - "*List of identities. - -To customize this option, click on the \"INS\" button and enter a label -such as \"Home\" or \"Work\". Then click on the \"INS\" button with the -label \"Add at least one item below\". Then choose one of the items in -the \"Value Menu\". - -You can specify an alternate \"From:\" header field using the \"From -Field\" menu item. You must include a valid email address. A standard -format is \"First Last <login@@host.domain>\". If you use an initial -with a period, then you must quote your name as in '\"First I. Last\" -<login@@host.domain>'. People usually list the name of the company -where they work using the \"Organization Field\" menu item. Set any -arbitrary header field and value in the \"Other Field\" menu item. -Unless the header field is a standard one, precede the name of your -field's label with \"X-\", as in \"X-Fruit-of-the-Day:\". The value of -\"Attribution Verb\" overrides the setting of -`mh-extract-from-attribution-verb'. Set your signature with the -\"Signature\" menu item. You can specify the contents of -`mh-signature-file-name', a file, or a function. Specify a different -key to sign or encrypt messages with the \"GPG Key ID\" menu item. - -You can select the identities you have added via the menu called -\"Identity\" in the MH-Letter buffer. You can also use -\\[mh-insert-identity]. To clear the fields and signature added by the -identity, select the \"None\" identity. - -The \"Identity\" menu contains two other items to save you from having -to set the identity on every message. The menu item \"Set Default for -Session\" can be used to set the default identity to the current -identity until you exit Emacs. The menu item \"Save as Default\" sets -the option `mh-identity-default' to the current identity setting. You -can also customize the `mh-identity-default' option in the usual -fashion." - :type '(repeat (list :tag "" - (string :tag "Label") - (repeat :tag "Add at least one item below" - (choice - (cons :tag "From Field" - (const "From") - (string :tag "Value")) - (cons :tag "Organization Field" - (const "Organization") - (string :tag "Value")) - (cons :tag "Other Field" - (string :tag "Field") - (string :tag "Value")) - (cons :tag "Attribution Verb" - (const ":attribution-verb") - (string :tag "Value")) - (cons :tag "Signature" - (const :tag "Signature" - ":signature") - (choice - (const :tag "mh-signature-file-name" - nil) - (file) - (function))) - (cons :tag "GPG Key ID" - (const :tag "GPG Key ID" - ":pgg-default-user-id") - (string :tag "Value")))))) - :set 'mh-identity-list-set - :group 'mh-identity) - -(defcustom mh-auto-fields-list nil - "List of recipients for which header lines are automatically inserted. - -This option can be used to set the identity depending on the -recipient. To customize this option, click on the \"INS\" button and -enter a regular expression for the recipient's address. Click on the -\"INS\" button with the \"Add at least one item below\" label. Then choose -one of the items in the \"Value Menu\". - -The \"Identity\" menu item is used to select an identity from those -configured in `mh-identity-list'. All of the information for that -identity will be added if the recipient matches. The \"Fcc Field\" menu -item is used to select a folder that is used in the \"Fcc:\" header. -When you send the message, MH will put a copy of your message in this -folder. The \"Mail-Followup-To Field\" menu item is used to insert an -\"Mail-Followup-To:\" header field with the recipients you provide. If -the recipient's mail user agent supports this header field (as nmh -does), then their replies will go to the addresses listed. This is -useful if their replies go both to the list and to you and you don't -have a mechanism to suppress duplicates. If you reply to someone not -on the list, you must either remove the \"Mail-Followup-To:\" field, or -ensure the recipient is also listed there so that he receives replies -to your reply. Other header fields may be added using the \"Other -Field\" menu item. - -These fields can only be added after the recipient is known. Once the -header contains one or more recipients, run the -\\[mh-insert-auto-fields] command or choose the \"Identity -> Insert -Auto Fields\" menu item to insert these fields manually. However, you -can just send the message and the fields will be added automatically. -You are given a chance to see these fields and to confirm them before -the message is actually sent. You can do away with this confirmation -by turning off the option `mh-auto-fields-prompt-flag'. - -You should avoid using the same header field in `mh-auto-fields-list' -and `mh-identity-list' definitions that may apply to the same message -as the result is undefined." - :type `(repeat - (list :tag "" - (string :tag "Recipient") - (repeat :tag "Add at least one item below" - (choice - (cons :tag "Identity" - (const ":identity") - ,(append - '(radio) - (mapcar - (function (lambda (arg) `(const ,arg))) - (mapcar 'car mh-identity-list)))) - (cons :tag "Fcc Field" - (const "fcc") - (string :tag "Value")) - (cons :tag "Mail-Followup-To Field" - (const "Mail-Followup-To") - (string :tag "Value")) - (cons :tag "Other Field" - (string :tag "Field") - (string :tag "Value")))))) - :group 'mh-identity) - -(defcustom mh-auto-fields-prompt-flag t - "*Non-nil means to prompt before sending if fields inserted. -See `mh-auto-fields-list'." - :type 'boolean - :group 'mh-identity) - -(defcustom mh-identity-default nil - "Default identity to use when `mh-letter-mode' is called. -See `mh-identity-list'." - :type (append - '(radio) - (cons '(const :tag "None" nil) - (mapcar (function (lambda (arg) `(const ,arg))) - (mapcar 'car mh-identity-list)))) - :group 'mh-identity) - -(defcustom mh-identity-handlers - '(("From" . mh-identity-handler-top) - (":default" . mh-identity-handler-bottom) - (":attribution-verb" . mh-identity-handler-attribution-verb) - (":signature" . mh-identity-handler-signature) - (":pgg-default-user-id" . mh-identity-handler-gpg-identity)) - "Handler functions for fields in `mh-identity-list'. - -This option is used to change the way that fields, signatures, -and attributions in `mh-identity-list' are added. To customize -`mh-identity-handlers', replace the name of an existing handler -function associated with the field you want to change with the -name of a function you have written. You can also click on an -\"INS\" button and insert a field of your choice and the name of -the function you have written to handle it. - -The \"Field\" field can be any field that you've used in your -`mh-identity-list'. The special fields \":attribution-verb\", -\":signature\", or \":pgg-default-user-id\" are used for the -`mh-identity-list' choices \"Attribution Verb\", \"Signature\", and -\"GPG Key ID\" respectively. - -The handler associated with the \":default\" field is used when no -other field matches. - -The handler functions are passed two or three arguments: the -FIELD itself (for example, \"From\"), or one of the special -fields (for example, \":signature\"), and the ACTION 'remove or -'add. If the action is 'add, an additional argument -containing the VALUE for the field is given." - :type '(repeat (cons (string :tag "Field") function)) - :group 'mh-identity) - - - -;;; Incorporating Your Mail (:group 'mh-inc) - -(defcustom mh-inc-prog "inc" - "*Program to incorporate new mail into a folder. - -This program generates a one-line summary for each of the new -messages. Unless it is an absolute pathname, the file is assumed -to be in the `mh-progs' directory. You may also link a file to -\"inc\" that uses a different format. You'll then need to modify -several scan line format variables appropriately." - :type 'string - :group 'mh-inc) - -(defcustom mh-inc-spool-list nil - "*Alternate spool files. - -You can use the `mh-inc-spool-list' variable to direct MH-E to -retrieve mail from arbitrary spool files other than your system -mailbox, file it in folders other than your \"+inbox\", and assign -key bindings to incorporate this mail. - -Suppose you are subscribed to the \"mh-e-devel\" mailing list and -you use \"procmail\" to filter this mail into \"~/mail/mh-e\" with -the following recipe in \".procmailrc\": - - MAILDIR=$HOME/mail - :0: - * ^From mh-e-devel-admin@stop.mail-abuse.org - mh-e - -In order to incorporate \"~/mail/mh-e\" into \"+mh-e\" with an -\"I m\" (mh-inc-spool-mh-e) command, customize this option, and click -on the \"INS\" button. Enter a \"Spool File\" of \"~/mail/mh-e\", a -\"Folder\" of \"mh-e\", and a \"Key Binding\" of \"m\". - -You can use \"xbuffy\" to automate the incorporation of this mail -using the \"gnudoit\" command in the \"gnuserv\" package as follows: - - box ~/mail/mh-e - title mh-e - origMode - polltime 10 - headertime 0 - command gnudoit -q '(mh-inc-spool-mh-e)'" - :type '(repeat (list (file :tag "Spool File") - (string :tag "Folder") - (character :tag "Key Binding"))) - :set 'mh-inc-spool-list-set - :group 'mh-inc) - - - -;;; Dealing with Junk Mail (:group 'mh-junk) - -;; Spam fighting program chosen -(defvar mh-junk-choice nil) - -;; Available spam filter interfaces -(defvar mh-junk-function-alist - '((spamassassin mh-spamassassin-blacklist mh-spamassassin-whitelist) - (bogofilter mh-bogofilter-blacklist mh-bogofilter-whitelist) - (spamprobe mh-spamprobe-blacklist mh-spamprobe-whitelist)) - "Available choices of spam programs to use. - -This is an alist. For each element there are functions that -blacklist a message as spam and whitelist a message incorrectly -classified as spam.") - -(defun mh-junk-choose (symbol value) - "Choose spam program to use. - -The function is always called with SYMBOL bound to -`mh-junk-program' and VALUE bound to the new value of -`mh-junk-program'. The function sets the variable -`mh-junk-choice' in addition to `mh-junk-program'." - (set symbol value) - (setq mh-junk-choice - (or value - (loop for element in mh-junk-function-alist - until (executable-find (symbol-name (car element))) - finally return (car element))))) - -;; User customizable variables -(defcustom mh-junk-background nil - "If on, spam programs are run in background. - -By default, the programs are run in the foreground, but this can -be slow when junking large numbers of messages. If you have -enough memory or don't junk that many messages at the same time, -you might try turning on this option." - :type '(choice (const :tag "Off" nil) - (const :tag "On" 0)) - :group 'mh-junk) - -(defcustom mh-junk-disposition nil - "Disposition of junk mail." - :type '(choice (const :tag "Delete Spam" nil) - (string :tag "Spam Folder")) - :group 'mh-junk) - -(defcustom mh-junk-program nil - "Spam program that MH-E should use. - -The default setting of this option is \"Auto-detect\" which means -that MH-E will automatically choose one of SpamAssassin, -bogofilter, or SpamProbe in that order. If, for example, you have -both SpamAssassin and bogofilter installed and you want to use -bogofilter, then you can set this option to \"Bogofilter\"." - :type '(choice (const :tag "Auto-detect" nil) - (const :tag "SpamAssassin" spamassassin) - (const :tag "Bogofilter" bogofilter) - (const :tag "SpamProbe" spamprobe)) - :set 'mh-junk-choose - :group 'mh-junk) - - - -;;; Editing a Draft (:group 'mh-letter) - -(defcustom mh-compose-insertion (if (locate-library "mml") 'mml 'mh) - "Type of tags used when composing MIME messages. - -In addition to MH-style directives, MH-E also supports MML (MIME -Meta Language) tags. (see Info node `(emacs-mime)Composing'). -This option can be used to choose between them. By default, this -option is set to \"MML\" if it is supported since it provides a -lot more functionality. This option can also be set to \"MH\" if -MH-style directives are preferred." - :type '(choice (const :tag "MML" mml) - (const :tag "MH" mh)) - :group 'mh-letter) - -(defcustom mh-compose-skipped-header-fields - '("From" "Organization" "References" "In-Reply-To" - "X-Face" "Face" "X-Image-URL" "X-Mailer") - "List of header fields to skip over when navigating in draft." - :type '(repeat (string :tag "Field")) - :group 'mh-letter) - -(defcustom mh-compose-space-does-completion-flag nil - "*Non-nil means \\<mh-letter-mode-map>\\[mh-letter-complete-or-space] does completion in message header." - :type 'boolean - :group 'mh-letter) - -(defcustom mh-delete-yanked-msg-window-flag nil - "*Non-nil means delete any window displaying the message. - -This deletes the window containing the original message after -yanking it with \\<mh-letter-mode-map>\\[mh-yank-cur-msg] to make -more room on your screen for your reply." - :type 'boolean - :group 'mh-letter) - -(defcustom mh-extract-from-attribution-verb "wrote:" - "*Verb to use for attribution when a message is yanked by \\<mh-letter-mode-map>\\[mh-yank-cur-msg]. - -The attribution consists of the sender's name and email address -followed by the content of this option. This option can be set to -\"wrote:\", \"a écrit:\", and \"schrieb:\". You can also use the -\"Custom String\" menu item to enter your own verb." - :type '(choice (const "wrote:") - (const "a écrit:") - (const "schrieb:") - (string :tag "Custom String")) - :group 'mh-letter) - -(defcustom mh-ins-buf-prefix "> " - "*String to put before each line of a yanked or inserted message. - -The prefix \"> \" is the default setting of this option. I -suggest that you not modify this option since it is used by many -mailers and news readers: messages are far easier to read if -several included messages have all been indented by the same -string. - -This prefix is not inserted if you use one of the supercite -flavors of `mh-yank-behavior' or you have added a -`mail-citation-hook'." - :type 'string - :group 'mh-letter) - -(defcustom mh-letter-complete-function 'ispell-complete-word - "*Function to call when completing outside of address or folder fields. - -In the body of the message, -\\<mh-letter-mode-map>\\[mh-letter-complete] runs this function, -which is set to \"ispell-complete-word\" by default." - :type '(choice function (const nil)) - :group 'mh-letter) - -(defcustom mh-letter-fill-column 72 - "*Fill column to use in MH Letter mode. - -By default, this option is 72 to allow others to quote your -message without line wrapping." - :type 'integer - :group 'mh-letter) - -(defcustom mh-mml-method-default (if mh-pgp-support-flag "pgpmime" "none") - "Default method to use in security tags. - -This option is used to select between a variety of mail security -mechanisms. The default is \"PGP (MIME)\" if it is supported\; -otherwise, the default is \"None\". Other mechanisms include -vanilla \"PGP\" and \"S/MIME\". - -The `pgg' customization group may have some settings which may -interest you (see Info node `(pgg)'). - -In particular, I turn on the option `pgg-encrypt-for-me' so that -all messages I encrypt are encrypted with my public key as well. -If you keep a copy of all of your outgoing mail with a \"Fcc:\" -header field, this setting is vital so that you can read the mail -you write!" - :type '(choice (const :tag "PGP (MIME)" "pgpmime") - (const :tag "PGP" "pgp") - (const :tag "S/MIME" "smime") - (const :tag "None" "none")) - :group 'mh-letter) - -(defcustom mh-signature-file-name "~/.signature" - "*Source of user's signature. - -By default, the text of your signature is taken from the file -\"~/.signature\". You can read from other sources by changing this -option. This file may contain a vCard in which case an attachment is -added with the vCard. - -This option may also be a symbol, in which case that function is -called. You may not want a signature separator to be added for you; -instead you may want to insert one yourself. Options that you may find -useful to do this include `mh-signature-separator' (when inserting a -signature separator) and `mh-signature-separator-regexp' (for finding -said separator). The function `mh-signature-separator-p', which -reports t if the buffer contains a separator, may be useful as well. - -The signature is inserted into your message with the command -\\<mh-letter-mode-map>\\[mh-insert-signature] or with the option -`mh-identity-list'." - :type 'file - :group 'mh-letter) - -(defcustom mh-signature-separator-flag t - "*Non-nil means a signature separator should be inserted. - -It is not recommended that you change this option since various -mail user agents, including MH-E, use the separator to present -the signature differently, and to suppress the signature when -replying or yanking a letter into a draft." - :type 'boolean - :group 'mh-letter) - -(defcustom mh-x-face-file "~/.face" - "*File containing face header field to insert in outgoing mail. - -If the file starts with either of the strings \"X-Face:\", \"Face:\" -or \"X-Image-URL:\" then the contents are added to the message header -verbatim. Otherwise it is assumed that the file contains the value of -the \"X-Face:\" header field. - -The \"X-Face:\" header field, which is a low-resolution, black and -white image, can be generated using the \"compface\" command (see URL -`ftp://ftp.cs.indiana.edu/pub/faces/compface/compface.tar.Z'). The -\"Online X-Face Converter\" is a useful resource for quick conversion -of images into \"X-Face:\" header fields (see URL -`http://www.dairiki.org/xface/'). - -Use the \"make-face\" script to convert a JPEG image to the higher -resolution, color, \"Face:\" header field (see URL -`http://quimby.gnus.org/circus/face/make-face'). - -The URL of any image can be used for the \"X-Image-URL:\" field and no -processing of the image is required. - -To prevent the setting of any of these header fields, either set -`mh-x-face-file' to nil, or simply ensure that the file defined by -this option doesn't exist." - :type 'file - :group 'mh-letter) - -(defcustom mh-yank-behavior 'attribution - "*Controls which part of a message is yanked by \\<mh-letter-mode-map>\\[mh-yank-cur-msg]. - -To include the entire message, including the entire header, use -\"Body and Header\". Use \"Body\" to yank just the body without -the header. To yank only the portion of the message following the -point, set this option to \"Below Point\". - -Choose \"Invoke supercite\" to pass the entire message and header -through supercite. - -If the \"Body With Attribution\" setting is used, then the -message minus the header is yanked and a simple attribution line -is added at the top using the value of the option -`mh-extract-from-attribution-verb'. This is the default. - -If the \"Invoke supercite\" or \"Body With Attribution\" settings -are used, the \"-noformat\" argument is passed to the \"repl\" -program to override a \"-filter\" or \"-format\" argument. These -settings also have \"Automatically\" variants that perform the -action automatically when you reply so that you don't need to use -\\[mh-yank-cur-msg] at all. Note that this automatic action is -only performed if the show buffer matches the message being -replied to. People who use the automatic variants tend to turn on -the option `mh-delete-yanked-msg-window-flag' as well so that the -show window is never displayed. - -If the show buffer has a region, the option `mh-yank-behavior' is -ignored unless its value is one of Attribution variants in which -case the attribution is added to the yanked region. - -If this option is set to one of the supercite flavors, the hook -`mail-citation-hook' is ignored and `mh-ins-buf-prefix' is not -inserted." - :type '(choice (const :tag "Body and Header" t) - (const :tag "Body" body) - (const :tag "Below Point" nil) - (const :tag "Invoke supercite" supercite) - (const :tag "Invoke supercite, Automatically" autosupercite) - (const :tag "Body With Attribution" attribution) - (const :tag "Body With Attribution, Automatically" - autoattrib)) - :group 'mh-letter) - - - -;;; Ranges (:group 'mh-ranges) - -(defcustom mh-interpret-number-as-range-flag t - "*Non-nil means interpret a number as a range. - -Since one of the most frequent ranges used is \"last:N\", MH-E -will interpret input such as \"200\" as \"last:200\" if this -option is on (which is the default). If you need to scan just the -message 200, then use the range \"200:200\"." - :type 'boolean - :group 'mh-ranges) - - - -;;; Scan Line Formats (:group 'mh-scan-line-formats) - -;; Forward definition. -(defvar mh-scan-format-file t) - -(defun mh-adaptive-cmd-note-flag-check (symbol value) - "Check if desired setting is legal. -Throw an error if user tries to turn on -`mh-adaptive-cmd-note-flag' when `mh-scan-format-file' isn't t. -Otherwise, set SYMBOL to VALUE." - (if (and value - (not (eq mh-scan-format-file t))) - (error "%s %s" "Can't turn on unless `mh-scan-format-file'" - "is set to \"Use MH-E scan Format\"") - (set-default symbol value))) - -;; Forward definition. -(defvar mh-adaptive-cmd-note-flag) - -(defun mh-scan-format-file-check (symbol value) - "Check if desired setting is legal. -Throw an error if user tries to set `mh-scan-format-file' to -anything but t when `mh-adaptive-cmd-note-flag' is on. Otherwise, -set SYMBOL to VALUE." - (if (and (not (eq value t)) - (eq mh-adaptive-cmd-note-flag t)) - (error "%s %s" "You must turn off `mh-adaptive-cmd-note-flag'" - "unless you use \"Use MH-E scan Format\"") - (set-default symbol value))) - -(defcustom mh-adaptive-cmd-note-flag t - "*Non-nil means that the message number width is determined dynamically. - -If you've created your own format to handle long message numbers, -you'll be pleased to know you no longer need it since MH-E adapts its -internal format based upon the largest message number if this option -is on (the default). This option may only be turned on when -`mh-scan-format-file' is set to \"Use MH-E scan Format\". - -If you prefer fixed-width message numbers, turn off this option and -call `mh-set-cmd-note' with the width specified by your format file -\(see `mh-scan-format-file'). For example, the default width is 4, so -you would use \"(mh-set-cmd-note 4)\"." - :type 'boolean - :group 'mh-scan-line-formats - :set 'mh-adaptive-cmd-note-flag-check) - -;; Update forward definition above if default changes. -(defcustom mh-scan-format-file t - "Specifies the format file to pass to the scan program. - -The default setting for this option is \"Use MH-E scan Format\". This -means that the format string will be taken from the either -`mh-scan-format-mh' or `mh-scan-format-nmh' depending on whether MH or -nmh (or GNU mailutils) is in use. This setting also enables you to -turn on the `mh-adaptive-cmd-note-flag' option. - -You can also set this option to \"Use Default scan Format\" to get the -same output as you would get if you ran \"scan\" from the shell. If -you have a format file that you want MH-E to use but not MH, you can -set this option to \"Specify a scan Format File\" and enter the name -of your format file. - -If you change the format of the scan lines you'll need to tell MH-E -how to parse the new format. As you will see, quite a lot of variables -are involved to do that. Use \"\\[apropos] RET mh-scan.*regexp\" to -obtain a list of these variables. You will also have to call -`mh-set-cmd-note' if your notations are not in column 4 (columns in -Emacs start with 0)." - :type '(choice (const :tag "Use MH-E scan Format" t) - (const :tag "Use Default scan Format" nil) - (file :tag "Specify a scan Format File")) - :group 'mh-scan-line-formats - :set 'mh-scan-format-file-check) - -(defcustom mh-scan-prog "scan" - "*Program used to scan messages. - -The name of the program that generates a listing of one line per -message is held in this option. Unless this variable contains an -absolute pathname, it is assumed to be in the `mh-progs' -directory. You may link another program to `scan' (see -\"mh-profile(5)\") to produce a different type of listing." - :type 'string - :group 'mh-scan-line-formats) -(make-variable-buffer-local 'mh-scan-prog) - - - -;;; Searching (:group 'mh-search) - -(defcustom mh-search-program nil - "Search program that MH-E shall use. - -The default setting of this option is \"Auto-detect\" which means -that MH-E will automatically choose one of swish++, swish-e, -mairix, namazu, pick and grep in that order. If, for example, you -have both swish++ and mairix installed and you want to use -mairix, then you can set this option to \"mairix\". - -More information about setting up an indexing program to use with -MH-E can be found in the documentation of `mh-search'." - :type '(choice (const :tag "Auto-detect" nil) - (const :tag "swish++" swish++) - (const :tag "swish-e" swish) - (const :tag "mairix" mairix) - (const :tag "namazu" namazu) - (const :tag "pick" pick) - (const :tag "grep" grep)) - :group 'mh-search) - - - -;;; Sending Mail (:group 'mh-sending-mail) - -(defcustom mh-compose-forward-as-mime-flag t - "*Non-nil means that messages are forwarded as attachments. - -By default, this option is on which means that the forwarded -messages are included as attachments. If you would prefer to -forward your messages verbatim (as text, inline), then turn off -this option. Forwarding messages verbatim works well for short, -textual messages, but your recipient won't be able to view any -non-textual attachments that were in the forwarded message. Be -aware that if you have \"forw: -mime\" in your MH profile, then -forwarded messages will always be included as attachments -regardless of the settings of this option." - :type 'boolean - :group 'mh-sending-mail) - -(defcustom mh-compose-letter-function nil - "Invoked when starting a new draft. - -However, it is the last function called before you edit your -message. The consequence of this is that you can write a function -to write and send the message for you. This function is passed -three arguments: the contents of the TO, SUBJECT, and CC header -fields." - :type '(choice (const nil) function) - :group 'mh-sending-mail) - -(defcustom mh-compose-prompt-flag nil - "*Non-nil means prompt for header fields when composing a new draft." - :type 'boolean - :group 'mh-sending-mail) - -(defcustom mh-forward-subject-format "%s: %s" - "*Format string for forwarded message subject. - -This option is a string which includes two escapes (\"%s\"). The -first \"%s\" is replaced with the sender of the original message, -and the second one is replaced with the original \"Subject:\"." - :type 'string - :group 'mh-sending-mail) - -(defcustom mh-insert-x-mailer-flag t - "*Non-nil means append an \"X-Mailer:\" header field to the header. - -This header field includes the version of MH-E and Emacs that you -are using. If you don't want to participate in our marketing, you -can turn this option off." - :type 'boolean - :group 'mh-sending-mail) - -(defcustom mh-redist-full-contents-flag nil - "*Non-nil means the \"dist\" command needs entire letter for redistribution. - -This option must be turned on if \"dist\" requires the whole -letter for redistribution, which is the case if \"send\" is -compiled with the BERK option (which many people abhor). If you -find that MH will not allow you to redistribute a message that -has been redistributed before, turn off this option." - :type 'boolean - :group 'mh-sending-mail) - -(defcustom mh-reply-default-reply-to nil - "*Sets the person or persons to whom a reply will be sent. - -This option is set to \"Prompt\" by default so that you are -prompted for the recipient of a reply. If you find that most of -the time that you specify \"cc\" when you reply to a message, set -this option to \"cc\". Other choices include \"from\", \"to\", or -\"all\". You can always edit the recipients in the draft." - :type '(choice (const :tag "Prompt" nil) - (const "from") - (const "to") - (const "cc") - (const "all")) - :group 'mh-sending-mail) - -(defcustom mh-reply-show-message-flag t - "*Non-nil means the MH-Show buffer is displayed when replying. - -If you include the message automatically, you can hide the -MH-Show buffer by turning off this option. - -See also `mh-reply'." - :type 'boolean - :group 'mh-sending-mail) - - - -;;; Sequences (:group 'mh-sequences) - -;; If `mh-unpropagated-sequences' becomes a defcustom, add the following to -;; the docstring: "Additional sequences that should not to be preserved can be -;; specified by setting `mh-unpropagated-sequences' appropriately." XXX - -(defcustom mh-refile-preserves-sequences-flag t - "*Non-nil means that sequences are preserved when messages are refiled. - -If a message is in any sequence (except \"Previous-Sequence:\" -and \"cur\") when it is refiled, then it will still be in those -sequences in the destination folder. If this behavior is not -desired, then turn off this option." - :type 'boolean - :group 'mh-sequences) - -(defcustom mh-tick-seq 'tick - "The name of the MH sequence for ticked messages. - -You can customize this option if you already use the \"tick\" -sequence for your own use. You can also disable all of the -ticking functions by choosing the \"Disable Ticking\" item but -there isn't much advantage to that." - :type '(choice (const :tag "Disable Ticking" nil) - symbol) - :group 'mh-sequences) - -(defcustom mh-update-sequences-after-mh-show-flag t - "*Non-nil means flush MH sequences to disk after message is shown\\<mh-folder-mode-map>. - -Three sequences are maintained internally by MH-E and pushed out -to MH when a message is shown. They include the sequence -specified by your \"Unseen-Sequence:\" profile entry, \"cur\", -and the sequence listed by the option `mh-tick-seq' which is -\"tick\" by default. If you do not like this behavior, turn off -this option. You can then update the state manually with the -\\[mh-execute-commands], \\[mh-quit], or \\[mh-update-sequences] -commands." - :type 'boolean - :group 'mh-sequences) - - - -;;; Reading Your Mail (:group 'mh-show) - -(defcustom mh-bury-show-buffer-flag t - "*Non-nil means show buffer is buried. - -One advantage of not burying the show buffer is that one can -delete the show buffer more easily in an electric buffer list -because of its proximity to its associated MH-Folder buffer. Try -running \\[electric-buffer-list] to see what I mean." - :type 'boolean - :group 'mh-show) - -(defcustom mh-clean-message-header-flag t - "*Non-nil means remove extraneous header fields. - -See also `mh-invisible-header-fields-default' and -`mh-invisible-header-fields'." - :type 'boolean - :group 'mh-show) - -(defcustom mh-decode-mime-flag (not (not (locate-library "mm-decode"))) - "*Non-nil means attachments are handled\\<mh-folder-mode-map>. - -MH-E can handle attachments as well if the Gnus `mm-decode' -library is present. If so, this option will be on. Otherwise, -you'll see the MIME body parts rather than text or attachments. -There isn't much point in turning off this option; however, you -can inspect it if it appears that the body parts are not being -interpreted correctly or toggle it with the command -\\[mh-toggle-mh-decode-mime-flag] to view the raw message. - -This option also controls the display of quoted-printable -messages and other graphical widgets. See the options -`mh-graphical-smileys-flag' and `mh-graphical-emphasis-flag'." - :type 'boolean - :group 'mh-show) - -(defcustom mh-display-buttons-for-alternatives-flag nil - "*Non-nil means display buttons for all alternative attachments. - -Sometimes, a mail program will produce multiple alternatives of -the attachment in increasing degree of faithfulness to the -original content. By default, only the preferred alternative is -displayed. If this option is on, then the preferred part is shown -inline and buttons are shown for each of the other alternatives." - :type 'boolean - :group 'mh-show) - -(defcustom mh-display-buttons-for-inline-parts-flag nil - "*Non-nil means display buttons for all inline attachments\\<mh-folder-mode-map>. - -The sender can request that attachments should be viewed inline so -that they do not really appear like an attachment at all to the -reader. Most of the time, this is desirable, so by default MH-E -suppresses the buttons for inline attachments. On the other hand, you -may receive code or HTML which the sender has added to his message as -inline attachments so that you can read them in MH-E. In this case, it -is useful to see the buttons so that you know you don't have to cut -and paste the code into a file; you can simply save the attachment. - -If you want to make the buttons visible for inline attachments, you -can use the command \\[mh-toggle-mime-buttons] to toggle the -visibility of these buttons. You can turn on these buttons permanently -by turning on this option. - -MH-E cannot display all attachments inline however. It can display -text (including HTML) and images." - :type 'boolean - :group 'mh-show) - -(defcustom mh-do-not-confirm-flag nil - "*Non-nil means non-reversible commands do not prompt for confirmation. - -Commands such as `mh-pack-folder' prompt to confirm whether to -process outstanding moves and deletes or not before continuing. -Turning on this option means that these actions will be -performed--which is usually desired but cannot be -retracted--without question." - :type 'boolean - :group 'mh-show) - -(defcustom mh-fetch-x-image-url nil - "*Control fetching of \"X-Image-URL:\" header field image. - -Ths option controls the fetching of the \"X-Image-URL:\" header -field image with the following values: - -Ask Before Fetching - You are prompted before the image is fetched. MH-E will - remember your reply and will either use the already fetched - image the next time the same URL is encountered or silently - skip it if you didn't fetch it the first time. This is a - good setting. - -Never Fetch - Images are never fetched and only displayed if they are - already present in the cache. This is the default. - -There isn't a value of \"Always Fetch\" for privacy and DOS (denial of -service) reasons. For example, fetching a URL can tip off a spammer -that you've read his email (which is why you shouldn't blindly answer -yes if you've set this option to \"Ask Before Fetching\"). Someone may -also flood your network and fill your disk drive by sending a torrent -of messages, each specifying a unique URL to a very large file. - -The cache of images is found in the directory \".mhe-x-image-cache\" -within your MH directory. You can add your own face to the \"From:\" -field too. See Info node `(mh-e)Picture'. - -This setting only has effect if the option `mh-show-use-xface-flag' is -turned on." - - :type '(choice (const :tag "Ask Before Fetching" ask) - (const :tag "Never Fetch" nil)) - :group 'mh-show) - -(defcustom mh-graphical-smileys-flag t - "*Non-nil means graphical smileys are displayed. - -It is a long standing custom to inject body language using a -cornucopia of punctuation, also known as the \"smileys\". MH-E -can render these as graphical widgets if this option is turned -on, which it is by default. Smileys include patterns such as :-) -and ;-). - -This option is disabled if the option `mh-decode-mime-flag' is -turned off." - :type 'boolean - :group 'mh-show) - -(defcustom mh-graphical-emphasis-flag t - "*Non-nil means graphical emphasis is displayed. - -A few typesetting features are indicated in ASCII text with -certain characters. If your terminal supports it, MH-E can render -these typesetting directives naturally if this option is turned -on, which it is by default. For example, _underline_ will be -underlined, *bold* will appear in bold, /italics/ will appear in -italics, and so on. See the option `gnus-emphasis-alist' for the -whole list. - -This option is disabled if the option `mh-decode-mime-flag' is -turned off." - :type 'boolean - :group 'mh-show) - -(defcustom mh-highlight-citation-style 'gnus - "Style for highlighting citations. - -If the sender of the message has cited other messages in his -message, then MH-E will highlight these citations to emphasize -the sender's actual response. This option can be customized to -change the highlighting style. The \"Multicolor\" method uses a -different color for each indentation while the \"Monochrome\" -method highlights all citations in red. To disable highlighting -of citations entirely, choose \"None\"." - :type '(choice (const :tag "Multicolor" gnus) - (const :tag "Monochrome" font-lock) - (const :tag "None" nil)) - :group 'mh-show) - -;; Keep fields alphabetized. Mention source, if known. -(defvar mh-invisible-header-fields-internal - '("Approved:" - "Autoforwarded:" - "Bestservhost:" - "Cancel-Lock:" ; NNTP posts - "Content-" ; RFC 2045 - "Delivered-To:" ; Egroups/yahoogroups mailing list manager - "Delivery-Date:" ; MH - "Delivery:" - "DomainKey-Signature:" ;http://antispam.yahoo.com/domainkeys - "Encoding:" - "Envelope-to:" - "Errors-To:" - "Face:" ; Gnus Face header - "Forwarded:" ; MH - "From " ; sendmail - "Importance:" ; MS Outlook - "In-Reply-To:" ; MH - "Lines:" - "List-" ; Mailman mailing list manager - "List-" ; Unknown mailing list managers - "List-Subscribe:" ; Unknown mailing list managers - "List-Unsubscribe:" ; Unknown mailing list managers - "Mail-from:" ; MH - "Mailing-List:" ; Egroups/yahoogroups mailing list manager - "Message-Id:" ; RFC 822 - "Mime-Version" ; RFC 2045 - "NNTP-" ; News - "Old-Return-Path:" - "Original-Encoded-Information-Types:" ; X400 - "Original-Lines:" ; mail to news - "Original-NNTP-" ; mail to news - "Original-Newsgroups:" ; mail to news - "Original-Path:" ; mail to news - "Original-Received:" ; mail to news - "Original-To:" ; mail to news - "Original-X-" ; mail to news - "Originator:" - "P1-Content-Type:" ; X400 - "P1-Message-Id:" ; X400 - "P1-Recipient:" ; X400 - "Path:" - "Precedence:" - "Prev-Resent" ; MH - "Priority:" - "Received:" ; RFC 822 - "Received-SPF:" ; Gmail - "References:" - "Remailed-" ; MH - "Replied:" ; MH - "Resent" ; MH - "Return-Path:" ; RFC 822 - "Sensitivity:" ; MS Outlook - "Status:" ; sendmail - "Thread-" - "Ua-Content-Id:" ; X400 -;; "User-Agent:" ; Similar to X-Mailer, so display it. - "Via:" ; MH - "X-Abuse-Info:" - "X-Abuse-and-DMCA-" - "X-Accept-Language:" - "X-Accept-Language:" ; Netscape/Mozilla - "X-Ack:" - "X-Administrivia-To:" - "X-AntiAbuse:" ; cPanel - "X-Apparently-From:" ; MS Outlook - "X-Apparently-To:" ; Egroups/yahoogroups mailing list manager - "X-Authentication-Warning:" ; sendmail - "X-Beenthere:" ; Mailman mailing list manager - "X-Bogosity:" ; bogofilter - "X-Bugzilla-*" ; Bugzilla - "X-Complaints-To:" - "X-ContentStamp:" ; NetZero - "X-Cron-Env:" - "X-DMCA" - "X-Delivered" - "X-ELNK-Trace:" ; Earthlink mailer - "X-Envelope-Date:" ; GNU mailutils - "X-Envelope-From:" - "X-Envelope-Sender:" - "X-Envelope-To:" - "X-Evolution:" ; Evolution mail client - "X-Face:" - "X-Folder:" ; Spam - "X-From-Line" - "X-Gmail-" ; Gmail - "X-Gnus-Mail-Source:" ; gnus - "X-Greylist:" ; milter-greylist-1.2.1 - "X-Habeas-SWE-1:" ; Spam - "X-Habeas-SWE-2:" ; Spam - "X-Habeas-SWE-3:" ; Spam - "X-Habeas-SWE-4:" ; Spam - "X-Habeas-SWE-5:" ; Spam - "X-Habeas-SWE-6:" ; Spam - "X-Habeas-SWE-7:" ; Spam - "X-Habeas-SWE-8:" ; Spam - "X-Habeas-SWE-9:" ; Spam - "X-Info:" ; NTMail - "X-Juno-" ; Juno - "X-List-Host:" ; Unknown mailing list managers - "X-List-Subscribe:" ; Unknown mailing list managers - "X-List-Unsubscribe:" ; Unknown mailing list managers - "X-Listprocessor-" ; ListProc(tm) by CREN - "X-Listserver:" ; Unknown mailing list managers - "X-Loop:" ; Unknown mailing list managers - "X-Lumos-SenderID:" ; Roving ConstantContact - "X-MAIL-INFO:" ; NetZero - "X-MHE-Checksum" ; Checksum added during index search - "X-MIME-Autoconverted:" ; sendmail - "X-MIMETrack:" - "X-MS-" ; MS Outlook - "X-MailScanner" ; ListProc(tm) by CREN - "X-Mailing-List:" ; Unknown mailing list managers - "X-Mailman-Version:" ; Mailman mailing list manager - "X-Majordomo:" ; Majordomo mailing list manager - "X-Message-Id" - "X-MessageWall-Score:" ; Unknown mailing list manager, AUC TeX - "X-MimeOLE:" ; MS Outlook - "X-Mms-" ; T-Mobile pictures - "X-Mozilla-Status:" ; Netscape/Mozilla - "X-Msmail-" ; MS Outlook - "X-NAI-Spam-" ; Network Associates Inc. SpamKiller - "X-News:" ; News - "X-No-Archive:" - "X-Notes-Item:" ; Lotus Notes Domino structured header - "X-OperatingSystem:" - ;;"X-Operator:" ; Similar to X-Mailer, so display it - "X-Orcl-Content-Type:" - "X-Original-Complaints-To:" - "X-Original-Date:" ; SourceForge mailing list manager - "X-Original-To:" - "X-Original-Trace:" - "X-OriginalArrivalTime:" ; Hotmail - "X-Originating-IP:" ; Hotmail - "X-Postfilter:" - "X-Priority:" ; MS Outlook - "X-Qotd-" ; User added - "X-RM" - "X-Received-Date:" - "X-Received:" - "X-Request-" - "X-Return-Path-Hint:" ; Roving ConstantContact - "X-Roving-*" ; Roving ConstantContact - "X-SBClass:" ; Spam - "X-SBNote:" ; Spam - "X-SBPass:" ; Spam - "X-SBRule:" ; Spam - "X-SMTP-" - "X-Scanned-By" - "X-Sender:" - "X-Server-Date:" - "X-Server-Uuid:" - "X-Sieve:" ; Sieve filtering - "X-Source" - "X-Spam-" ; Spamassassin - "X-SpamBouncer:" ; Spam - "X-Status" - "X-Submissions-To:" - "X-Telecom-Digest" - "X-Trace:" - "X-UID" - "X-UIDL:" - "X-UNTD-" ; NetZero - "X-USANET-" ; usa.net - "X-UserInfo1:" - "X-VSMLoop:" ; NTMail - "X-Virus-Scanned" ; amavisd-new - "X-Vms-To:" - "X-WebTV-Signature:" - "X-Wss-Id:" ; Worldtalk gateways - "X-Yahoo" - "X-eGroups-" ; Egroups/yahoogroups mailing list manager - "X-pgp:" - "X-submission-address:" - "X400-" ; X400 - "Xref:") - "List of default header fields that are not to be shown. - -Do not alter this variable directly. Instead, add entries from -here that you would like to be displayed in -`mh-invisible-header-fields-default' and add entries to hide in -`mh-invisible-header-fields'.") - -(defvar mh-invisible-header-fields-compiled nil - "*Regexp matching lines in a message header that are not to be shown. -Do not alter this variable directly. Instead, customize -`mh-invisible-header-fields-default' checking for fields normally -hidden that you wish to display, and add extra entries to hide in -`mh-invisible-header-fields'.") - -;; Forward definition. -(defvar mh-invisible-header-fields) -(defvar mh-invisible-header-fields-default nil) - -(defun mh-invisible-headers () - "Make or remake the variable `mh-invisible-header-fields-compiled'. -Done using `mh-invisible-header-fields-internal' as input, from -which entries from `mh-invisible-header-fields-default' are -removed and entries from `mh-invisible-header-fields' are added." - (let ((fields mh-invisible-header-fields-internal)) - (when mh-invisible-header-fields-default - ;; Remove entries from `mh-invisible-header-fields-default' - (setq fields - (loop for x in fields - unless (member x mh-invisible-header-fields-default) - collect x))) - (when (and (boundp 'mh-invisible-header-fields) - mh-invisible-header-fields) - (dolist (x mh-invisible-header-fields) - (unless (member x fields) (setq fields (cons x fields))))) - (if fields - (setq mh-invisible-header-fields-compiled - (concat - "^" - ;; workaround for insufficient default - (let ((max-specpdl-size 1000)) - (regexp-opt fields t)))) - (setq mh-invisible-header-fields-compiled nil)))) - -(defcustom mh-invisible-header-fields nil - "*Additional header fields to hide. - -Header fields that you would like to hide that aren't listed in -`mh-invisible-header-fields-default' can be added to this option -with a couple of caveats. Regular expressions are not allowed. -Unique fields should have a \":\" suffix; otherwise, the element -can be used to render invisible an entire class of fields that -start with the same prefix. If you think a header field should be -generally ignored, report a bug (see URL -`https://sourceforge.net/tracker/?group_id=13357&atid=113357'). - -See also `mh-clean-message-header-flag'." - - :type '(repeat (string :tag "Header field")) - :set (lambda (symbol value) - (set-default symbol value) - (mh-invisible-headers)) - :group 'mh-show) - -;; Update forward definition above if default changes. -(defcustom mh-invisible-header-fields-default nil - "*List of hidden header fields. - -The header fields listed in this option are hidden, although you -can check off any field that you would like to see. - -Header fields that you would like to hide that aren't listed can -be added to the option `mh-invisible-header-fields'. - -See also `mh-clean-message-header-flag'." - :type `(set ,@(mapcar (lambda (x) `(const ,x)) - mh-invisible-header-fields-internal)) - :set (lambda (symbol value) - (set-default symbol value) - (mh-invisible-headers)) - :group 'mh-show) - -(defcustom mh-lpr-command-format "lpr -J '%s'" - "*Command used to print\\<mh-folder-mode-map>. - -This option contains the Unix command line which performs the -actual printing for the \\[mh-print-msg] command. The string can -contain one escape, \"%s\", which is replaced by the name of the -folder and the message number and is useful for print job names. -I use \"mpage -h'%s' -b Letter -H1of -mlrtb -P\" which produces a -nice header and adds a bit of margin so the text fits within my -printer's margins. - -This options is not used by the commands \\[mh-ps-print-msg] or -\\[mh-ps-print-msg-file]." - :type 'string - :group 'mh-show) - -(defcustom mh-max-inline-image-height nil - "*Maximum inline image height if \"Content-Disposition:\" is not present. - -Some older mail programs do not insert this needed plumbing to -tell MH-E whether to display the attachments inline or not. If -this is the case, MH-E will display these images inline if they -are smaller than the window. However, you might want to allow -larger images to be displayed inline. To do this, you can change -the options `mh-max-inline-image-width' and -`mh-max-inline-image-height' from their default value of zero to -a large number. The size of your screen is a good choice for -these numbers." - :type '(choice (const nil) integer) - :group 'mh-show) - -(defcustom mh-max-inline-image-width nil - "*Maximum inline image width if \"Content-Disposition:\" is not present. - -Some older mail programs do not insert this needed plumbing to -tell MH-E whether to display the attachments inline or not. If -this is the case, MH-E will display these images inline if they -are smaller than the window. However, you might want to allow -larger images to be displayed inline. To do this, you can change -the options `mh-max-inline-image-width' and -`mh-max-inline-image-height' from their default value of zero to -a large number. The size of your screen is a good choice for -these numbers." - :type '(choice (const nil) integer) - :group 'mh-show) - -(defcustom mh-mhl-format-file nil - "*Specifies the format file to pass to the \"mhl\" program. - -Normally MH-E takes care of displaying messages itself (rather than -calling an MH program to do the work). If you'd rather have \"mhl\" -display the message (within MH-E), change this option from its default -value of \"Use Default mhl Format (Printing Only)\". - -You can set this option to \"Use Default mhl Format\" to get the same -output as you would get if you ran \"mhl\" from the shell. - -If you have a format file that you want MH-E to use, you can set this -option to \"Specify an mhl Format File\" and enter the name of your -format file. Your format file should specify a non-zero value for -\"overflowoffset\" to allow MH-E to parse the header. Note that -\"mhl\" is always used for printing and forwarding; in this case, the -value of this option is consulted if you have specified a format -file." - :type '(choice (const :tag "Use Default mhl Format (Printing Only)" nil) - (const :tag "Use Default mhl Format" t) - (file :tag "Specify an mhl Format File")) - :group 'mh-show) - -(defcustom mh-mime-save-parts-default-directory t - "Default directory to use for \\<mh-folder-mode-map>\\[mh-mime-save-parts]. - -The default value for this option is \"Prompt Always\" so that -you are always prompted for the directory in which to save the -attachments. However, if you usually use the same directory -within a session, then you can set this option to \"Prompt the -First Time\" to avoid the prompt each time. you can make this -directory permanent by choosing \"Directory\" and entering the -directory's name." - :type '(choice (const :tag "Prompt the First Time" nil) - (const :tag "Prompt Always" t) - directory) - :group 'mh-show) - -(defcustom mh-print-background-flag nil - "*Non-nil means messages should be printed in the background\\<mh-folder-mode-map>. - -Normally messages are printed in the foreground. If this is slow on -your system, you may elect to turn off this option to print in the -background. - -WARNING: If you do this, do not delete the message until it is printed -or else the output may be truncated. - -This option is not used by the commands \\[mh-ps-print-msg] or -\\[mh-ps-print-msg-file]." - :type 'boolean - :group 'mh-show) - -(defcustom mh-show-maximum-size 0 - "*Maximum size of message (in bytes) to display automatically. - -This option provides an opportunity to skip over large messages -which may be slow to load. The default value of 0 means that all -message are shown regardless of size." - :type 'integer - :group 'mh-show) - -(defcustom mh-show-use-goto-addr-flag (and (boundp 'goto-address-highlight-p) - goto-address-highlight-p) - "*Non-nil means highlight URLs and email addresses\\<goto-address-highlight-keymap>. - -To send a message using the highlighted email address or to view -the web page for the highlighted URL, use the middle mouse button -or \\[goto-address-at-point]. - -See Info node `(mh-e)Sending Mail' to see how to configure Emacs -to send the message using MH-E. - -The default value of this option comes from the value of -`goto-address-highlight-p'." - :type 'boolean - :group 'mh-show) - -(defcustom mh-show-use-xface-flag (>= emacs-major-version 21) - "*Non-nil means display face images in MH-show buffers. - -MH-E can display the content of \"Face:\", \"X-Face:\", and -\"X-Image-URL:\" header fields. If any of these fields occur in the -header of your message, the sender's face will appear in the \"From:\" -header field. If more than one of these fields appear, then the first -field found in the order \"Face:\", \"X-Face:\", and \"X-Image-URL:\" -will be used. - -The option `mh-show-use-xface-flag' is used to turn this feature on -and off. This feature will be turned on by default if your system -supports it. - -The first header field used, if present, is the Gnus-specific -\"Face:\" field. The \"Face:\" field appeared in GNU Emacs 21 and -XEmacs. For more information, see URL -`http://quimby.gnus.org/circus/face/'. Next is the traditional -\"X-Face:\" header field. The display of this field requires the -\"uncompface\" program (see URL -`ftp://ftp.cs.indiana.edu/pub/faces/compface/compface.tar.z'). Recent -versions of XEmacs have internal support for \"X-Face:\" images. If -your version of XEmacs does not, then you'll need both \"uncompface\" -and the x-face package (see URL `ftp://ftp.jpl.org/pub/elisp/'). - -Finally, MH-E will display images referenced by the \"X-Image-URL:\" -header field if neither the \"Face:\" nor the \"X-Face:\" fields are -present. The display of the images requires \"wget\" (see URL -`http://www.gnu.org/software/wget/wget.html'), \"fetch\", or \"curl\" -to fetch the image and the \"convert\" program from the ImageMagick -suite (see URL `http://www.imagemagick.org/'). Of the three header -fields this is the most efficient in terms of network usage since the -image doesn't need to be transmitted with every single mail. - -The option `mh-fetch-x-image-url' controls the fetching of the -\"X-Image-URL:\" header field image." - :type 'boolean - :group 'mh-show) - -(defcustom mh-store-default-directory nil - "*Default directory for \\<mh-folder-mode-map>\\[mh-store-msg]. - -If you would like to change the initial default directory, -customize this option, change the value from \"Current\" to -\"Directory\", and then enter the name of the directory for storing -the content of these messages." - :type '(choice (const :tag "Current" nil) - directory) - :group 'mh-show) - -(defcustom mh-summary-height nil - "*Number of lines in MH-Folder buffer (including the mode line). - -The default value of this option is \"Automatic\" which means -that the MH-Folder buffer will maintain the same proportional -size if the frame is resized. If you'd prefer a fixed height, -then choose the \"Fixed Size\" option and enter the number of -lines you'd like to see." - :type '(choice (const :tag "Automatic" nil) - (integer :tag "Fixed Size")) - :group 'mh-show) - - - -;;; The Speedbar (:group 'mh-speedbar) - -(defcustom mh-speed-update-interval 60 - "Time between speedbar updates in seconds. -Set to 0 to disable automatic update." - :type 'integer - :group 'mh-speedbar) - - - -;;; Threading (:group 'mh-thread) - -(defcustom mh-show-threads-flag nil - "*Non-nil means new folders start in threaded mode. - -Threading large number of messages can be time consuming so this -option is turned off by default. If you turn this option on, then -threading will be done only if the number of messages being -threaded is less than `mh-large-folder'." - :type 'boolean - :group 'mh-thread) - - - -;;; The Tool Bar (:group 'mh-tool-bar) - -(defcustom mh-tool-bar-search-function 'mh-search - "*Function called by the tool bar search button. - -By default, this is set to `mh-search'. You can also choose -\"Other Function\" from the \"Value Menu\" and enter a function -of your own choosing." - :type '(choice (const mh-search) - (function :tag "Other Function")) - :group 'mh-tool-bar) - -;; Functions called from the tool bar -(defun mh-tool-bar-search (&optional arg) - "Interactively call `mh-tool-bar-search-function'. -Optional argument ARG is not used." - (interactive "P") - (call-interactively mh-tool-bar-search-function)) - -(defun mh-tool-bar-customize () - "Call `mh-customize' from the tool bar." - (interactive) - (mh-customize t)) - -(defun mh-tool-bar-folder-help () - "Visit \"(mh-e)Top\"." - (interactive) - (info "(mh-e)Top") - (delete-other-windows)) - -(defun mh-tool-bar-letter-help () - "Visit \"(mh-e)Editing Drafts\"." - (interactive) - (info "(mh-e)Editing Drafts") - (delete-other-windows)) - -(defmacro mh-tool-bar-reply-generator (function recipient folder-buffer-flag) - "Generate FUNCTION that replies to RECIPIENT. -If FOLDER-BUFFER-FLAG is nil then the function generated... -When INCLUDE-FLAG is non-nil, include message body being replied to." - `(defun ,function (&optional arg) - ,(format "Reply to \"%s\".\nWhen ARG is non-nil include message in reply." - recipient) - (interactive "P") - ,(if folder-buffer-flag nil '(set-buffer mh-show-folder-buffer)) - (mh-reply (mh-get-msg-num nil) ,recipient arg))) - -(mh-tool-bar-reply-generator mh-tool-bar-reply-from "from" t) -(mh-tool-bar-reply-generator mh-show-tool-bar-reply-from "from" nil) -(mh-tool-bar-reply-generator mh-tool-bar-reply-to "to" t) -(mh-tool-bar-reply-generator mh-show-tool-bar-reply-to "to" nil) -(mh-tool-bar-reply-generator mh-tool-bar-reply-all "all" t) -(mh-tool-bar-reply-generator mh-show-tool-bar-reply-all "all" nil) - -;; XEmacs has a couple of extra customizations... -(mh-do-in-xemacs - (defcustom mh-xemacs-use-tool-bar-flag mh-xemacs-has-tool-bar-flag - "*If non-nil, use tool bar. - -This option controls whether to show the MH-E icons at all. By -default, this option is turned on if the window system supports -tool bars. If your system doesn't support tool bars, then you -won't be able to turn on this option." - :type 'boolean - :group 'mh-tool-bar - :set (lambda (symbol value) - (if (and (eq value t) - (not mh-xemacs-has-tool-bar-flag)) - (error "Tool bar not supported")) - (set-default symbol value))) - - (defcustom mh-xemacs-tool-bar-position nil - "*Tool bar location. - -This option controls the placement of the tool bar along the four -edges of the frame. You can choose from one of \"Same As Default -Tool Bar\", \"Top\", \"Bottom\", \"Left\", or \"Right\". If this -variable is set to anything other than \"Same As Default Tool -Bar\" and the default tool bar is in a different location, then -two tool bars will be displayed: the MH-E tool bar and the -default tool bar." - :type '(radio (const :tag "Same As Default Tool Bar" :value nil) - (const :tag "Top" :value top) - (const :tag "Bottom" :value bottom) - (const :tag "Left" :value left) - (const :tag "Right" :value right)) - :group 'mh-tool-bar)) - -(defun mh-buffer-exists-p (mode) - "Test whether a buffer with major mode MODE is present." - (loop for buf in (buffer-list) - when (save-excursion - (set-buffer buf) - (eq major-mode mode)) - return t)) - -(defmacro mh-tool-bar-define (defaults &rest buttons) - "Define a tool bar for MH-E. -DEFAULTS is the list of buttons that are present by default. It -is a list of lists where the sublists are of the following form: - - (:KEYWORD FUNC1 FUNC2 FUNC3 ...) - -Here :KEYWORD is one of :folder or :letter. If it is :folder then -the default buttons in the folder and show mode buffers are being -specified. If it is :letter then the default buttons in the -letter mode are listed. FUNC1, FUNC2, FUNC3, ... are the names of -the functions that the buttons would execute. - -Each element of BUTTONS is a list consisting of four mandatory -items and one optional item as follows: - - (FUNCTION MODES ICON DOC &optional ENABLE-EXPR) - -where, - - FUNCTION is the name of the function that will be executed when - the button is clicked. - - MODES is a list of symbols. List elements must be from \"folder\", - \"letter\" and \"sequence\". If \"folder\" is present then the button is - available in the folder and show buffer. If the name of FUNCTION is - of the form \"mh-foo\", where foo is some arbitrary string, then we - check if the function `mh-show-foo' exists. If it exists then that - function is used in the show buffer. Otherwise the original function - `mh-foo' is used in the show buffer as well. Presence of \"sequence\" - is handled similar to the above. The only difference is that the - button is shown only when the folder is narrowed to a sequence. If - \"letter\" is present in MODES, then the button is available during - draft editing and runs FUNCTION when clicked. - - ICON is the icon that is drawn in the button. - - DOC is the documentation for the button. It is used in tool-tips and - in providing other help to the user. GNU Emacs uses only the first - line of the string. So the DOC should be formatted such that the - first line is useful and complete without the rest of the string. - - Optional item ENABLE-EXPR is an arbitrary lisp expression. If it - evaluates to nil, then the button is deactivated, otherwise it is - active. If it isn't present then the button is always active." - ;; The following variable names have been carefully chosen to make code - ;; generation easier. Modifying the names should be done carefully. - (let (folder-buttons folder-docs folder-button-setter sequence-button-setter - show-buttons show-button-setter show-seq-button-setter - letter-buttons letter-docs letter-button-setter - folder-defaults letter-defaults - folder-vectors show-vectors letter-vectors) - (dolist (x defaults) - (cond ((eq (car x) :folder) (setq folder-defaults (cdr x))) - ((eq (car x) :letter) (setq letter-defaults (cdr x))))) - (dolist (button buttons) - (unless (and (listp button) - (or (equal (length button) 4) (equal (length button) 5))) - (error "Incorrect MH-E tool-bar button specification: %s" button)) - (let* ((name (nth 0 button)) - (name-str (symbol-name name)) - (icon (nth 2 button)) - (xemacs-icon (mh-do-in-xemacs - (cdr (assoc (intern icon) mh-xemacs-icon-map)))) - (full-doc (nth 3 button)) - (doc (if (string-match "\\(.*\\)\n" full-doc) - (match-string 1 full-doc) - full-doc)) - (enable-expr (or (nth 4 button) t)) - (modes (nth 1 button)) - functions show-sym) - (when (memq 'letter modes) (setq functions `(:letter ,name))) - (when (or (memq 'folder modes) (memq 'sequence modes)) - (setq functions - (append `(,(if (memq 'folder modes) :folder :sequence) ,name) - functions)) - (setq show-sym - (if (string-match "^mh-\\(.*\\)$" name-str) - (intern (concat "mh-show-" (match-string 1 name-str))) - name)) - (setq functions - (append `(,(if (memq 'folder modes) :show :show-seq) - ,(if (fboundp show-sym) show-sym name)) - functions))) - (do ((functions functions (cddr functions))) - ((null functions)) - (let* ((type (car functions)) - (function (cadr functions)) - (type1 (substring (symbol-name type) 1)) - (vector-list (cond ((eq type :show) 'show-vectors) - ((eq type :show-seq) 'show-vectors) - ((eq type :letter) 'letter-vectors) - (t 'folder-vectors))) - (list (cond ((eq type :letter) 'mh-tool-bar-letter-buttons) - (t 'mh-tool-bar-folder-buttons))) - (key (intern (concat "mh-" type1 "tool-bar-" name-str))) - (setter (intern (concat type1 "-button-setter"))) - (mbuttons (cond ((eq type :letter) 'letter-buttons) - ((eq type :show) 'show-buttons) - ((eq type :show-seq) 'show-buttons) - (t 'folder-buttons))) - (docs (cond ((eq mbuttons 'letter-buttons) 'letter-docs) - ((eq mbuttons 'folder-buttons) 'folder-docs)))) - (add-to-list vector-list `[,xemacs-icon ,function t ,full-doc]) - (add-to-list - setter `(when (member ',name ,list) - (mh-funcall-if-exists - tool-bar-add-item ,icon ',function ',key - :help ,doc :enable ',enable-expr))) - (add-to-list mbuttons name) - (if docs (add-to-list docs doc)))))) - (setq folder-buttons (nreverse folder-buttons) - letter-buttons (nreverse letter-buttons) - show-buttons (nreverse show-buttons) - letter-docs (nreverse letter-docs) - folder-docs (nreverse folder-docs) - folder-vectors (nreverse folder-vectors) - show-vectors (nreverse show-vectors) - letter-vectors (nreverse letter-vectors)) - (dolist (x folder-defaults) - (unless (memq x folder-buttons) - (error "Folder defaults contains unknown button '%s'" x))) - (dolist (x letter-defaults) - (unless (memq x letter-buttons) - (error "Letter defaults contains unknown button '%s'" x))) - `(eval-when (compile load eval) - (defvar mh-folder-tool-bar-map nil) - (defvar mh-folder-seq-tool-bar-map nil) - (defvar mh-show-tool-bar-map nil) - (defvar mh-show-seq-tool-bar-map nil) - (defvar mh-letter-tool-bar-map nil) - ;; GNU Emacs tool bar specific code - (mh-do-in-gnu-emacs - ;; Tool bar initialization functions - (defun mh-tool-bar-folder-buttons-init () - (when (mh-buffer-exists-p 'mh-folder-mode) - (mh-image-load-path) - (setq mh-folder-tool-bar-map - (let ((tool-bar-map (make-sparse-keymap))) - ,@(nreverse folder-button-setter) - tool-bar-map)) - (setq mh-show-tool-bar-map - (let ((tool-bar-map (make-sparse-keymap))) - ,@(nreverse show-button-setter) - tool-bar-map)) - (setq mh-show-seq-tool-bar-map - (let ((tool-bar-map (copy-keymap mh-show-tool-bar-map))) - ,@(nreverse show-seq-button-setter) - tool-bar-map)) - (setq mh-folder-seq-tool-bar-map - (let ((tool-bar-map (copy-keymap mh-folder-tool-bar-map))) - ,@(nreverse sequence-button-setter) - tool-bar-map)))) - (defun mh-tool-bar-letter-buttons-init () - (when (mh-buffer-exists-p 'mh-letter-mode) - (mh-image-load-path) - (setq mh-letter-tool-bar-map - (let ((tool-bar-map (make-sparse-keymap))) - ,@(nreverse letter-button-setter) - tool-bar-map)))) - ;; Custom setter functions - (defun mh-tool-bar-folder-buttons-set (symbol value) - "Construct tool bar for `mh-folder-mode' and `mh-show-mode'." - (set-default symbol value) - (mh-tool-bar-folder-buttons-init)) - (defun mh-tool-bar-letter-buttons-set (symbol value) - "Construct tool bar for `mh-letter-mode'." - (set-default symbol value) - (mh-tool-bar-letter-buttons-init))) - ;; XEmacs specific code - (mh-do-in-xemacs - (defvar mh-tool-bar-folder-vector-map - ',(loop for button in folder-buttons - for vector in folder-vectors - collect (cons button vector))) - (defvar mh-tool-bar-show-vector-map - ',(loop for button in show-buttons - for vector in show-vectors - collect (cons button vector))) - (defvar mh-tool-bar-letter-vector-map - ',(loop for button in letter-buttons - for vector in letter-vectors - collect (cons button vector))) - (defvar mh-tool-bar-folder-buttons nil) - (defvar mh-tool-bar-show-buttons nil) - (defvar mh-tool-bar-letter-buttons nil) - ;; Custom setter functions - (defun mh-tool-bar-letter-buttons-set (symbol value) - (set-default symbol value) - (when mh-xemacs-has-tool-bar-flag - (setq mh-tool-bar-letter-buttons - (loop for b in value - collect (cdr (assoc b mh-tool-bar-letter-vector-map)))))) - (defun mh-tool-bar-folder-buttons-set (symbol value) - (set-default symbol value) - (when mh-xemacs-has-tool-bar-flag - (setq mh-tool-bar-folder-buttons - (loop for b in value - collect (cdr (assoc b mh-tool-bar-folder-vector-map)))) - (setq mh-tool-bar-show-buttons - (loop for b in value - collect (cdr (assoc b mh-tool-bar-show-vector-map)))))) - (defun mh-tool-bar-init (mode) - "Install tool bar in MODE." - (let ((tool-bar (cond ((eq mode :folder) mh-tool-bar-folder-buttons) - ((eq mode :letter) mh-tool-bar-letter-buttons) - ((eq mode :show) mh-tool-bar-show-buttons))) - (height 37) - (width 40) - (buffer (current-buffer))) - (when mh-xemacs-use-tool-bar-flag - (cond - ((eq mh-xemacs-tool-bar-position 'top) - (set-specifier top-toolbar tool-bar buffer) - (set-specifier top-toolbar-visible-p t) - (set-specifier top-toolbar-height height)) - ((eq mh-xemacs-tool-bar-position 'bottom) - (set-specifier bottom-toolbar tool-bar buffer) - (set-specifier bottom-toolbar-visible-p t) - (set-specifier bottom-toolbar-height height)) - ((eq mh-xemacs-tool-bar-position 'left) - (set-specifier left-toolbar tool-bar buffer) - (set-specifier left-toolbar-visible-p t) - (set-specifier left-toolbar-width width)) - ((eq mh-xemacs-tool-bar-position 'right) - (set-specifier right-toolbar tool-bar buffer) - (set-specifier right-toolbar-visible-p t) - (set-specifier right-toolbar-width width)) - (t (set-specifier default-toolbar tool-bar buffer))))))) - ;; Declare customizable tool bars - (custom-declare-variable - 'mh-tool-bar-folder-buttons - '(list ,@(mapcar (lambda (x) `(quote ,x)) folder-defaults)) - "List of buttons to include in MH-Folder tool bar." - :group 'mh-tool-bar :set 'mh-tool-bar-folder-buttons-set - :type '(set ,@(loop for x in folder-buttons - for y in folder-docs - collect `(const :tag ,y ,x)))) - (custom-declare-variable - 'mh-tool-bar-letter-buttons - '(list ,@(mapcar (lambda (x) `(quote ,x)) letter-defaults)) - "List of buttons to include in MH-Letter tool bar." - :group 'mh-tool-bar :set 'mh-tool-bar-letter-buttons-set - :type '(set ,@(loop for x in letter-buttons - for y in letter-docs - collect `(const :tag ,y ,x))))))) - -(mh-tool-bar-define - ((:folder mh-inc-folder mh-mime-save-parts mh-previous-undeleted-msg - mh-page-msg mh-next-undeleted-msg mh-delete-msg mh-refile-msg - mh-undo mh-execute-commands mh-toggle-tick mh-reply - mh-alias-grab-from-field mh-send mh-rescan-folder - mh-tool-bar-search mh-visit-folder - mh-tool-bar-customize mh-tool-bar-folder-help mh-widen) - (:letter mh-send-letter mh-compose-insertion ispell-message save-buffer - undo kill-region menu-bar-kill-ring-save yank mh-fully-kill-draft - mh-tool-bar-customize mh-tool-bar-letter-help)) - ;; Folder/Show buffer buttons - (mh-inc-folder (folder) "mail" - "Incorporate new mail in Inbox -This button runs `mh-inc-folder' which drags any -new mail into your Inbox folder.") - (mh-mime-save-parts (folder) "attach" - "Save MIME parts from this message -This button runs `mh-mime-save-parts' which saves a message's -different parts into separate files.") - (mh-previous-undeleted-msg (folder) "left-arrow" - "Go to the previous undeleted message -This button runs `mh-previous-undeleted-msg'") - (mh-page-msg (folder) "page-down" - "Page the current message forwards\nThis button runs `mh-page-msg'") - (mh-next-undeleted-msg (folder) "right-arrow" - "Go to the next undeleted message\nThe button runs `mh-next-undeleted-msg'") - (mh-delete-msg (folder) "close" - "Mark this message for deletion\nThis button runs `mh-delete-msg'") - (mh-refile-msg (folder) "mail/refile" - "Refile this message\nThis button runs `mh-refile-msg'") - (mh-undo (folder) "undo" "Undo last operation\nThis button runs `undo'" - (mh-outstanding-commands-p)) - (mh-execute-commands (folder) "execute" - "Perform moves and deletes\nThis button runs `mh-execute-commands'" - (mh-outstanding-commands-p)) - (mh-toggle-tick (folder) "highlight" - "Toggle tick mark\nThis button runs `mh-toggle-tick'") - (mh-toggle-showing (folder) "show" - "Toggle showing message\nThis button runs `mh-toggle-showing'") - (mh-tool-bar-reply-from (folder) "mail/reply-from" "Reply to \"from\"") - (mh-tool-bar-reply-to (folder) "mail/reply-to" "Reply to \"to\"") - (mh-tool-bar-reply-all (folder) "mail/reply-all" "Reply to \"all\"") - (mh-reply (folder) "mail/reply" - "Reply to this message\nThis button runs `mh-reply'") - (mh-alias-grab-from-field (folder) "mail/alias" - "Grab From alias\nThis button runs `mh-alias-grab-from-field'" - (and (mh-extract-from-header-value) (not (mh-alias-for-from-p)))) - (mh-send (folder) "mail/compose" - "Compose new message\nThis button runs `mh-send'") - (mh-rescan-folder (folder) "refresh" - "Rescan this folder\nThis button runs `mh-rescan-folder'") - (mh-pack-folder (folder) "mail/repack" - "Repack this folder\nThis button runs `mh-pack-folder'") - (mh-tool-bar-search (folder) "search" - "Search\nThis button runs `mh-tool-bar-search-function'") - (mh-visit-folder (folder) "fld-open" - "Visit other folder\nThis button runs `mh-visit-folder'") - ;; Letter buffer buttons - (mh-send-letter (letter) "mail/send" "Send this letter") - (mh-compose-insertion (letter) "attach" "Insert attachment") - (ispell-message (letter) "spell" "Check spelling") - (save-buffer (letter) "save" "Save current buffer to its file" - (buffer-modified-p)) - (undo (letter) "undo" "Undo last operation") - (kill-region (letter) "cut" - "Cut (kill) text in region between mark and current position") - (menu-bar-kill-ring-save (letter) "copy" - "Copy text in region between mark and current position") - (yank (letter) "paste" "Paste (yank) text cut or copied earlier") - (mh-fully-kill-draft (letter) "close" "Kill this draft") - ;; Common buttons - (mh-tool-bar-customize (folder letter) "preferences" "MH-E Preferences") - (mh-tool-bar-folder-help (folder) "help" - "Help! (general help)\nThis button runs `info'") - (mh-tool-bar-letter-help (letter) "help" - "Help! (general help)\nThis button runs `info'") - ;; Folder narrowed to sequence buttons - (mh-widen (sequence) "widen" - "Widen from the sequence\nThis button runs `mh-widen'")) - - - -;;; Hooks (:group 'mh-hooks + group where hook described) - -(defcustom mh-after-commands-processed-hook nil - "Hook run by \\<mh-folder-mode-map>\\[mh-execute-commands] after performing outstanding requests. - -Variables that are useful in this hook include -`mh-folders-changed', which lists which folders were affected by -deletes and refiles. This list will always include the current -folder, which is also available in `mh-current-folder'." - :type 'hook - :group 'mh-hooks - :group 'mh-folder) - -(defcustom mh-alias-reloaded-hook nil - "Hook run by `mh-alias-reload' after loading aliases." - :type 'hook - :group 'mh-hooks - :group 'mh-alias) - -(defcustom mh-before-commands-processed-hook nil - "Hook run by \\<mh-folder-mode-map>\\[mh-execute-commands] before performing outstanding requests. - -Variables that are useful in this hook include `mh-delete-list' -and `mh-refile-list' which can be used to see which changes will -be made to the current folder, `mh-current-folder'." - :type 'hook - :group 'mh-hooks - :group 'mh-folder) - -(defcustom mh-before-quit-hook nil - "Hook run by \\<mh-folder-mode-map>\\[mh-quit] before quitting MH-E. - -This hook is called before the quit occurs, so you might use it -to perform any MH-E operations; you could perform some query and -abort the quit or call `mh-execute-commands', for example. - -See also `mh-quit-hook'." - :type 'hook - :group 'mh-hooks - :group 'mh-folder) - -(defcustom mh-before-send-letter-hook nil - "Hook run at the beginning of the \\<mh-letter-mode-map>\\[mh-send-letter] command. - -For example, if you want to check your spelling in your message -before sending, add the `ispell-message' function." - :type 'hook - :options '(ispell-message) - :group 'mh-hooks - :group 'mh-letter) - -(defcustom mh-delete-msg-hook nil - "Hook run by \\<mh-letter-mode-map>\\[mh-delete-msg] after marking each message for deletion. - -For example, a past maintainer of MH-E used this once when he -kept statistics on his mail usage." - :type 'hook - :group 'mh-hooks - :group 'mh-show) - -(defcustom mh-find-path-hook nil - "Hook run by `mh-find-path' after reading the user's MH profile. - -This hook can be used the change the value of the variables that -`mh-find-path' sets if you need to run with different values -between MH and MH-E." - :type 'hook - :group 'mh-hooks - :group 'mh-e) - -(defcustom mh-folder-mode-hook nil - "Hook run by `mh-folder-mode' when visiting a new folder." - :type 'hook - :group 'mh-hooks - :group 'mh-folder) - -(defcustom mh-forward-hook nil - "Hook run by `mh-forward' on a forwarded letter." - :type 'hook - :group 'mh-hooks - :group 'mh-sending-mail) - -(defcustom mh-inc-folder-hook nil - "Hook run by \\<mh-folder-mode-map>\\[mh-inc-folder] after incorporating mail into a folder." - :type 'hook - :group 'mh-hooks - :group 'mh-inc) - -(defcustom mh-insert-signature-hook nil - "Hook run by \\<mh-letter-mode-map>\\[mh-insert-signature] after signature has been inserted. - -Hook functions may access the actual name of the file or the -function used to insert the signature with -`mh-signature-file-name'." - :type 'hook - :group 'mh-hooks - :group 'mh-letter) - -(defcustom mh-kill-folder-suppress-prompt-hooks '(mh-search-p) - "Abnormal hook run at the beginning of \\<mh-folder-mode-map>\\[mh-kill-folder]. - -The hook functions are called with no arguments and should return -a non-nil value to suppress the normal prompt when you remove a -folder. This is useful for folders that are easily regenerated. - -The default value of `mh-search-p' suppresses the prompt on -folders generated by searching. - -WARNING: Use this hook with care. If there is a bug in your hook -which returns t on \"+inbox\" and you hit \\[mh-kill-folder] by -accident in the \"+inbox\" folder, you will not be happy." - :type 'hook - :group 'mh-hooks - :group 'mh-folder) - -(defcustom mh-letter-mode-hook nil - "Hook run by `mh-letter-mode' on a new letter. - -This hook allows you to do some processing before editing a -letter. For example, you may wish to modify the header after -\"repl\" has done its work, or you may have a complicated -\"components\" file and need to tell MH-E where the cursor should -go." - :type 'hook - :group 'mh-hooks - :group 'mh-sending-mail) - -(defcustom mh-mh-to-mime-hook nil - "Hook run on the formatted letter by \\<mh-letter-mode-map>\\[mh-mh-to-mime]." - :type 'hook - :group 'mh-hooks - :group 'mh-letter) - -(defcustom mh-search-mode-hook nil - "Hook run upon entry to `mh-search-mode'\\<mh-folder-mode-map>. - -If you find that you do the same thing over and over when editing -the search template, you may wish to bind some shortcuts to keys. -This can be done with this hook which is called when -\\[mh-search] is run on a new pattern." - :type 'hook - :group 'mh-hooks - :group 'mh-search) - -(defcustom mh-quit-hook nil - "Hook run by \\<mh-folder-mode-map>\\[mh-quit] after quitting MH-E. - -This hook is not run in an MH-E context, so you might use it to -modify the window setup. - -See also `mh-before-quit-hook'." - :type 'hook - :group 'mh-hooks - :group 'mh-folder) - -(defcustom mh-refile-msg-hook nil - "Hook run by \\<mh-folder-mode-map>\\[mh-refile-msg] after marking each message for refiling." - :type 'hook - :group 'mh-hooks - :group 'mh-folder) - -(defcustom mh-show-hook nil - "Hook run after \\<mh-folder-mode-map>\\[mh-show] shows a message. - -It is the last thing called after messages are displayed. It's -used to affect the behavior of MH-E in general or when -`mh-show-mode-hook' is too early. See `mh-show-mode-hook'." - :type 'hook - :group 'mh-hooks - :group 'mh-show) - -(defcustom mh-show-mode-hook nil - "Hook run upon entry to `mh-show-mode'. - -This hook is called early on in the process of the message -display. It is usually used to perform some action on the -message's content. See `mh-show-hook'." - :type 'hook - :group 'mh-hooks - :group 'mh-show) - -(defcustom mh-unseen-updated-hook nil - "Hook run after the unseen sequence has been updated. - -The variable `mh-seen-list' can be used by this hook to obtain -the list of messages which were removed from the unseen -sequence." - :type 'hook - :group 'mh-hooks - :group 'mh-sequences) - - - -;;; Faces (:group 'mh-faces + group where faces described) - -(if (boundp 'facemenu-unlisted-faces) - (add-to-list 'facemenu-unlisted-faces "^mh-")) - -(defface mh-folder-address '((t (:inherit mh-folder-subject))) - "Recipient face." - :group 'mh-faces - :group 'mh-folder) - -(defface mh-folder-body - '((((class color)) - (:inherit mh-folder-msg-number)) - (t - (:inherit mh-folder-msg-number :italic t))) - "Body text face." - :group 'mh-faces - :group 'mh-folder) - -(defface mh-folder-cur-msg-number - '((t - (:inherit mh-folder-msg-number :bold t))) - "Current message number face." - :group 'mh-faces - :group 'mh-folder) - -(defface mh-folder-date '((t (:inherit mh-folder-msg-number))) - "Date face." - :group 'mh-faces - :group 'mh-folder) - -(defface mh-folder-deleted '((t (:inherit mh-folder-msg-number))) - "Deleted message face." - :group 'mh-faces - :group 'mh-folder) - -(defface mh-folder-followup - '((((class color) (background light)) - (:foreground "blue3")) - (((class color) (background dark)) - (:foreground "LightGoldenRod")) - (t - (:bold t))) - "\"Re:\" face." - :group 'mh-faces - :group 'mh-folder) - -(defface mh-folder-msg-number - (mh-defface-compat - '((((class color) (min-colors 88) (background light)) - (:foreground "snow4")) - (((class color) (min-colors 88) (background dark)) - (:foreground "snow3")) - (((class color)) - (:foreground "cyan")))) - - "Message number face." - :group 'mh-faces - :group 'mh-folder) - -(defface mh-folder-refiled - (mh-defface-compat - '((((class color) (min-colors 88) (background light)) - (:foreground "DarkGoldenrod")) - (((class color) (min-colors 88) (background dark)) - (:foreground "LightGoldenrod")) - (((class color)) - (:foreground "yellow" :weight light)) - (((class grayscale) (background light)) - (:foreground "Gray90" :bold t :italic t)) - (((class grayscale) (background dark)) - (:foreground "DimGray" :bold t :italic t)) - (t - (:bold t :italic t)))) - "Refiled message face." - :group 'mh-faces - :group 'mh-folder) - -(defface mh-folder-sent-to-me-hint '((t (:inherit mh-folder-date))) - "Fontification hint face in messages sent directly to us. -The detection of messages sent to us is governed by the scan -format `mh-scan-format-nmh' and the regular expression -`mh-scan-sent-to-me-sender-regexp'." - :group 'mh-faces - :group 'mh-folder) - -(defface mh-folder-sent-to-me-sender '((t (:inherit mh-folder-followup))) - "Sender face in messages sent directly to us. -The detection of messages sent to us is governed by the scan -format `mh-scan-format-nmh' and the regular expression -`mh-scan-sent-to-me-sender-regexp'." - :group 'mh-faces - :group 'mh-folder) - -(defface mh-folder-subject - '((((class color) (background light)) - (:foreground "blue4")) - (((class color) (background dark)) - (:foreground "yellow")) - (t - (:bold t))) - "Subject face." - :group 'mh-faces - :group 'mh-folder) - -(defface mh-folder-tick - '((((class color) (background dark)) - (:background "#dddf7e")) - (((class color) (background light)) - (:background "#dddf7e")) - (t - (:underline t))) - "Ticked message face." - :group 'mh-faces - :group 'mh-folder) - -(defface mh-folder-to - (mh-defface-compat - '((((class color) (min-colors 88) (background light)) - (:foreground "RosyBrown")) - (((class color) (min-colors 88) (background dark)) - (:foreground "LightSalmon")) - (((class color)) - (:foreground "green")) - (((class grayscale) (background light)) - (:foreground "DimGray" :italic t)) - (((class grayscale) (background dark)) - (:foreground "LightGray" :italic t)) - (t - (:italic t)))) - "\"To:\" face." - :group 'mh-faces - :group 'mh-folder) - -(defface mh-search-folder - '((((class color) (background light)) - (:foreground "dark green" :bold t)) - (((class color) (background dark)) - (:foreground "indian red" :bold t)) - (t - (:bold t))) - "Folder heading face in MH-Folder buffers created by searches." - :group 'mh-faces - :group 'mh-search) - -(defface mh-letter-header-field - '((((class color) (background light)) - (:background "gray90")) - (((class color) (background dark)) - (:background "gray10")) - (t - (:bold t))) - "Editable header field value face in draft buffers." - :group 'mh-faces - :group 'mh-letter) - -(defface mh-show-cc - (mh-defface-compat - '((((class color) (min-colors 88) (background light)) - (:foreground "DarkGoldenrod")) - (((class color) (min-colors 88) (background dark)) - (:foreground "LightGoldenrod")) - (((class color)) - (:foreground "yellow" :weight light)) - (((class grayscale) (background light)) - (:foreground "Gray90" :bold t :italic t)) - (((class grayscale) (background dark)) - (:foreground "DimGray" :bold t :italic t)) - (t - (:bold t :italic t)))) - "Face used to highlight \"cc:\" header fields." - :group 'mh-faces - :group 'mh-show) - -(defface mh-show-date - (mh-defface-compat - '((((class color) (min-colors 88) (background light)) - (:foreground "ForestGreen")) - (((class color) (min-colors 88) (background dark)) - (:foreground "PaleGreen")) - (((class color)) - (:foreground "green")) - (((class grayscale) (background light)) - (:foreground "Gray90" :bold t)) - (((class grayscale) (background dark)) - (:foreground "DimGray" :bold t)) - (t - (:bold t :underline t)))) - "Face used to highlight \"Date:\" header fields." - :group 'mh-faces - :group 'mh-show) - -(defface mh-show-from - '((((class color) (background light)) - (:foreground "red3")) - (((class color) (background dark)) - (:foreground "cyan")) - (t - (:bold t))) - "Face used to highlight \"From:\" header fields." - :group 'mh-faces - :group 'mh-show) - -(defface mh-show-header - (mh-defface-compat - '((((class color) (min-colors 88) (background light)) - (:foreground "RosyBrown")) - (((class color) (min-colors 88) (background dark)) - (:foreground "LightSalmon")) - (((class color)) - (:foreground "green")) - (((class grayscale) (background light)) - (:foreground "DimGray" :italic t)) - (((class grayscale) (background dark)) - (:foreground "LightGray" :italic t)) - (t - (:italic t)))) - "Face used to deemphasize less interesting header fields." - :group 'mh-faces - :group 'mh-show) - -(defface mh-show-pgg-bad '((t (:bold t :foreground "DeepPink1"))) - "Bad PGG signature face." - :group 'mh-faces - :group 'mh-show) - -(defface mh-show-pgg-good '((t (:bold t :foreground "LimeGreen"))) - "Good PGG signature face." - :group 'mh-faces - :group 'mh-show) - -(defface mh-show-pgg-unknown '((t (:bold t :foreground "DarkGoldenrod2"))) - "Unknown or untrusted PGG signature face." - :group 'mh-faces - :group 'mh-show) - -(defface mh-show-signature '((t (:italic t))) - "Signature face." - :group 'mh-faces - :group 'mh-show) - -(defface mh-show-subject '((t (:inherit mh-folder-subject))) - "Face used to highlight \"Subject:\" header fields." - :group 'mh-faces - :group 'mh-show) - -(defface mh-show-to - '((((class color) (background light)) - (:foreground "SaddleBrown")) - (((class color) (background dark)) - (:foreground "burlywood")) - (((class grayscale) (background light)) - (:foreground "DimGray" :underline t)) - (((class grayscale) (background dark)) - (:foreground "LightGray" :underline t)) - (t (:underline t))) - "Face used to highlight \"To:\" header fields." - :group 'mh-faces - :group 'mh-show) - -(defface mh-show-xface '((t (:inherit (mh-show-from highlight)))) - "X-Face image face. -The background and foreground are used in the image." - :group 'mh-faces - :group 'mh-show) - -(defface mh-speedbar-folder - '((((class color) (background light)) - (:foreground "blue4")) - (((class color) (background dark)) - (:foreground "light blue"))) - "Basic folder face." - :group 'mh-faces - :group 'mh-speedbar) - -(defface mh-speedbar-folder-with-unseen-messages - '((t - (:inherit mh-speedbar-folder :bold t))) - "Folder face when folder contains unread messages." - :group 'mh-faces - :group 'mh-speedbar) - -(defface mh-speedbar-selected-folder - '((((class color) (background light)) - (:foreground "red1" :underline t)) - (((class color) (background dark)) - (:foreground "red1" :underline t)) - (t - (:underline t))) - "Selected folder face." - :group 'mh-faces - :group 'mh-speedbar) - -(defface mh-speedbar-selected-folder-with-unseen-messages - '((t - (:inherit mh-speedbar-selected-folder :bold t))) - "Selected folder face when folder contains unread messages." - :group 'mh-faces - :group 'mh-speedbar) - -;;; XXX Temporary function for comparing old and new faces. Delete -;;; when everybody is happy. -(defvar bw-face-generation 'new) - -(defun bw-toggle-faces () - "Toggle between old and new faces." - (interactive) - (cond ((eq bw-face-generation 'new) - (message "Going from new to old...") - (bw-new-face-to-old) - (message "Going from new to old...done") - (setq bw-face-generation 'old)) - ((eq bw-face-generation 'old) - (message "Going from old to new...") - (bw-old-face-to-new) - (message "Going from old to new...done") - (setq bw-face-generation 'new)))) - -(defun bw-new-face-to-old () - "Set old faces." - (face-spec-set 'mh-folder-body - (mh-defface-compat - '((((class color) (min-colors 88) (background light)) - (:foreground "RosyBrown")) - (((class color) (min-colors 88) (background dark)) - (:foreground "LightSalmon")) - (((class color)) - (:foreground "green")) - (((class grayscale) (background light)) - (:foreground "DimGray" :italic t)) - (((class grayscale) (background dark)) - (:foreground "LightGray" :italic t)) - (t - (:italic t))))) - - (face-spec-set 'mh-folder-msg-number - '((((class color) (background light)) - (:foreground "snow4")) - (((class color) (background dark)) - (:foreground "snow3")) - (t - (:bold t)))) - - (face-spec-set 'mh-folder-cur-msg-number - (mh-defface-compat - '((((class color) (min-colors 88) (background light)) - (:foreground "Purple")) - (((class color) (min-colors 88) (background dark)) - (:foreground "Cyan")) - (((class color)) - (:foreground "cyan" :weight bold)) - (((class grayscale) (background light)) - (:foreground "LightGray" :bold t)) - (((class grayscale) (background dark)) - (:foreground "DimGray" :bold t)) - (t - (:bold t))))) - - (face-spec-set 'mh-folder-date - '((((class color) (background light)) - (:foreground "snow4")) - (((class color) (background dark)) - (:foreground "snow3")) - (t - (:bold t)))) - - (face-spec-set 'mh-folder-msg-number - '((((class color) (background light)) - (:foreground "snow4")) - (((class color) (background dark)) - (:foreground "snow3")) - (t - (:bold t))))) - -(defun bw-old-face-to-new () - "Set new faces." - (face-spec-set 'mh-folder-body - '((((class color)) - (:inherit mh-folder-msg-number)) - (t - (:inherit mh-folder-msg-number :italic t)))) - - (face-spec-set 'mh-folder-cur-msg-number - '((t - (:inherit mh-folder-msg-number :bold t)))) - - (face-spec-set 'mh-folder-date '((t (:inherit mh-folder-msg-number)))) - - (face-spec-set 'mh-folder-msg-number - '((((class color) (background light)) - (:foreground "snow4")) - (((class color) (background dark)) - (:foreground "snow3")) - (((class color)) - (:foreground "cyan"))))) - -;; Local Variables: -;; indent-tabs-mode: nil -;; sentence-end-double-space: nil -;; End: - -;; arch-tag: 778d2a20-82e2-4276-be9d-309386776a68 -;;; mh-customize.el ends here |