Merge from emacs-23
[bpt/emacs.git] / lisp / mh-e / mh-e.el
CommitLineData
c26cf6c8
RS
1;;; mh-e.el --- GNU Emacs interface to the MH mail system
2
e495eaec 3;; Copyright (C) 1985, 1986, 1987, 1988,
dcf71371 4;; 1990, 1992, 1993, 1994, 1995, 1997, 1999,
114f9c96 5;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
dcf71371 6;; Free Software Foundation, Inc.
c26cf6c8 7
a1b4049d 8;; Author: Bill Wohler <wohler@newt.com>
6e65a812 9;; Maintainer: Bill Wohler <wohler@newt.com>
06d3d10f 10;; Version: 8.2
c26cf6c8
RS
11;; Keywords: mail
12
60370d40 13;; This file is part of GNU Emacs.
9b7bc076 14
5e809f55 15;; GNU Emacs is free software: you can redistribute it and/or modify
c26cf6c8 16;; it under the terms of the GNU General Public License as published by
5e809f55
GM
17;; the Free Software Foundation, either version 3 of the License, or
18;; (at your option) any later version.
c26cf6c8 19
9b7bc076 20;; GNU Emacs is distributed in the hope that it will be useful,
c26cf6c8
RS
21;; but WITHOUT ANY WARRANTY; without even the implied warranty of
22;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23;; GNU General Public License for more details.
24
25;; You should have received a copy of the GNU General Public License
5e809f55 26;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
c26cf6c8
RS
27
28;;; Commentary:
29
d2f8ce2f
BW
30;; MH-E is an Emacs interface to the MH mail system.
31
9e6f5938 32;; MH-E is supported in GNU Emacs 21 and 22, as well as XEmacs 21
d2f8ce2f
BW
33;; (except for versions 21.5.9-21.5.16). It is compatible with MH
34;; versions 6.8.4 and higher, all versions of nmh, and GNU mailutils
9e6f5938
BW
35;; 1.0 and higher. Gnus is also required; version 5.10 or higher is
36;; recommended.
d2f8ce2f
BW
37
38;; MH (Message Handler) is a powerful mail reader. See
39;; http://rand-mh.sourceforge.net/.
40
41;; N.B. MH must have been compiled with the MHE compiler flag or several
42;; features necessary for MH-E will be missing from MH commands, specifically
43;; the -build switch to repl and forw.
44
dda00b2c 45;; How to use:
a1b4049d
BW
46;; M-x mh-rmail to read mail. Type C-h m there for a list of commands.
47;; C-u M-x mh-rmail to visit any folder.
dda00b2c 48;; M-x mh-smail to send mail. From within the mail reader, "s" works, too.
b578f267 49
a1b4049d
BW
50;; Your .emacs might benefit from these bindings:
51;; (global-set-key "\C-cr" 'mh-rmail)
52;; (global-set-key "\C-xm" 'mh-smail)
53;; (global-set-key "\C-x4m" 'mh-smail-other-window)
b578f267 54
dda00b2c
BW
55;; If Emacs can't find mh-rmail or mh-smail, add the following to ~/.emacs:
56;; (require 'mh-autoloads)
57
58;; If you want to customize MH-E before explicitly loading it, add this:
59;; (require 'mh-cus-load)
60
a1b4049d
BW
61;; Mailing Lists:
62;; mh-e-users@lists.sourceforge.net
63;; mh-e-announce@lists.sourceforge.net
64;; mh-e-devel@lists.sourceforge.net
dda00b2c 65
a1b4049d
BW
66;; Subscribe by sending a "subscribe" message to
67;; <list>-request@lists.sourceforge.net, or by using the web interface at
68;; https://sourceforge.net/mail/?group_id=13357
69
70;; Bug Reports:
71;; https://sourceforge.net/tracker/?group_id=13357&atid=113357
dda00b2c
BW
72;; Include the output of M-x mh-version in the bug report unless
73;; you're 110% sure we won't ask for it.
a1b4049d
BW
74
75;; Feature Requests:
dda00b2c 76;; https://sourceforge.net/tracker/?group_id=13357&atid=363357
a1b4049d
BW
77
78;; Support:
79;; https://sourceforge.net/tracker/?group_id=13357&atid=213357
b578f267 80
717e06e5 81;;; Change Log:
b578f267
EN
82
83;; Original version for Gosling emacs by Brian Reid, Stanford, 1982.
84;; Modified by James Larus, BBN, July 1984 and UCB, 1984 & 1985.
f0d73c14
BW
85;; Rewritten for GNU Emacs, James Larus, 1985.
86;; Modified by Stephen Gildea, 1988.
87;; Maintenance picked up by Bill Wohler and the
88;; SourceForge Crew <http://mh-e.sourceforge.net/>, 2001.
a1b4049d 89
c26cf6c8
RS
90;;; Code:
91
dda00b2c
BW
92;; Provide functions to the rest of MH-E. However, mh-e.el must not
93;; use any definitions in files that require mh-e from mh-loaddefs,
94;; for if it does it will introduce a require loop.
601dd9a3
SM
95(eval-and-compile
96 ;; Load it during compilation as well, since it defines the macro
97 ;; mh-require-cl.
98 (load "mh-loaddefs" nil 'nomessage))
c3d9274a 99
f0d73c14 100(mh-require-cl)
a1b4049d 101
ebb4d60b
BW
102(require 'mh-buffers)
103(require 'mh-compat)
104
dda00b2c
BW
105(mh-do-in-xemacs
106 (require 'mh-xemacs))
107
30545916
BW
108(mh-font-lock-add-keywords
109 'emacs-lisp-mode
110 (eval-when-compile
111 `((,(concat "(\\("
112 ;; Function declarations (use font-lock-function-name-face).
c90c4cf1 113 "\\(def\\(un\\|macro\\)-mh\\)\\|"
30545916 114 ;; Variable declarations (use font-lock-variable-name-face).
c90c4cf1 115 "\\(def\\(custom\\|face\\)-mh\\)\\|"
30545916 116 ;; Group declarations (use font-lock-type-face).
c90c4cf1 117 "\\(defgroup-mh\\)"
30545916
BW
118 "\\)\\>"
119 ;; Any whitespace and defined object.
120 "[ \t'\(]*"
121 "\\(setf[ \t]+\\sw+)\\|\\sw+\\)?")
122 (1 font-lock-keyword-face)
123 (7 (cond ((match-beginning 2) font-lock-function-name-face)
124 ((match-beginning 4) font-lock-variable-name-face)
125 (t font-lock-type-face))
126 nil t)))))
127
dda00b2c 128\f
c26cf6c8 129
dda00b2c 130;;; Global Variables
a1b4049d 131
dda00b2c
BW
132;; Try to keep variables local to a single file. Provide accessors if
133;; variables are shared. Use this section as a last resort.
cee9f5c6 134
06d3d10f 135(defconst mh-version "8.2" "Version number of MH-E.")
a1b4049d 136
dda00b2c 137;; Variants
c3d9274a 138
dda00b2c
BW
139(defvar mh-sys-path
140 '("/usr/local/nmh/bin" ; nmh default
141 "/usr/local/bin/mh/"
142 "/usr/local/mh/"
143 "/usr/bin/mh/" ; Ultrix 4.2, Linux
144 "/usr/new/mh/" ; Ultrix < 4.2
145 "/usr/contrib/mh/bin/" ; BSDI
146 "/usr/pkg/bin/" ; NetBSD
147 "/usr/local/bin/"
efa47761
BW
148 "/usr/local/bin/mu-mh/" ; GNU mailutils MH - default
149 "/usr/bin/mu-mh/") ; GNU mailutils MH - packaged
dda00b2c
BW
150 "List of directories to search for variants of the MH variant.
151The list `exec-path' is searched in addition to this list.
152There's no need for users to modify this list. Instead add extra
153directories to the customizable variable `mh-path'.")
a1b4049d 154
dda00b2c
BW
155(defvar mh-variants nil
156 "List describing known MH variants.
157Do not access this variable directly as it may not have yet been initialized.
158Use the function `mh-variants' instead.")
bdcfe844 159
dda00b2c
BW
160(defvar mh-variant-in-use nil
161 "The MH variant currently in use; a string with variant and version number.
162This differs from `mh-variant' when the latter is set to
163\"autodetect\".")
bdcfe844 164
dda00b2c
BW
165(defvar mh-progs nil
166 "Directory containing MH commands, such as inc, repl, and rmm.")
167
168;;;###autoload
169(put 'mh-progs 'risky-local-variable t)
170
171(defvar mh-lib nil
172 "Directory containing the MH library.
173This directory contains, among other things, the components file.")
174
175;;;###autoload
176(put 'mh-lib 'risky-local-variable t)
177
178(defvar mh-lib-progs nil
179 "Directory containing MH helper programs.
180This directory contains, among other things, the mhl program.")
181
182;;;###autoload
183(put 'mh-lib-progs 'risky-local-variable t)
c26cf6c8 184
dda00b2c 185;; Profile Components
c26cf6c8 186
dda00b2c
BW
187(defvar mh-draft-folder nil
188 "Cached value of the \"Draft-Folder:\" MH profile component.
189Name of folder containing draft messages.
1b7916fb 190Do not use a draft folder if nil.")
d1699462 191
dda00b2c
BW
192(defvar mh-inbox nil
193 "Cached value of the \"Inbox:\" MH profile component.
194Set to \"+inbox\" if no such component.
195Name of the Inbox folder.")
d1699462 196
dda00b2c
BW
197(defvar mh-user-path nil
198 "Cached value of the \"Path:\" MH profile component.
199User's mail folder directory.")
200
201;; Maps declared here so that they can be used in docstrings.
c26cf6c8
RS
202
203(defvar mh-folder-mode-map (make-keymap)
dda00b2c
BW
204 "Keymap for MH-Folder mode.")
205
206(defvar mh-folder-seq-tool-bar-map nil
207 "Keymap for MH-Folder tool bar.")
208
209(defvar mh-folder-tool-bar-map nil
210 "Keymap for MH-Folder tool bar.")
211
212(defvar mh-inc-spool-map (make-sparse-keymap)
213 "Keymap for MH-E's mh-inc-spool commands.")
214
215(defvar mh-letter-mode-map (copy-keymap text-mode-map)
216 "Keymap for MH-Letter mode.")
217
218(defvar mh-letter-tool-bar-map nil
219 "Keymap for MH-Letter tool bar.")
220
221(defvar mh-search-mode-map (make-sparse-keymap)
222 "Keymap for MH-Search mode.")
223
224(defvar mh-show-mode-map (make-sparse-keymap)
225 "Keymap MH-Show mode.")
226
227(defvar mh-show-seq-tool-bar-map nil
228 "Keymap for MH-Show tool bar.")
229
230(defvar mh-show-tool-bar-map nil
231 "Keymap for MH-Show tool bar.")
232
233;; MH-Folder Locals (alphabetical)
c26cf6c8 234
d1699462
BW
235(defvar mh-arrow-marker nil
236 "Marker for arrow display in fringe.")
237
dda00b2c
BW
238(defvar mh-colors-available-flag nil
239 "Non-nil means colors are available.")
240
241(defvar mh-current-folder nil
242 "Name of current folder, a string.")
243
d1699462
BW
244(defvar mh-delete-list nil
245 "List of message numbers to delete.
2dcf34f9
BW
246This variable can be used by
247`mh-before-commands-processed-hook'.")
3d7ca223 248
dda00b2c
BW
249(defvar mh-folder-view-stack nil
250 "Stack of previous folder views.")
251
252(defvar mh-index-data nil
253 "Info about index search results.")
254
255(defvar mh-index-previous-search nil)
256
257(defvar mh-index-msg-checksum-map nil)
258
259(defvar mh-index-checksum-origin-map nil)
260
261(defvar mh-index-sequence-search-flag nil)
262
263(defvar mh-mode-line-annotation nil
264 "Message range displayed in buffer.")
265
266(defvar mh-next-direction 'forward
267 "Direction to move to next message.")
268
269(defvar mh-previous-window-config nil
270 "Window configuration before MH-E command.")
271
d1699462
BW
272(defvar mh-refile-list nil
273 "List of folder names in `mh-seq-list'.
2dcf34f9
BW
274This variable can be used by
275`mh-before-commands-processed-hook'.")
c26cf6c8 276
dda00b2c
BW
277(defvar mh-seen-list nil
278 "List of displayed messages to be removed from the \"Unseen\" sequence.")
c26cf6c8 279
dda00b2c
BW
280(defvar mh-seq-list nil
281 "Alist of this folder's sequences.
282Elements have the form (SEQUENCE . MESSAGES).")
283
284(defvar mh-sequence-notation-history nil
285 "Remember original notation that is overwritten by `mh-note-seq'.")
286
287(defvar mh-show-buffer nil
288 "Buffer that displays message for this folder.")
2953de8c 289
56eb0904
SM
290(define-minor-mode mh-showing-mode
291 "Minor mode to show the message in a separate window."
292 ;; FIXME: maybe this should be moved to mh-show.el.
293 :lighter " Show")
dda00b2c
BW
294
295(defvar mh-view-ops nil
d1699462
BW
296 "Stack of operations that change the folder view.
297These operations include narrowing or threading.")
c26cf6c8 298
dda00b2c 299;; MH-Show Locals (alphabetical)
d1699462 300
dda00b2c
BW
301(defvar mh-globals-hash (make-hash-table)
302 "Keeps track of MIME data on a per buffer basis.")
c26cf6c8 303
dda00b2c
BW
304(defvar mh-show-folder-buffer nil
305 "Keeps track of folder whose message is being displayed.")
c3d9274a 306
dda00b2c 307;; MH-Letter Locals
c26cf6c8 308
dda00b2c
BW
309(defvar mh-folders-changed nil
310 "Lists which folders were affected by deletes and refiles.
311This list will always include the current folder
312`mh-current-folder'. This variable can be used by
313`mh-after-commands-processed-hook'.")
c26cf6c8 314
dda00b2c
BW
315(defvar mh-mail-header-separator "--------"
316 "*Line used by MH to separate headers from text in messages being composed.
c26cf6c8 317
dda00b2c
BW
318This variable should not be used directly in programs. Programs
319should use `mail-header-separator' instead.
320`mail-header-separator' is initialized to
321`mh-mail-header-separator' in `mh-letter-mode'; in other
322contexts, you may have to perform this initialization yourself.
a66894d8 323
dda00b2c
BW
324Do not make this a regular expression as it may be the argument
325to `insert' and it is passed through `regexp-quote' before being
326used by functions like `re-search-forward'.")
f0d73c14 327
dda00b2c
BW
328(defvar mh-sent-from-folder nil
329 "Folder of msg assoc with this letter.")
cee9f5c6 330
dda00b2c
BW
331(defvar mh-sent-from-msg nil
332 "Number of msg assoc with this letter.")
a1b4049d 333
dda00b2c 334;; Sequences
c26cf6c8 335
dda00b2c
BW
336(defvar mh-unseen-seq nil
337 "Cached value of the \"Unseen-Sequence:\" MH profile component.
338Name of the Unseen sequence.")
c26cf6c8 339
dda00b2c
BW
340(defvar mh-previous-seq nil
341 "Cached value of the \"Previous-Sequence:\" MH profile component.
342Name of the Previous sequence.")
2dcf34f9 343
dda00b2c 344;; Etc. (alphabetical)
c26cf6c8 345
dda00b2c
BW
346(defvar mh-flists-present-flag nil
347 "Non-nil means that we have \"flists\".")
2dcf34f9 348
dda00b2c
BW
349(defvar mh-index-data-file ".mhe_index"
350 "MH-E specific file where index seach info is stored.")
c26cf6c8 351
dda00b2c 352(defvar mh-letter-header-field-regexp "^\\([A-Za-z][A-Za-z0-9-]*\\):")
c26cf6c8 353
dda00b2c
BW
354(defvar mh-page-to-next-msg-flag nil
355 "Non-nil means next SPC or whatever goes to next undeleted message.")
c26cf6c8 356
dda00b2c
BW
357(defvar mh-pgp-support-flag (not (not (locate-library "mml2015")))
358 "Non-nil means PGP support is available.")
553fb735 359
dda00b2c
BW
360(defvar mh-signature-separator "-- \n"
361 "Text of a signature separator.
bdcfe844 362
dda00b2c
BW
363A signature separator is used to separate the body of a message
364from the signature. This can be used by user agents such as MH-E
365to render the signature differently or to suppress the inclusion
366of the signature in a reply. Use `mh-signature-separator-regexp'
367when searching for a separator.")
553fb735 368
dda00b2c
BW
369(defvar mh-signature-separator-regexp "^-- $"
370 "This regular expression matches the signature separator.
371See `mh-signature-separator'.")
553fb735 372
dda00b2c
BW
373(defvar mh-thread-scan-line-map nil
374 "Map of message index to various parts of the scan line.")
375(make-variable-buffer-local 'mh-thread-scan-line-map)
bdcfe844 376
dda00b2c
BW
377(defvar mh-thread-scan-line-map-stack nil
378 "Old map of message index to various parts of the scan line.
379This is the original map that is stored when the folder is
380narrowed.")
381(make-variable-buffer-local 'mh-thread-scan-line-map-stack)
553fb735 382
dda00b2c
BW
383(defvar mh-x-mailer-string nil
384 "*String containing the contents of the X-Mailer header field.
385If nil, this variable is initialized to show the version of MH-E,
386Emacs, and MH the first time a message is composed.")
553fb735 387
dda00b2c 388\f
553fb735 389
dda00b2c 390;;; MH-E Entry Points
c3d9274a
BW
391
392(eval-when-compile (require 'gnus))
393
394(defmacro mh-macro-expansion-time-gnus-version ()
395 "Return Gnus version available at macro expansion time.
2dcf34f9
BW
396The macro evaluates the Gnus version at macro expansion time. If
397MH-E was compiled then macro expansion happens at compile time."
398gnus-version)
c3d9274a
BW
399
400(defun mh-run-time-gnus-version ()
401 "Return Gnus version available at run time."
402 (require 'gnus)
403 gnus-version)
404
847b8219 405;;;###autoload
c26cf6c8 406(defun mh-version ()
bdcfe844 407 "Display version information about MH-E and the MH mail handling system."
c26cf6c8 408 (interactive)
3d7ca223 409 (set-buffer (get-buffer-create mh-info-buffer))
c26cf6c8 410 (erase-buffer)
c3d9274a
BW
411 ;; MH-E version.
412 (insert "MH-E " mh-version "\n\n")
413 ;; MH-E compilation details.
414 (insert "MH-E compilation details:\n")
415 (let* ((compiled-mhe (byte-code-function-p (symbol-function 'mh-version)))
416 (gnus-compiled-version (if compiled-mhe
417 (mh-macro-expansion-time-gnus-version)
418 "N/A")))
419 (insert " Byte compiled:\t\t" (if compiled-mhe "yes" "no") "\n"
420 " Gnus (compile-time):\t" gnus-compiled-version "\n"
421 " Gnus (run-time):\t" (mh-run-time-gnus-version) "\n\n"))
422 ;; Emacs version.
423 (insert (emacs-version) "\n\n")
a1b4049d 424 ;; MH version.
f0d73c14
BW
425 (if mh-variant-in-use
426 (insert mh-variant-in-use "\n"
427 " mh-progs:\t" mh-progs "\n"
428 " mh-lib:\t" mh-lib "\n"
429 " mh-lib-progs:\t" mh-lib-progs "\n\n")
430 (insert "No MH variant detected\n"))
a1b4049d
BW
431 ;; Linux version.
432 (condition-case ()
433 (call-process "uname" nil t nil "-a")
434 (file-error))
435 (goto-char (point-min))
3d7ca223 436 (display-buffer mh-info-buffer))
c26cf6c8 437
dda00b2c
BW
438\f
439
440;;; Support Routines
441
442(defun mh-list-to-string (l)
443 "Flatten the list L and make every element of the new list into a string."
444 (nreverse (mh-list-to-string-1 l)))
445
446(defun mh-list-to-string-1 (l)
447 "Flatten the list L and make every element of the new list into a string."
8d1ada53
BW
448 (let (new-list)
449 (dolist (element l)
450 (cond ((null element))
451 ((symbolp element)
452 (push (symbol-name element) new-list))
453 ((numberp element)
454 (push (int-to-string element) new-list))
455 ((equal element ""))
456 ((stringp element)
457 (push element new-list))
458 ((listp element)
459 (setq new-list (nconc (mh-list-to-string-1 element) new-list)))
460 (t
461 (error "Bad element: %s" element))))
dda00b2c 462 new-list))
847b8219 463
c26cf6c8
RS
464\f
465
dda00b2c
BW
466;;; MH-E Process Support
467
468(defvar mh-index-max-cmdline-args 500
469 "Maximum number of command line args.")
c26cf6c8 470
dda00b2c
BW
471(defun mh-xargs (cmd &rest args)
472 "Partial imitation of xargs.
473The current buffer contains a list of strings, one on each line.
474The function will execute CMD with ARGS and pass the first
475`mh-index-max-cmdline-args' strings to it. This is repeated till
476all the strings have been used."
477 (goto-char (point-min))
478 (let ((current-buffer (current-buffer)))
479 (with-temp-buffer
480 (let ((out (current-buffer)))
481 (set-buffer current-buffer)
482 (while (not (eobp))
483 (let ((arg-list (reverse args))
484 (count 0))
485 (while (and (not (eobp)) (< count mh-index-max-cmdline-args))
d5dc8c56
BW
486 (push (buffer-substring-no-properties (point)
487 (mh-line-end-position))
dda00b2c
BW
488 arg-list)
489 (incf count)
490 (forward-line))
491 (apply #'call-process cmd nil (list out nil) nil
492 (nreverse arg-list))))
493 (erase-buffer)
494 (insert-buffer-substring out)))))
495
496;; XXX This should be applied anywhere MH-E calls out to /bin/sh.
497(defun mh-quote-for-shell (string)
498 "Quote STRING for /bin/sh.
499Adds double-quotes around entire string and quotes the characters
500\\, `, and $ with a backslash."
501 (concat "\""
502 (loop for x across string
503 concat (format (if (memq x '(?\\ ?` ?$)) "\\%c" "%c") x))
504 "\""))
505
506(defun mh-exec-cmd (command &rest args)
507 "Execute mh-command COMMAND with ARGS.
508The side effects are what is desired. Any output is assumed to be
509an error and is shown to the user. The output is not read or
510parsed by MH-E."
b5553d47 511 (with-current-buffer (get-buffer-create mh-log-buffer)
dda00b2c
BW
512 (let* ((initial-size (mh-truncate-log-buffer))
513 (start (point))
514 (args (mh-list-to-string args)))
515 (apply 'call-process (expand-file-name command mh-progs) nil t nil args)
516 (when (> (buffer-size) initial-size)
517 (save-excursion
518 (goto-char start)
519 (insert "Errors when executing: " command)
520 (loop for arg in args do (insert " " arg))
521 (insert "\n"))
522 (save-window-excursion
523 (switch-to-buffer-other-window mh-log-buffer)
524 (sit-for 5))))))
525
526(defun mh-exec-cmd-error (env command &rest args)
527 "In environment ENV, execute mh-command COMMAND with ARGS.
528ENV is nil or a string of space-separated \"var=value\" elements.
529Signals an error if process does not complete successfully."
b5553d47 530 (with-current-buffer (get-buffer-create mh-temp-buffer)
dda00b2c
BW
531 (erase-buffer)
532 (let ((process-environment process-environment))
533 ;; XXX: We should purge the list that split-string returns of empty
534 ;; strings. This can happen in XEmacs if leading or trailing spaces
535 ;; are present.
536 (dolist (elem (if (stringp env) (split-string env " ") ()))
537 (push elem process-environment))
538 (mh-handle-process-error
539 command (apply #'call-process (expand-file-name command mh-progs)
540 nil t nil (mh-list-to-string args))))))
541
542(defun mh-exec-cmd-daemon (command filter &rest args)
543 "Execute MH command COMMAND in the background.
544
545If FILTER is non-nil then it is used to process the output
546otherwise the default filter `mh-process-daemon' is used. See
547`set-process-filter' for more details of FILTER.
548
549ARGS are passed to COMMAND as command line arguments."
b5553d47 550 (with-current-buffer (get-buffer-create mh-log-buffer)
dda00b2c
BW
551 (mh-truncate-log-buffer))
552 (let* ((process-connection-type nil)
553 (process (apply 'start-process
554 command nil
555 (expand-file-name command mh-progs)
556 (mh-list-to-string args))))
557 (set-process-filter process (or filter 'mh-process-daemon))
558 process))
559
560(defun mh-exec-cmd-env-daemon (env command filter &rest args)
c76608f0 561 "In environment ENV, execute mh-command COMMAND in the background.
dda00b2c
BW
562
563ENV is nil or a string of space-separated \"var=value\" elements.
564Signals an error if process does not complete successfully.
565
566If FILTER is non-nil then it is used to process the output
567otherwise the default filter `mh-process-daemon' is used. See
568`set-process-filter' for more details of FILTER.
569
570ARGS are passed to COMMAND as command line arguments."
571 (let ((process-environment process-environment))
572 (dolist (elem (if (stringp env) (split-string env " ") ()))
573 (push elem process-environment))
574 (apply #'mh-exec-cmd-daemon command filter args)))
575
576(defun mh-process-daemon (process output)
577 "PROCESS daemon that puts OUTPUT into a temporary buffer.
578Any output from the process is displayed in an asynchronous
579pop-up window."
580 (with-current-buffer (get-buffer-create mh-log-buffer)
581 (insert-before-markers output)
582 (display-buffer mh-log-buffer)))
583
584(defun mh-exec-cmd-quiet (raise-error command &rest args)
585 "Signal RAISE-ERROR if COMMAND with ARGS fails.
586Execute MH command COMMAND with ARGS. ARGS is a list of strings.
587Return at start of mh-temp buffer, where output can be parsed and
588used.
589Returns value of `call-process', which is 0 for success, unless
590RAISE-ERROR is non-nil, in which case an error is signaled if
591`call-process' returns non-0."
592 (set-buffer (get-buffer-create mh-temp-buffer))
593 (erase-buffer)
594 (let ((value
595 (apply 'call-process
596 (expand-file-name command mh-progs) nil t nil
597 args)))
598 (goto-char (point-min))
599 (if raise-error
600 (mh-handle-process-error command value)
601 value)))
602
603(defun mh-exec-cmd-output (command display &rest args)
604 "Execute MH command COMMAND with DISPLAY flag and ARGS.
605Put the output into buffer after point.
606Set mark after inserted text.
607Output is expected to be shown to user, not parsed by MH-E."
608 (push-mark (point) t)
609 (apply 'call-process
610 (expand-file-name command mh-progs) nil t display
611 (mh-list-to-string args))
612
613 ;; The following is used instead of 'exchange-point-and-mark because the
614 ;; latter activates the current region (between point and mark), which
615 ;; turns on highlighting. So prior to this bug fix, doing "inc" would
616 ;; highlight a region containing the new messages, which is undesirable.
617 ;; The bug wasn't seen in emacs21 but still occurred in XEmacs21.4.
618 (mh-exchange-point-and-mark-preserving-active-mark))
619
620;; Shush compiler.
42f8c37f 621(defvar mark-active) ; XEmacs
dda00b2c
BW
622
623(defun mh-exchange-point-and-mark-preserving-active-mark ()
624 "Put the mark where point is now, and point where the mark is now.
625This command works even when the mark is not active, and
626preserves whether the mark is active or not."
627 (interactive nil)
628 (let ((is-active (and (boundp 'mark-active) mark-active)))
629 (let ((omark (mark t)))
630 (if (null omark)
631 (error "No mark set in this buffer"))
632 (set-mark (point))
633 (goto-char omark)
634 (if (boundp 'mark-active)
635 (setq mark-active is-active))
636 nil)))
637
638(defun mh-exec-lib-cmd-output (command &rest args)
639 "Execute MH library command COMMAND with ARGS.
640Put the output into buffer after point.
641Set mark after inserted text."
642 (apply 'mh-exec-cmd-output (expand-file-name command mh-lib-progs) nil args))
643
644(defun mh-handle-process-error (command status)
645 "Raise error if COMMAND returned non-zero STATUS, otherwise return STATUS."
646 (if (equal status 0)
647 status
648 (goto-char (point-min))
649 (insert (if (integerp status)
650 (format "%s: exit code %d\n" command status)
651 (format "%s: %s\n" command status)))
b5553d47
SM
652 (let ((error-message (buffer-substring (point-min) (point-max))))
653 (with-current-buffer (get-buffer-create mh-log-buffer)
dda00b2c
BW
654 (mh-truncate-log-buffer)
655 (insert error-message)))
656 (error "%s failed, check buffer %s for error message"
657 command mh-log-buffer)))
658
659\f
660
fde155f4
BW
661;;; MH-E Customization Support Routines
662
663;; Shush compiler (Emacs 21 and XEmacs).
664(defvar customize-package-emacs-version-alist)
665
666;; Temporary function and data structure used customization.
667;; These will be unbound after the options are defined.
668(defmacro mh-strip-package-version (args)
669 "Strip :package-version keyword and its value from ARGS.
670In Emacs versions that support the :package-version keyword,
671ARGS is returned unchanged."
672 `(if (boundp 'customize-package-emacs-version-alist)
673 ,args
674 (let (seen)
675 (loop for keyword in ,args
676 if (cond ((eq keyword ':package-version) (setq seen t) nil)
677 (seen (setq seen nil) nil)
678 (t t))
679 collect keyword))))
680
c90c4cf1 681(defmacro defgroup-mh (symbol members doc &rest args)
fde155f4
BW
682 "Declare SYMBOL as a customization group containing MEMBERS.
683See documentation for `defgroup' for a description of the arguments
684SYMBOL, MEMBERS, DOC and ARGS.
685This macro is used by Emacs versions that lack the :package-version
686keyword, introduced in Emacs 22."
687 (declare (doc-string 3))
688 `(defgroup ,symbol ,members ,doc ,@(mh-strip-package-version args)))
c90c4cf1 689(put 'defgroup-mh 'lisp-indent-function 'defun)
fde155f4 690
c90c4cf1 691(defmacro defcustom-mh (symbol value doc &rest args)
fde155f4
BW
692 "Declare SYMBOL as a customizable variable that defaults to VALUE.
693See documentation for `defcustom' for a description of the arguments
694SYMBOL, VALUE, DOC and ARGS.
695This macro is used by Emacs versions that lack the :package-version
696keyword, introduced in Emacs 22."
697 (declare (doc-string 3))
698 `(defcustom ,symbol ,value ,doc ,@(mh-strip-package-version args)))
c90c4cf1 699(put 'defcustom-mh 'lisp-indent-function 'defun)
fde155f4 700
c90c4cf1 701(defmacro defface-mh (face spec doc &rest args)
fde155f4
BW
702 "Declare FACE as a customizable face that defaults to SPEC.
703See documentation for `defface' for a description of the arguments
704FACE, SPEC, DOC and ARGS.
705This macro is used by Emacs versions that lack the :package-version
706keyword, introduced in Emacs 22."
707 (declare (doc-string 3))
708 `(defface ,face ,spec ,doc ,@(mh-strip-package-version args)))
c90c4cf1 709(put 'defface-mh 'lisp-indent-function 'defun)
fde155f4
BW
710
711\f
712
dda00b2c
BW
713;;; Variant Support
714
c90c4cf1 715(defcustom-mh mh-path nil
dda00b2c
BW
716 "*Additional list of directories to search for MH.
717See `mh-variant'."
718 :group 'mh-e
fde155f4 719 :type '(repeat (directory))
7bf0295e 720 :package-version '(MH-E . "8.0"))
dda00b2c
BW
721
722(defun mh-variants ()
723 "Return a list of installed variants of MH on the system.
724This function looks for MH in `mh-sys-path', `mh-path' and
725`exec-path'. The format of the list of variants that is returned
726is described by the variable `mh-variants'."
727 (if mh-variants
728 mh-variants
729 (let ((list-unique))
730 ;; Make a unique list of directories, keeping the given order.
731 ;; We don't want the same MH variant to be listed multiple times.
732 (loop for dir in (append mh-path mh-sys-path exec-path) do
733 (setq dir (file-chase-links (directory-file-name dir)))
734 (add-to-list 'list-unique dir))
735 (loop for dir in (nreverse list-unique) do
736 (when (and dir (file-directory-p dir) (file-readable-p dir))
737 (let ((variant (mh-variant-info dir)))
738 (if variant
739 (add-to-list 'mh-variants variant)))))
740 mh-variants)))
741
742(defun mh-variant-info (dir)
743 "Return MH variant found in DIR, or nil if none present."
b5553d47
SM
744 (let ((tmp-buffer (get-buffer-create mh-temp-buffer)))
745 (with-current-buffer tmp-buffer
dda00b2c
BW
746 (cond
747 ((mh-variant-mh-info dir))
748 ((mh-variant-nmh-info dir))
efa47761 749 ((mh-variant-gnu-mh-info dir))))))
dda00b2c
BW
750
751(defun mh-variant-mh-info (dir)
efa47761 752 "Return info for MH variant in DIR assuming a temporary buffer is set up."
dda00b2c
BW
753 ;; MH does not have the -version option.
754 ;; Its version number is included in the output of "-help" as:
755 ;;
756 ;; version: MH 6.8.4 #2[UCI] (burrito) of Fri Jan 15 20:01:39 EST 1999
757 ;; options: [ATHENA] [BIND] [DUMB] [LIBLOCKFILE] [LOCALE] [MAILGROUP] [MHE]
758 ;; [MHRC] [MIME] [MORE='"/usr/bin/sensible-pager"'] [NLINK_HACK]
759 ;; [NORUSERPASS] [OVERHEAD] [POP] [POPSERVICE='"pop-3"'] [RENAME]
760 ;; [RFC1342] [RPATHS] [RPOP] [SENDMTS] [SMTP] [SOCKETS]
761 ;; [SPRINTFTYPE=int] [SVR4] [SYS5] [SYS5DIR] [TERMINFO]
762 ;; [TYPESIG=void] [UNISTD] [UTK] [VSPRINTF]
763 (let ((mhparam (expand-file-name "mhparam" dir)))
764 (when (mh-file-command-p mhparam)
765 (erase-buffer)
766 (call-process mhparam nil '(t nil) nil "-help")
767 (goto-char (point-min))
768 (when (search-forward-regexp "version: MH \\(\\S +\\)" nil t)
769 (let ((version (format "MH %s" (match-string 1))))
770 (erase-buffer)
771 (call-process mhparam nil '(t nil) nil "libdir")
772 (goto-char (point-min))
773 (when (search-forward-regexp "^.*$" nil t)
774 (let ((libdir (match-string 0)))
775 `(,version
776 (variant mh)
777 (mh-lib-progs ,libdir)
778 (mh-lib ,libdir)
779 (mh-progs ,dir)
780 (flists nil)))))))))
781
efa47761
BW
782(defun mh-variant-gnu-mh-info (dir)
783 "Return info for GNU mailutils MH variant in DIR.
784This assumes that a temporary buffer is set up."
dda00b2c
BW
785 ;; 'mhparam -version' output:
786 ;; mhparam (GNU mailutils 0.3.2)
787 (let ((mhparam (expand-file-name "mhparam" dir)))
788 (when (mh-file-command-p mhparam)
789 (erase-buffer)
790 (call-process mhparam nil '(t nil) nil "-version")
791 (goto-char (point-min))
792 (when (search-forward-regexp "mhparam (\\(GNU [Mm]ailutils \\S +\\))"
793 nil t)
794 (let ((version (match-string 1))
795 (mh-progs dir))
796 `(,version
efa47761 797 (variant gnu-mh)
dda00b2c
BW
798 (mh-lib-progs ,(mh-profile-component "libdir"))
799 (mh-lib ,(mh-profile-component "etcdir"))
800 (mh-progs ,dir)
801 (flists ,(file-exists-p
802 (expand-file-name "flists" dir)))))))))
803
804(defun mh-variant-nmh-info (dir)
efa47761 805 "Return info for nmh variant in DIR assuming a temporary buffer is set up."
dda00b2c
BW
806 ;; `mhparam -version' outputs:
807 ;; mhparam -- nmh-1.1-RC1 [compiled on chaak at Fri Jun 20 11:03:28 PDT 2003]
808 (let ((mhparam (expand-file-name "mhparam" dir)))
809 (when (mh-file-command-p mhparam)
810 (erase-buffer)
811 (call-process mhparam nil '(t nil) nil "-version")
812 (goto-char (point-min))
813 (when (search-forward-regexp "mhparam -- nmh-\\(\\S +\\)" nil t)
814 (let ((version (format "nmh %s" (match-string 1)))
815 (mh-progs dir))
816 `(,version
817 (variant nmh)
818 (mh-lib-progs ,(mh-profile-component "libdir"))
819 (mh-lib ,(mh-profile-component "etcdir"))
820 (mh-progs ,dir)
821 (flists ,(file-exists-p
822 (expand-file-name "flists" dir)))))))))
823
824(defun mh-file-command-p (file)
825 "Return t if file FILE is the name of a executable regular file."
826 (and (file-regular-p file) (file-executable-p file)))
827
828(defun mh-variant-set-variant (variant)
efa47761 829 "Set up the system variables for the MH variant named VARIANT.
dda00b2c
BW
830If VARIANT is a string, use that key in the alist returned by the
831function `mh-variants'.
832If VARIANT is a symbol, select the first entry that matches that
833variant."
834 (cond
835 ((stringp variant) ;e.g. "nmh 1.1-RC1"
836 (when (assoc variant (mh-variants))
837 (let* ((alist (cdr (assoc variant (mh-variants))))
838 (lib-progs (cadr (assoc 'mh-lib-progs alist)))
839 (lib (cadr (assoc 'mh-lib alist)))
840 (progs (cadr (assoc 'mh-progs alist)))
841 (flists (cadr (assoc 'flists alist))))
842 ;;(set-default mh-variant variant)
843 (setq mh-x-mailer-string nil
844 mh-flists-present-flag flists
845 mh-lib-progs lib-progs
846 mh-lib lib
847 mh-progs progs
848 mh-variant-in-use variant))))
849 ((symbolp variant) ;e.g. 'nmh (pick the first match)
850 (loop for variant-list in (mh-variants)
851 when (eq variant (cadr (assoc 'variant (cdr variant-list))))
852 return (let* ((version (car variant-list))
853 (alist (cdr variant-list))
854 (lib-progs (cadr (assoc 'mh-lib-progs alist)))
855 (lib (cadr (assoc 'mh-lib alist)))
856 (progs (cadr (assoc 'mh-progs alist)))
857 (flists (cadr (assoc 'flists alist))))
858 ;;(set-default mh-variant flavor)
859 (setq mh-x-mailer-string nil
860 mh-flists-present-flag flists
861 mh-lib-progs lib-progs
862 mh-lib lib
863 mh-progs progs
864 mh-variant-in-use version)
865 t)))))
866
867(defun mh-variant-p (&rest variants)
868 "Return t if variant is any of VARIANTS.
efa47761 869Currently known variants are 'MH, 'nmh, and 'gnu-mh."
dda00b2c
BW
870 (let ((variant-in-use
871 (cadr (assoc 'variant (assoc mh-variant-in-use (mh-variants))))))
872 (not (null (member variant-in-use variants)))))
873
874(defun mh-profile-component (component)
875 "Return COMPONENT value from mhparam, or nil if unset."
876 (save-excursion
efa47761
BW
877 ;; MH and nmh use -components, GNU mailutils MH uses -component.
878 ;; Since MH and nmh work with an unambiguous prefix, the `s' is
879 ;; dropped here.
0c32f8c6 880 (mh-exec-cmd-quiet nil "mhparam" "-component" component)
dda00b2c
BW
881 (mh-profile-component-value component)))
882
883(defun mh-profile-component-value (component)
884 "Find and return the value of COMPONENT in the current buffer.
885Returns nil if the component is not in the buffer."
886 (let ((case-fold-search t))
887 (goto-char (point-min))
888 (cond ((not (re-search-forward (format "^%s:" component) nil t)) nil)
889 ((looking-at "[\t ]*$") nil)
3d7ca223 890 (t
dda00b2c
BW
891 (re-search-forward "[\t ]*\\([^\t \n].*\\)$" nil t)
892 (let ((start (match-beginning 1)))
893 (end-of-line)
894 (buffer-substring start (point)))))))
895
896(defun mh-variant-set (variant)
897 "Set the MH variant to VARIANT.
898Sets `mh-progs', `mh-lib', `mh-lib-progs' and
899`mh-flists-present-flag'.
900If the VARIANT is \"autodetect\", then first try nmh, then MH and
efa47761 901finally GNU mailutils MH."
dda00b2c
BW
902 (interactive
903 (list (completing-read
904 "MH variant: "
905 (mapcar (lambda (x) (list (car x))) (mh-variants))
906 nil t)))
efa47761
BW
907
908 ;; TODO Remove mu-mh backwards compatibility in 9.0.
909 (when (and (stringp variant)
910 (string-match "^mu-mh" variant))
911 (message
6807fdff 912 (format "%s\n%s; %s" "The variant name mu-mh has been renamed to gnu-mh"
efa47761
BW
913 "and will be removed in MH-E 9.0"
914 "try M-x customize-option mh-variant"))
915 (sit-for 5)
916 (setq variant (concat "gnu-mh" (substring variant (match-end 0)))))
917
dda00b2c
BW
918 (let ((valid-list (mapcar (lambda (x) (car x)) (mh-variants))))
919 (cond
920 ((eq variant 'none))
921 ((eq variant 'autodetect)
922 (cond
923 ((mh-variant-set-variant 'nmh)
924 (message "%s installed as MH variant" mh-variant-in-use))
925 ((mh-variant-set-variant 'mh)
926 (message "%s installed as MH variant" mh-variant-in-use))
efa47761 927 ((mh-variant-set-variant 'gnu-mh)
dda00b2c
BW
928 (message "%s installed as MH variant" mh-variant-in-use))
929 (t
930 (message "No MH variant found on the system"))))
931 ((member variant valid-list)
932 (when (not (mh-variant-set-variant variant))
933 (message "Warning: %s variant not found. Autodetecting..." variant)
934 (mh-variant-set 'autodetect)))
935 (t
efa47761
BW
936 (message "Unknown variant %s; use %s"
937 variant
dda00b2c
BW
938 (mapconcat '(lambda (x) (format "%s" (car x)))
939 (mh-variants) " or "))))))
940
c90c4cf1 941(defcustom-mh mh-variant 'autodetect
dda00b2c
BW
942 "*Specifies the variant used by MH-E.
943
944The default setting of this option is \"Auto-detect\" which means
945that MH-E will automatically choose the first of nmh, MH, or GNU
efa47761 946mailutils MH that it finds in the directories listed in
dda00b2c 947`mh-path' (which you can customize), `mh-sys-path', and
bc4c8031
BW
948`exec-path'. If MH-E can't find MH at all, you may have to
949customize `mh-path' and add the directory in which the command
950\"mhparam\" is located. If, on the other hand, you have both nmh
efa47761
BW
951and GNU mailutils MH installed (for example) and
952`mh-variant-in-use' was initialized to nmh but you want to use
953GNU mailutils MH, then you can set this option to \"gnu-mh\".
dda00b2c
BW
954
955When this variable is changed, MH-E resets `mh-progs', `mh-lib',
956`mh-lib-progs', `mh-flists-present-flag', and `mh-variant-in-use'
bc4c8031
BW
957accordingly. Prior to version 8, it was often necessary to set
958some of these variables in \"~/.emacs\"; now it is no longer
959necessary and can actually cause problems."
dda00b2c
BW
960 :type `(radio
961 (const :tag "Auto-detect" autodetect)
962 ,@(mapcar (lambda (x) `(const ,(car x))) (mh-variants)))
963 :set (lambda (symbol value)
964 (set-default symbol value) ;Done in mh-variant-set-variant!
965 (mh-variant-set value))
fde155f4 966 :group 'mh-e
7bf0295e 967 :package-version '(MH-E . "8.0"))
23347d76 968
23347d76
BW
969\f
970
dda00b2c 971;;; MH-E Customization
c26cf6c8 972
dda00b2c
BW
973;; All of the defgroups, defcustoms, and deffaces in MH-E are found
974;; here. This makes it possible to customize modules that aren't
975;; loaded yet. It also makes it easier to organize the customization
976;; groups.
a66894d8 977
dda00b2c
BW
978;; This section contains the following sub-sections:
979
980;; 1. MH-E Customization Groups
981
982;; These are the customization group definitions. Every group has a
983;; associated manual node. The ordering is alphabetical, except for
984;; the groups mh-faces and mh-hooks which are last .
985
986;; 2. MH-E Customization
987
988;; These are the actual customization variables. There is a
989;; sub-section for each group in the MH-E Customization Groups
990;; section, in the same order, separated by page breaks. Within
991;; each section, variables are sorted alphabetically.
992
993;; 3. Hooks
994
995;; All hooks must be placed in the mh-hook group; in addition, add
996;; the group associated with the manual node in which the hook is
997;; described. Since the mh-hook group appears near the end of this
998;; section, the hooks will appear at the end of these other groups.
999
1000;; 4. Faces
1001
1002;; All faces must be placed in the mh-faces group; in addition, add
1003;; the group associated with the manual node in which the face is
1004;; described. Since the mh-faces group appears near the end of this
1005;; section, the faces will appear at the end of these other groups.
1006
1007(defun mh-customize (&optional delete-other-windows-flag)
1008 "Customize MH-E variables.
1009If optional argument DELETE-OTHER-WINDOWS-FLAG is non-nil, other
1010windows in the frame are removed."
1011 (interactive "P")
1012 (customize-group 'mh-e)
1013 (when delete-other-windows-flag
1014 (delete-other-windows)))
c26cf6c8 1015
23347d76
BW
1016(if (boundp 'customize-package-emacs-version-alist)
1017 (add-to-list 'customize-package-emacs-version-alist
70a1d47e
BW
1018 '(MH-E ("6.0" . "22.1") ("6.1" . "22.1") ("7.0" . "22.1")
1019 ("7.1" . "22.1") ("7.2" . "22.1") ("7.3" . "22.1")
1020 ("7.4" . "22.1") ("8.0" . "22.1"))))
23347d76 1021
bdcfe844
BW
1022\f
1023
dda00b2c
BW
1024;;; MH-E Customization Groups
1025
c90c4cf1 1026(defgroup-mh mh-e nil
dda00b2c
BW
1027 "Emacs interface to the MH mail system.
1028MH is the Rand Mail Handler. Other implementations include nmh
1029and GNU mailutils."
1030 :link '(custom-manual "(mh-e)Top")
23347d76 1031 :group 'mail
70a1d47e 1032 :package-version '(MH-E . "8.0"))
dda00b2c 1033
c90c4cf1 1034(defgroup-mh mh-alias nil
dda00b2c
BW
1035 "Aliases."
1036 :link '(custom-manual "(mh-e)Aliases")
1037 :prefix "mh-alias-"
23347d76 1038 :group 'mh-e
70a1d47e 1039 :package-version '(MH-E . "7.1"))
dda00b2c 1040
c90c4cf1 1041(defgroup-mh mh-folder nil
dda00b2c
BW
1042 "Organizing your mail with folders."
1043 :prefix "mh-"
1044 :link '(custom-manual "(mh-e)Folders")
23347d76 1045 :group 'mh-e
70a1d47e 1046 :package-version '(MH-E . "7.1"))
dda00b2c 1047
c90c4cf1 1048(defgroup-mh mh-folder-selection nil
dda00b2c
BW
1049 "Folder selection."
1050 :prefix "mh-"
1051 :link '(custom-manual "(mh-e)Folder Selection")
23347d76 1052 :group 'mh-e
70a1d47e 1053 :package-version '(MH-E . "8.0"))
dda00b2c 1054
c90c4cf1 1055(defgroup-mh mh-identity nil
dda00b2c
BW
1056 "Identities."
1057 :link '(custom-manual "(mh-e)Identities")
1058 :prefix "mh-identity-"
23347d76 1059 :group 'mh-e
70a1d47e 1060 :package-version '(MH-E . "7.1"))
dda00b2c 1061
c90c4cf1 1062(defgroup-mh mh-inc nil
dda00b2c
BW
1063 "Incorporating your mail."
1064 :prefix "mh-inc-"
1065 :link '(custom-manual "(mh-e)Incorporating Mail")
23347d76 1066 :group 'mh-e
70a1d47e 1067 :package-version '(MH-E . "8.0"))
dda00b2c 1068
c90c4cf1 1069(defgroup-mh mh-junk nil
dda00b2c
BW
1070 "Dealing with junk mail."
1071 :link '(custom-manual "(mh-e)Junk")
1072 :prefix "mh-junk-"
23347d76 1073 :group 'mh-e
70a1d47e 1074 :package-version '(MH-E . "7.3"))
dda00b2c 1075
c90c4cf1 1076(defgroup-mh mh-letter nil
dda00b2c
BW
1077 "Editing a draft."
1078 :prefix "mh-"
1079 :link '(custom-manual "(mh-e)Editing Drafts")
23347d76 1080 :group 'mh-e
70a1d47e 1081 :package-version '(MH-E . "7.1"))
dda00b2c 1082
c90c4cf1 1083(defgroup-mh mh-ranges nil
dda00b2c
BW
1084 "Ranges."
1085 :prefix "mh-"
1086 :link '(custom-manual "(mh-e)Ranges")
23347d76 1087 :group 'mh-e
70a1d47e 1088 :package-version '(MH-E . "8.0"))
dda00b2c 1089
c90c4cf1 1090(defgroup-mh mh-scan-line-formats nil
dda00b2c
BW
1091 "Scan line formats."
1092 :link '(custom-manual "(mh-e)Scan Line Formats")
1093 :prefix "mh-"
23347d76 1094 :group 'mh-e
70a1d47e 1095 :package-version '(MH-E . "8.0"))
dda00b2c 1096
c90c4cf1 1097(defgroup-mh mh-search nil
dda00b2c
BW
1098 "Searching."
1099 :link '(custom-manual "(mh-e)Searching")
1100 :prefix "mh-search-"
23347d76 1101 :group 'mh-e
70a1d47e 1102 :package-version '(MH-E . "8.0"))
dda00b2c 1103
c90c4cf1 1104(defgroup-mh mh-sending-mail nil
dda00b2c
BW
1105 "Sending mail."
1106 :prefix "mh-"
1107 :link '(custom-manual "(mh-e)Sending Mail")
23347d76 1108 :group 'mh-e
70a1d47e 1109 :package-version '(MH-E . "8.0"))
dda00b2c 1110
c90c4cf1 1111(defgroup-mh mh-sequences nil
dda00b2c
BW
1112 "Sequences."
1113 :prefix "mh-"
1114 :link '(custom-manual "(mh-e)Sequences")
23347d76 1115 :group 'mh-e
70a1d47e 1116 :package-version '(MH-E . "8.0"))
dda00b2c 1117
c90c4cf1 1118(defgroup-mh mh-show nil
dda00b2c
BW
1119 "Reading your mail."
1120 :prefix "mh-"
1121 :link '(custom-manual "(mh-e)Reading Mail")
23347d76 1122 :group 'mh-e
70a1d47e 1123 :package-version '(MH-E . "7.1"))
dda00b2c 1124
c90c4cf1 1125(defgroup-mh mh-speedbar nil
dda00b2c
BW
1126 "The speedbar."
1127 :prefix "mh-speed-"
1128 :link '(custom-manual "(mh-e)Speedbar")
23347d76 1129 :group 'mh-e
70a1d47e 1130 :package-version '(MH-E . "8.0"))
dda00b2c 1131
c90c4cf1 1132(defgroup-mh mh-thread nil
dda00b2c
BW
1133 "Threading."
1134 :prefix "mh-thread-"
1135 :link '(custom-manual "(mh-e)Threading")
23347d76 1136 :group 'mh-e
70a1d47e 1137 :package-version '(MH-E . "8.0"))
dda00b2c 1138
c90c4cf1 1139(defgroup-mh mh-tool-bar nil
dda00b2c
BW
1140 "The tool bar"
1141 :link '(custom-manual "(mh-e)Tool Bar")
1142 :prefix "mh-"
23347d76 1143 :group 'mh-e
70a1d47e 1144 :package-version '(MH-E . "8.0"))
dda00b2c 1145
c90c4cf1 1146(defgroup-mh mh-hooks nil
dda00b2c
BW
1147 "MH-E hooks."
1148 :link '(custom-manual "(mh-e)Top")
1149 :prefix "mh-"
23347d76 1150 :group 'mh-e
70a1d47e 1151 :package-version '(MH-E . "7.1"))
dda00b2c 1152
c90c4cf1 1153(defgroup-mh mh-faces nil
dda00b2c
BW
1154 "Faces used in MH-E."
1155 :link '(custom-manual "(mh-e)Top")
1156 :prefix "mh-"
1157 :group 'faces
23347d76 1158 :group 'mh-e
70a1d47e 1159 :package-version '(MH-E . "7.1"))
bdcfe844
BW
1160
1161\f
1162
23347d76 1163;;; MH-E Customization
dda00b2c 1164
23347d76 1165;; See Variant Support, above, for mh-e group.
dda00b2c
BW
1166
1167;;; Aliases (:group 'mh-alias)
1168
c90c4cf1 1169(defcustom-mh mh-alias-completion-ignore-case-flag t
dda00b2c
BW
1170 "*Non-nil means don't consider case significant in MH alias completion.
1171
1172As MH ignores case in the aliases, so too does MH-E. However, you
1173may turn off this option to make case significant which can be
1174used to segregate completion of your aliases. You might use
1175lowercase for mailing lists and uppercase for people."
1176 :type 'boolean
23347d76 1177 :group 'mh-alias
70a1d47e 1178 :package-version '(MH-E . "7.1"))
dda00b2c 1179
c90c4cf1 1180(defcustom-mh mh-alias-expand-aliases-flag nil
dda00b2c
BW
1181 "*Non-nil means to expand aliases entered in the minibuffer.
1182
1183In other words, aliases entered in the minibuffer will be
1184expanded to the full address in the message draft. By default,
1185this expansion is not performed."
1186 :type 'boolean
23347d76 1187 :group 'mh-alias
70a1d47e 1188 :package-version '(MH-E . "7.1"))
dda00b2c 1189
c90c4cf1 1190(defcustom-mh mh-alias-flash-on-comma t
dda00b2c
BW
1191 "*Specify whether to flash address or warn on translation.
1192
1193This option controls the behavior when a [comma] is pressed while
1194entering aliases or addresses. The default setting flashes the
1195address associated with an address in the minibuffer briefly, but
1196does not display a warning if the alias is not found."
1197 :type '(choice (const :tag "Flash but Don't Warn If No Alias" t)
1198 (const :tag "Flash and Warn If No Alias" 1)
1199 (const :tag "Don't Flash Nor Warn If No Alias" nil))
23347d76 1200 :group 'mh-alias
70a1d47e 1201 :package-version '(MH-E . "7.1"))
dda00b2c 1202
c90c4cf1 1203(defcustom-mh mh-alias-insert-file nil
dda00b2c
BW
1204 "*Filename used to store a new MH-E alias.
1205
1206The default setting of this option is \"Use Aliasfile Profile
1207Component\". This option can also hold the name of a file or a
1208list a file names. If this option is set to a list of file names,
1209or the \"Aliasfile:\" profile component contains more than one file
1210name, MH-E will prompt for one of them when MH-E adds an alias."
1211 :type '(choice (const :tag "Use Aliasfile Profile Component" nil)
1212 (file :tag "Alias File")
1213 (repeat :tag "List of Alias Files" file))
23347d76 1214 :group 'mh-alias
70a1d47e 1215 :package-version '(MH-E . "7.1"))
dda00b2c 1216
c90c4cf1 1217(defcustom-mh mh-alias-insertion-location 'sorted
dda00b2c
BW
1218 "Specifies where new aliases are entered in alias files.
1219
1220This option is set to \"Alphabetical\" by default. If you organize
1221your alias file in other ways, then adding aliases to the \"Top\"
1222or \"Bottom\" of your alias file might be more appropriate."
1223 :type '(choice (const :tag "Alphabetical" sorted)
1224 (const :tag "Top" top)
1225 (const :tag "Bottom" bottom))
23347d76 1226 :group 'mh-alias
70a1d47e 1227 :package-version '(MH-E . "7.1"))
dda00b2c 1228
c90c4cf1 1229(defcustom-mh mh-alias-local-users t
1a9aa7df 1230 "*Non-nil means local users are added to alias completion.
dda00b2c
BW
1231
1232Aliases are created from \"/etc/passwd\" entries with a user ID
1233larger than a magical number, typically 200. This can be a handy
1234tool on a machine where you and co-workers exchange messages.
1235These aliases have the form \"local.first.last\" if a real name is
1236present in the password file. Otherwise, the alias will have the
1237form \"local.login\".
1238
1239If you're on a system with thousands of users you don't know, and
1240the loading of local aliases slows MH-E down noticeably, then
1241turn this option off.
1242
1243This option also takes a string which is executed to generate the
1244password file. For example, use \"ypcat passwd\" to obtain the
1245NIS password file."
1246 :type '(choice (boolean) (string))
23347d76 1247 :group 'mh-alias
70a1d47e 1248 :package-version '(MH-E . "7.1"))
dda00b2c 1249
c90c4cf1 1250(defcustom-mh mh-alias-local-users-prefix "local."
dda00b2c
BW
1251 "*String prefixed to the real names of users from the password file.
1252This option can also be set to \"Use Login\".
1253
1254For example, consider the following password file entry:
1255
1256 psg:x:1000:1000:Peter S Galbraith,,,:/home/psg:/bin/tcsh
1257
1258The following settings of this option will produce the associated
1259aliases:
1260
1261 \"local.\" local.peter.galbraith
1262 \"\" peter.galbraith
1263 Use Login psg
1264
1265This option has no effect if variable `mh-alias-local-users' is
1266turned off."
1267 :type '(choice (const :tag "Use Login" nil)
1268 (string))
23347d76 1269 :group 'mh-alias
70a1d47e 1270 :package-version '(MH-E . "7.4"))
dda00b2c 1271
c90c4cf1 1272(defcustom-mh mh-alias-passwd-gecos-comma-separator-flag t
dda00b2c
BW
1273 "*Non-nil means the gecos field in the password file uses a comma separator.
1274
1275In the example in `mh-alias-local-users-prefix', commas are used
1276to separate different values within the so-called gecos field.
1277This is a fairly common usage. However, in the rare case that the
1278gecos field in your password file is not separated by commas and
1279whose contents may contain commas, you can turn this option off."
1280 :type 'boolean
23347d76 1281 :group 'mh-alias
70a1d47e 1282 :package-version '(MH-E . "7.4"))
7094eefe 1283
dda00b2c
BW
1284;;; Organizing Your Mail with Folders (:group 'mh-folder)
1285
c90c4cf1 1286(defcustom-mh mh-new-messages-folders t
dda00b2c
BW
1287 "Folders searched for the \"unseen\" sequence.
1288
1289Set this option to \"Inbox\" to search the \"+inbox\" folder or
1290\"All\" to search all of the top level folders. Otherwise, list
1291the folders that should be searched with the \"Choose Folders\"
1292menu item.
1293
1294See also `mh-recursive-folders-flag'."
1295 :type '(choice (const :tag "Inbox" t)
1296 (const :tag "All" nil)
1297 (repeat :tag "Choose Folders" (string :tag "Folder")))
23347d76 1298 :group 'mh-folder
70a1d47e 1299 :package-version '(MH-E . "8.0"))
dda00b2c 1300
c90c4cf1 1301(defcustom-mh mh-ticked-messages-folders t
dda00b2c
BW
1302 "Folders searched for `mh-tick-seq'.
1303
1304Set this option to \"Inbox\" to search the \"+inbox\" folder or
1305\"All\" to search all of the top level folders. Otherwise, list
1306the folders that should be searched with the \"Choose Folders\"
1307menu item.
1308
1309See also `mh-recursive-folders-flag'."
1310 :type '(choice (const :tag "Inbox" t)
1311 (const :tag "All" nil)
1312 (repeat :tag "Choose Folders" (string :tag "Folder")))
23347d76 1313 :group 'mh-folder
70a1d47e 1314 :package-version '(MH-E . "8.0"))
dda00b2c 1315
c90c4cf1 1316(defcustom-mh mh-large-folder 200
dda00b2c
BW
1317 "The number of messages that indicates a large folder.
1318
1319If a folder is deemed to be large, that is the number of messages
1320in it exceed this value, then confirmation is needed when it is
1321visited. Even when `mh-show-threads-flag' is non-nil, the folder
1322is not automatically threaded, if it is large. If set to nil all
1323folders are treated as if they are small."
1324 :type '(choice (const :tag "No Limit") integer)
23347d76 1325 :group 'mh-folder
70a1d47e 1326 :package-version '(MH-E . "7.0"))
dda00b2c 1327
c90c4cf1 1328(defcustom-mh mh-recenter-summary-flag nil
dda00b2c
BW
1329 "*Non-nil means to recenter the summary window.
1330
1331If this option is turned on, recenter the summary window when the
1332show window is toggled off."
1333 :type 'boolean
23347d76 1334 :group 'mh-folder
70a1d47e 1335 :package-version '(MH-E . "7.0"))
dda00b2c 1336
c90c4cf1 1337(defcustom-mh mh-recursive-folders-flag nil
dda00b2c
BW
1338 "*Non-nil means that commands which operate on folders do so recursively."
1339 :type 'boolean
23347d76 1340 :group 'mh-folder
70a1d47e 1341 :package-version '(MH-E . "7.0"))
dda00b2c 1342
c90c4cf1 1343(defcustom-mh mh-sortm-args nil
dda00b2c
BW
1344 "*Additional arguments for \"sortm\"\\<mh-folder-mode-map>.
1345
1346This option is consulted when a prefix argument is used with
1347\\[mh-sort-folder]. Normally default arguments to \"sortm\" are
1348specified in the MH profile. This option may be used to provide
1349an alternate view. For example, \"'(\"-nolimit\" \"-textfield\"
1350\"subject\")\" is a useful setting."
1351 :type 'string
23347d76 1352 :group 'mh-folder
70a1d47e 1353 :package-version '(MH-E . "8.0"))
dda00b2c
BW
1354
1355;;; Folder Selection (:group 'mh-folder-selection)
1356
c90c4cf1 1357(defcustom-mh mh-default-folder-for-message-function nil
dda00b2c
BW
1358 "Function to select a default folder for refiling or \"Fcc:\".
1359
bc4c8031
BW
1360When this function is called, the current buffer contains the message
1361being refiled and point is at the start of the message. This function
1362should return the default folder as a string with a leading \"+\"
1363sign. It can also return nil so that the last folder name is used as
1364the default, or an empty string to suppress the default entirely."
dda00b2c 1365 :type 'function
23347d76 1366 :group 'mh-folder-selection
70a1d47e 1367 :package-version '(MH-E . "8.0"))
dda00b2c 1368
c90c4cf1 1369(defcustom-mh mh-default-folder-list nil
dda00b2c
BW
1370 "*List of addresses and folders.
1371
1372The folder name associated with the first address found in this
1373list is used as the default for `mh-refile-msg' and similar
1374functions. Each element in this list contains a \"Check Recipient\"
1375item. If this item is turned on, then the address is checked
1376against the recipient instead of the sender. This is useful for
1377mailing lists.
1378
1379See `mh-prompt-for-refile-folder' and `mh-folder-from-address'
1380for more information."
1381 :type '(repeat (list (regexp :tag "Address")
1382 (string :tag "Folder")
1383 (boolean :tag "Check Recipient")))
23347d76 1384 :group 'mh-folder-selection
70a1d47e 1385 :package-version '(MH-E . "7.2"))
dda00b2c 1386
c90c4cf1 1387(defcustom-mh mh-default-folder-must-exist-flag t
dda00b2c
BW
1388 "*Non-nil means guessed folder name must exist to be used.
1389
1390If the derived folder does not exist, and this option is on, then
1391the last folder name used is suggested. This is useful if you get
1392mail from various people for whom you have an alias, but file
1393them all in the same project folder.
1394
1395See `mh-prompt-for-refile-folder' and `mh-folder-from-address'
1396for more information."
1397 :type 'boolean
23347d76 1398 :group 'mh-folder-selection
70a1d47e 1399 :package-version '(MH-E . "7.2"))
dda00b2c 1400
c90c4cf1 1401(defcustom-mh mh-default-folder-prefix ""
dda00b2c
BW
1402 "*Prefix used for folder names generated from aliases.
1403The prefix is used to prevent clutter in your mail directory.
1404
1405See `mh-prompt-for-refile-folder' and `mh-folder-from-address'
1406for more information."
1407 :type 'string
23347d76 1408 :group 'mh-folder-selection
70a1d47e 1409 :package-version '(MH-E . "7.2"))
c26cf6c8 1410
dda00b2c
BW
1411;;; Identities (:group 'mh-identity)
1412
1413(eval-and-compile
1414 (unless (fboundp 'mh-identity-make-menu-no-autoload)
1415 (defun mh-identity-make-menu-no-autoload ()
1416 "Temporary definition.
1417Real definition will take effect when mh-identity is loaded."
1418 nil)))
1419
c90c4cf1 1420(defcustom-mh mh-identity-list nil
dda00b2c
BW
1421 "*List of identities.
1422
1423To customize this option, click on the \"INS\" button and enter a label
1424such as \"Home\" or \"Work\". Then click on the \"INS\" button with the
1425label \"Add at least one item below\". Then choose one of the items in
1426the \"Value Menu\".
1427
1428You can specify an alternate \"From:\" header field using the \"From
1429Field\" menu item. You must include a valid email address. A standard
1430format is \"First Last <login@@host.domain>\". If you use an initial
1431with a period, then you must quote your name as in '\"First I. Last\"
1432<login@@host.domain>'. People usually list the name of the company
1433where they work using the \"Organization Field\" menu item. Set any
1434arbitrary header field and value in the \"Other Field\" menu item.
1435Unless the header field is a standard one, precede the name of your
1436field's label with \"X-\", as in \"X-Fruit-of-the-Day:\". The value of
1437\"Attribution Verb\" overrides the setting of
1438`mh-extract-from-attribution-verb'. Set your signature with the
1439\"Signature\" menu item. You can specify the contents of
1440`mh-signature-file-name', a file, or a function. Specify a different
1441key to sign or encrypt messages with the \"GPG Key ID\" menu item.
1442
1443You can select the identities you have added via the menu called
1444\"Identity\" in the MH-Letter buffer. You can also use
1445\\[mh-insert-identity]. To clear the fields and signature added by the
1446identity, select the \"None\" identity.
1447
1448The \"Identity\" menu contains two other items to save you from having
1449to set the identity on every message. The menu item \"Set Default for
1450Session\" can be used to set the default identity to the current
1451identity until you exit Emacs. The menu item \"Save as Default\" sets
1452the option `mh-identity-default' to the current identity setting. You
1453can also customize the `mh-identity-default' option in the usual
1454fashion."
1455 :type '(repeat (list :tag ""
1456 (string :tag "Label")
1457 (repeat :tag "Add at least one item below"
1458 (choice
1459 (cons :tag "From Field"
1460 (const "From")
1461 (string :tag "Value"))
1462 (cons :tag "Organization Field"
1463 (const "Organization")
1464 (string :tag "Value"))
1465 (cons :tag "Other Field"
1466 (string :tag "Field")
1467 (string :tag "Value"))
1468 (cons :tag "Attribution Verb"
1469 (const ":attribution-verb")
1470 (string :tag "Value"))
1471 (cons :tag "Signature"
1472 (const :tag "Signature"
1473 ":signature")
1474 (choice
1475 (const :tag "mh-signature-file-name"
1476 nil)
1477 (file)
1478 (function)))
1479 (cons :tag "GPG Key ID"
1480 (const :tag "GPG Key ID"
1481 ":pgg-default-user-id")
1482 (string :tag "Value"))))))
1483 :set (lambda (symbol value)
1484 (set-default symbol value)
1485 (mh-identity-make-menu-no-autoload))
23347d76 1486 :group 'mh-identity
70a1d47e 1487 :package-version '(MH-E . "7.1"))
dda00b2c 1488
c90c4cf1 1489(defcustom-mh mh-auto-fields-list nil
dda00b2c
BW
1490 "List of recipients for which header lines are automatically inserted.
1491
1492This option can be used to set the identity depending on the
1493recipient. To customize this option, click on the \"INS\" button and
1494enter a regular expression for the recipient's address. Click on the
1495\"INS\" button with the \"Add at least one item below\" label. Then choose
1496one of the items in the \"Value Menu\".
1497
1498The \"Identity\" menu item is used to select an identity from those
1499configured in `mh-identity-list'. All of the information for that
1500identity will be added if the recipient matches. The \"Fcc Field\" menu
1501item is used to select a folder that is used in the \"Fcc:\" header.
1502When you send the message, MH will put a copy of your message in this
1503folder. The \"Mail-Followup-To Field\" menu item is used to insert an
1504\"Mail-Followup-To:\" header field with the recipients you provide. If
1505the recipient's mail user agent supports this header field (as nmh
1506does), then their replies will go to the addresses listed. This is
1507useful if their replies go both to the list and to you and you don't
1508have a mechanism to suppress duplicates. If you reply to someone not
1509on the list, you must either remove the \"Mail-Followup-To:\" field, or
1510ensure the recipient is also listed there so that he receives replies
1511to your reply. Other header fields may be added using the \"Other
1512Field\" menu item.
1513
1514These fields can only be added after the recipient is known. Once the
1515header contains one or more recipients, run the
1516\\[mh-insert-auto-fields] command or choose the \"Identity -> Insert
1517Auto Fields\" menu item to insert these fields manually. However, you
1518can just send the message and the fields will be added automatically.
1519You are given a chance to see these fields and to confirm them before
1520the message is actually sent. You can do away with this confirmation
1521by turning off the option `mh-auto-fields-prompt-flag'.
1522
1523You should avoid using the same header field in `mh-auto-fields-list'
1524and `mh-identity-list' definitions that may apply to the same message
1525as the result is undefined."
1526 :type `(repeat
1527 (list :tag ""
1528 (string :tag "Recipient")
1529 (repeat :tag "Add at least one item below"
1530 (choice
1531 (cons :tag "Identity"
1532 (const ":identity")
1533 ,(append
1534 '(radio)
1535 (mapcar
1536 (function (lambda (arg) `(const ,arg)))
1537 (mapcar 'car mh-identity-list))))
1538 (cons :tag "Fcc Field"
1539 (const "fcc")
1540 (string :tag "Value"))
1541 (cons :tag "Mail-Followup-To Field"
1542 (const "Mail-Followup-To")
1543 (string :tag "Value"))
1544 (cons :tag "Other Field"
1545 (string :tag "Field")
1546 (string :tag "Value"))))))
23347d76 1547 :group 'mh-identity
70a1d47e 1548 :package-version '(MH-E . "7.3"))
dda00b2c 1549
c90c4cf1 1550(defcustom-mh mh-auto-fields-prompt-flag t
dda00b2c
BW
1551 "*Non-nil means to prompt before sending if fields inserted.
1552See `mh-auto-fields-list'."
1553 :type 'boolean
23347d76 1554 :group 'mh-identity
70a1d47e 1555 :package-version '(MH-E . "8.0"))
dda00b2c 1556
c90c4cf1 1557(defcustom-mh mh-identity-default nil
dda00b2c
BW
1558 "Default identity to use when `mh-letter-mode' is called.
1559See `mh-identity-list'."
1560 :type (append
1561 '(radio)
1562 (cons '(const :tag "None" nil)
1563 (mapcar (function (lambda (arg) `(const ,arg)))
1564 (mapcar 'car mh-identity-list))))
23347d76 1565 :group 'mh-identity
70a1d47e 1566 :package-version '(MH-E . "7.1"))
dda00b2c 1567
c90c4cf1 1568(defcustom-mh mh-identity-handlers
dda00b2c
BW
1569 '(("From" . mh-identity-handler-top)
1570 (":default" . mh-identity-handler-bottom)
1571 (":attribution-verb" . mh-identity-handler-attribution-verb)
1572 (":signature" . mh-identity-handler-signature)
1573 (":pgg-default-user-id" . mh-identity-handler-gpg-identity))
1574 "Handler functions for fields in `mh-identity-list'.
1575
1576This option is used to change the way that fields, signatures,
1577and attributions in `mh-identity-list' are added. To customize
1578`mh-identity-handlers', replace the name of an existing handler
1579function associated with the field you want to change with the
1580name of a function you have written. You can also click on an
1581\"INS\" button and insert a field of your choice and the name of
1582the function you have written to handle it.
1583
1584The \"Field\" field can be any field that you've used in your
1585`mh-identity-list'. The special fields \":attribution-verb\",
1586\":signature\", or \":pgg-default-user-id\" are used for the
1587`mh-identity-list' choices \"Attribution Verb\", \"Signature\", and
1588\"GPG Key ID\" respectively.
1589
1590The handler associated with the \":default\" field is used when no
1591other field matches.
1592
1593The handler functions are passed two or three arguments: the
1594FIELD itself (for example, \"From\"), or one of the special
1595fields (for example, \":signature\"), and the ACTION 'remove or
1596'add. If the action is 'add, an additional argument
1597containing the VALUE for the field is given."
1598 :type '(repeat (cons (string :tag "Field") function))
23347d76 1599 :group 'mh-identity
70a1d47e 1600 :package-version '(MH-E . "8.0"))
dda00b2c
BW
1601
1602;;; Incorporating Your Mail (:group 'mh-inc)
1603
c90c4cf1 1604(defcustom-mh mh-inc-prog "inc"
dda00b2c
BW
1605 "*Program to incorporate new mail into a folder.
1606
1607This program generates a one-line summary for each of the new
1608messages. Unless it is an absolute pathname, the file is assumed
1609to be in the `mh-progs' directory. You may also link a file to
1610\"inc\" that uses a different format. You'll then need to modify
1611several scan line format variables appropriately."
1612 :type 'string
23347d76 1613 :group 'mh-inc
70a1d47e 1614 :package-version '(MH-E . "6.0"))
dda00b2c
BW
1615
1616(eval-and-compile
1617 (unless (fboundp 'mh-inc-spool-make-no-autoload)
1618 (defun mh-inc-spool-make-no-autoload ()
1619 "Temporary definition.
1620Real definition will take effect when mh-inc is loaded."
1621 nil)))
1622
c90c4cf1 1623(defcustom-mh mh-inc-spool-list nil
dda00b2c
BW
1624 "*Alternate spool files.
1625
1626You can use the `mh-inc-spool-list' variable to direct MH-E to
1627retrieve mail from arbitrary spool files other than your system
1628mailbox, file it in folders other than your \"+inbox\", and assign
1629key bindings to incorporate this mail.
1630
1631Suppose you are subscribed to the \"mh-e-devel\" mailing list and
1632you use \"procmail\" to filter this mail into \"~/mail/mh-e\" with
1633the following recipe in \".procmailrc\":
1634
1635 MAILDIR=$HOME/mail
1636 :0:
1637 * ^From mh-e-devel-admin@stop.mail-abuse.org
1638 mh-e
1639
1640In order to incorporate \"~/mail/mh-e\" into \"+mh-e\" with an
1641\"I m\" (mh-inc-spool-mh-e) command, customize this option, and click
1642on the \"INS\" button. Enter a \"Spool File\" of \"~/mail/mh-e\", a
1643\"Folder\" of \"mh-e\", and a \"Key Binding\" of \"m\".
1644
1645You can use \"xbuffy\" to automate the incorporation of this mail
dc4d94d5 1646using the Emacs 22 command \"emacsclient\" as follows:
dda00b2c
BW
1647
1648 box ~/mail/mh-e
1649 title mh-e
1650 origMode
1651 polltime 10
1652 headertime 0
dc4d94d5
BW
1653 command emacsclient --eval '(mh-inc-spool-mh-e)'
1654
1655In XEmacs, the command \"gnuclient\" is used in a similar
1656fashion."
dda00b2c
BW
1657 :type '(repeat (list (file :tag "Spool File")
1658 (string :tag "Folder")
1659 (character :tag "Key Binding")))
1660 :set (lambda (symbol value)
1661 (set-default symbol value)
1662 (mh-inc-spool-make-no-autoload))
23347d76 1663 :group 'mh-inc
70a1d47e 1664 :package-version '(MH-E . "7.3"))
dda00b2c
BW
1665
1666;;; Dealing with Junk Mail (:group 'mh-junk)
1667
1668(defvar mh-junk-choice nil
1669 "Chosen spam fighting program.")
1670
1671;; Available spam filter interfaces
1672(defvar mh-junk-function-alist
1673 '((spamassassin mh-spamassassin-blacklist mh-spamassassin-whitelist)
1674 (bogofilter mh-bogofilter-blacklist mh-bogofilter-whitelist)
1675 (spamprobe mh-spamprobe-blacklist mh-spamprobe-whitelist))
1676 "Available choices of spam programs to use.
1677
1678This is an alist. For each element there are functions that
1679blacklist a message as spam and whitelist a message incorrectly
1680classified as spam.")
1681
1682(defun mh-junk-choose (symbol value)
1683 "Choose spam program to use.
1684
1685The function is always called with SYMBOL bound to
1686`mh-junk-program' and VALUE bound to the new value of
1687`mh-junk-program'. The function sets the variable
1688`mh-junk-choice' in addition to `mh-junk-program'."
1689 (set symbol value) ;XXX shouldn't this be set-default?
1690 (setq mh-junk-choice
1691 (or value
1692 (loop for element in mh-junk-function-alist
1693 until (executable-find (symbol-name (car element)))
1694 finally return (car element)))))
1695
c90c4cf1 1696(defcustom-mh mh-junk-background nil
dda00b2c
BW
1697 "If on, spam programs are run in background.
1698
1699By default, the programs are run in the foreground, but this can
1700be slow when junking large numbers of messages. If you have
1701enough memory or don't junk that many messages at the same time,
1a9aa7df
BW
1702you might try turning on this option.
1703
1704Note that this option is used as the \"display\" argument in the
1705call to `call-process'. Therefore, turning on this option means
1706setting its value to \"0\". You can also set its value to t to
1707direct the programs' output to the \"*MH-E Log*\" buffer; this
1708may be useful for debugging."
dda00b2c
BW
1709 :type '(choice (const :tag "Off" nil)
1710 (const :tag "On" 0))
23347d76 1711 :group 'mh-junk
70a1d47e 1712 :package-version '(MH-E . "8.0"))
dda00b2c 1713
c90c4cf1 1714(defcustom-mh mh-junk-disposition nil
dda00b2c
BW
1715 "Disposition of junk mail."
1716 :type '(choice (const :tag "Delete Spam" nil)
1717 (string :tag "Spam Folder"))
23347d76 1718 :group 'mh-junk
70a1d47e 1719 :package-version '(MH-E . "8.0"))
dda00b2c 1720
c90c4cf1 1721(defcustom-mh mh-junk-program nil
dda00b2c
BW
1722 "Spam program that MH-E should use.
1723
1724The default setting of this option is \"Auto-detect\" which means
1725that MH-E will automatically choose one of SpamAssassin,
1726bogofilter, or SpamProbe in that order. If, for example, you have
1727both SpamAssassin and bogofilter installed and you want to use
1728bogofilter, then you can set this option to \"Bogofilter\"."
1729 :type '(choice (const :tag "Auto-detect" nil)
1730 (const :tag "SpamAssassin" spamassassin)
1731 (const :tag "Bogofilter" bogofilter)
1732 (const :tag "SpamProbe" spamprobe))
1733 :set 'mh-junk-choose
23347d76 1734 :group 'mh-junk
70a1d47e 1735 :package-version '(MH-E . "7.3"))
dda00b2c
BW
1736
1737;;; Editing a Draft (:group 'mh-letter)
1738
c90c4cf1 1739(defcustom-mh mh-compose-insertion (if (locate-library "mml") 'mml 'mh)
dda00b2c
BW
1740 "Type of tags used when composing MIME messages.
1741
1742In addition to MH-style directives, MH-E also supports MML (MIME
1743Meta Language) tags. (see Info node `(emacs-mime)Composing').
1744This option can be used to choose between them. By default, this
1745option is set to \"MML\" if it is supported since it provides a
1746lot more functionality. This option can also be set to \"MH\" if
1747MH-style directives are preferred."
1748 :type '(choice (const :tag "MML" mml)
1749 (const :tag "MH" mh))
23347d76 1750 :group 'mh-letter
70a1d47e 1751 :package-version '(MH-E . "7.0"))
dda00b2c 1752
c90c4cf1 1753(defcustom-mh mh-compose-skipped-header-fields
dda00b2c
BW
1754 '("From" "Organization" "References" "In-Reply-To"
1755 "X-Face" "Face" "X-Image-URL" "X-Mailer")
1756 "List of header fields to skip over when navigating in draft."
1757 :type '(repeat (string :tag "Field"))
23347d76 1758 :group 'mh-letter
70a1d47e 1759 :package-version '(MH-E . "7.4"))
dda00b2c 1760
c90c4cf1 1761(defcustom-mh mh-compose-space-does-completion-flag nil
dda00b2c
BW
1762 "*Non-nil means \\<mh-letter-mode-map>\\[mh-letter-complete-or-space] does completion in message header."
1763 :type 'boolean
23347d76 1764 :group 'mh-letter
70a1d47e 1765 :package-version '(MH-E . "7.4"))
dda00b2c 1766
c90c4cf1 1767(defcustom-mh mh-delete-yanked-msg-window-flag nil
dda00b2c
BW
1768 "*Non-nil means delete any window displaying the message.
1769
1770This deletes the window containing the original message after
1771yanking it with \\<mh-letter-mode-map>\\[mh-yank-cur-msg] to make
1772more room on your screen for your reply."
1773 :type 'boolean
23347d76 1774 :group 'mh-letter
70a1d47e 1775 :package-version '(MH-E . "7.0"))
dda00b2c 1776
c90c4cf1 1777(defcustom-mh mh-extract-from-attribution-verb "wrote:"
dda00b2c
BW
1778 "*Verb to use for attribution when a message is yanked by \\<mh-letter-mode-map>\\[mh-yank-cur-msg].
1779
1780The attribution consists of the sender's name and email address
1781followed by the content of this option. This option can be set to
1782\"wrote:\", \"a écrit:\", and \"schrieb:\". You can also use the
1783\"Custom String\" menu item to enter your own verb."
1784 :type '(choice (const "wrote:")
1785 (const "a écrit:")
1786 (const "schrieb:")
1787 (string :tag "Custom String"))
23347d76 1788 :group 'mh-letter
70a1d47e 1789 :package-version '(MH-E . "7.0"))
dda00b2c 1790
c90c4cf1 1791(defcustom-mh mh-ins-buf-prefix "> "
dda00b2c
BW
1792 "*String to put before each line of a yanked or inserted message.
1793
1794The prefix \"> \" is the default setting of this option. I
1795suggest that you not modify this option since it is used by many
1796mailers and news readers: messages are far easier to read if
1797several included messages have all been indented by the same
1798string.
1799
1800This prefix is not inserted if you use one of the supercite
1801flavors of `mh-yank-behavior' or you have added a
1802`mail-citation-hook'."
1803 :type 'string
23347d76 1804 :group 'mh-letter
70a1d47e 1805 :package-version '(MH-E . "6.0"))
dda00b2c 1806
c90c4cf1 1807(defcustom-mh mh-letter-complete-function 'ispell-complete-word
dda00b2c
BW
1808 "*Function to call when completing outside of address or folder fields.
1809
1810In the body of the message,
1811\\<mh-letter-mode-map>\\[mh-letter-complete] runs this function,
1812which is set to \"ispell-complete-word\" by default."
1813 :type '(choice function (const nil))
23347d76 1814 :group 'mh-letter
70a1d47e 1815 :package-version '(MH-E . "7.1"))
dda00b2c 1816
c90c4cf1 1817(defcustom-mh mh-letter-fill-column 72
dda00b2c
BW
1818 "*Fill column to use in MH Letter mode.
1819
1820By default, this option is 72 to allow others to quote your
1821message without line wrapping."
1822 :type 'integer
23347d76 1823 :group 'mh-letter
70a1d47e 1824 :package-version '(MH-E . "6.0"))
dda00b2c 1825
c90c4cf1 1826(defcustom-mh mh-mml-method-default (if mh-pgp-support-flag "pgpmime" "none")
dda00b2c
BW
1827 "Default method to use in security tags.
1828
1829This option is used to select between a variety of mail security
1830mechanisms. The default is \"PGP (MIME)\" if it is supported\;
1831otherwise, the default is \"None\". Other mechanisms include
1832vanilla \"PGP\" and \"S/MIME\".
1833
1834The `pgg' customization group may have some settings which may
1835interest you (see Info node `(pgg)').
1836
1837In particular, I turn on the option `pgg-encrypt-for-me' so that
1838all messages I encrypt are encrypted with my public key as well.
1839If you keep a copy of all of your outgoing mail with a \"Fcc:\"
1840header field, this setting is vital so that you can read the mail
1841you write!"
1842 :type '(choice (const :tag "PGP (MIME)" "pgpmime")
1843 (const :tag "PGP" "pgp")
1844 (const :tag "S/MIME" "smime")
1845 (const :tag "None" "none"))
23347d76 1846 :group 'mh-letter
70a1d47e 1847 :package-version '(MH-E . "8.0"))
dda00b2c 1848
c90c4cf1 1849(defcustom-mh mh-signature-file-name "~/.signature"
dda00b2c
BW
1850 "*Source of user's signature.
1851
1852By default, the text of your signature is taken from the file
1853\"~/.signature\". You can read from other sources by changing this
1854option. This file may contain a vCard in which case an attachment is
1855added with the vCard.
1856
1857This option may also be a symbol, in which case that function is
1858called. You may not want a signature separator to be added for you;
1859instead you may want to insert one yourself. Options that you may find
1860useful to do this include `mh-signature-separator' (when inserting a
1861signature separator) and `mh-signature-separator-regexp' (for finding
1862said separator). The function `mh-signature-separator-p', which
1863reports t if the buffer contains a separator, may be useful as well.
1864
1865The signature is inserted into your message with the command
1866\\<mh-letter-mode-map>\\[mh-insert-signature] or with the option
1867`mh-identity-list'."
1868 :type 'file
23347d76 1869 :group 'mh-letter
70a1d47e 1870 :package-version '(MH-E . "6.0"))
dda00b2c 1871
c90c4cf1 1872(defcustom-mh mh-signature-separator-flag t
dda00b2c
BW
1873 "*Non-nil means a signature separator should be inserted.
1874
1875It is not recommended that you change this option since various
1876mail user agents, including MH-E, use the separator to present
1877the signature differently, and to suppress the signature when
1878replying or yanking a letter into a draft."
1879 :type 'boolean
23347d76 1880 :group 'mh-letter
70a1d47e 1881 :package-version '(MH-E . "8.0"))
dda00b2c 1882
c90c4cf1 1883(defcustom-mh mh-x-face-file "~/.face"
dda00b2c
BW
1884 "*File containing face header field to insert in outgoing mail.
1885
1886If the file starts with either of the strings \"X-Face:\", \"Face:\"
1887or \"X-Image-URL:\" then the contents are added to the message header
1888verbatim. Otherwise it is assumed that the file contains the value of
1889the \"X-Face:\" header field.
1890
1891The \"X-Face:\" header field, which is a low-resolution, black and
1892white image, can be generated using the \"compface\" command (see URL
1893`ftp://ftp.cs.indiana.edu/pub/faces/compface/compface.tar.Z'). The
1894\"Online X-Face Converter\" is a useful resource for quick conversion
1895of images into \"X-Face:\" header fields (see URL
1896`http://www.dairiki.org/xface/').
1897
1898Use the \"make-face\" script to convert a JPEG image to the higher
1899resolution, color, \"Face:\" header field (see URL
1900`http://quimby.gnus.org/circus/face/make-face').
1901
1902The URL of any image can be used for the \"X-Image-URL:\" field and no
1903processing of the image is required.
1904
1905To prevent the setting of any of these header fields, either set
1906`mh-x-face-file' to nil, or simply ensure that the file defined by
1907this option doesn't exist."
1908 :type 'file
23347d76 1909 :group 'mh-letter
70a1d47e 1910 :package-version '(MH-E . "7.0"))
dda00b2c 1911
c90c4cf1 1912(defcustom-mh mh-yank-behavior 'attribution
dda00b2c
BW
1913 "*Controls which part of a message is yanked by \\<mh-letter-mode-map>\\[mh-yank-cur-msg].
1914
1915To include the entire message, including the entire header, use
1916\"Body and Header\". Use \"Body\" to yank just the body without
1917the header. To yank only the portion of the message following the
1918point, set this option to \"Below Point\".
1919
1920Choose \"Invoke supercite\" to pass the entire message and header
1921through supercite.
1922
1923If the \"Body With Attribution\" setting is used, then the
1924message minus the header is yanked and a simple attribution line
1925is added at the top using the value of the option
1926`mh-extract-from-attribution-verb'. This is the default.
1927
1928If the \"Invoke supercite\" or \"Body With Attribution\" settings
1929are used, the \"-noformat\" argument is passed to the \"repl\"
1930program to override a \"-filter\" or \"-format\" argument. These
1931settings also have \"Automatically\" variants that perform the
1932action automatically when you reply so that you don't need to use
1933\\[mh-yank-cur-msg] at all. Note that this automatic action is
1934only performed if the show buffer matches the message being
1935replied to. People who use the automatic variants tend to turn on
1936the option `mh-delete-yanked-msg-window-flag' as well so that the
1937show window is never displayed.
1938
1939If the show buffer has a region, the option `mh-yank-behavior' is
1940ignored unless its value is one of Attribution variants in which
1941case the attribution is added to the yanked region.
1942
1943If this option is set to one of the supercite flavors, the hook
1944`mail-citation-hook' is ignored and `mh-ins-buf-prefix' is not
1945inserted."
1946 :type '(choice (const :tag "Body and Header" t)
1947 (const :tag "Body" body)
1948 (const :tag "Below Point" nil)
1949 (const :tag "Invoke supercite" supercite)
1950 (const :tag "Invoke supercite, Automatically" autosupercite)
1951 (const :tag "Body With Attribution" attribution)
1952 (const :tag "Body With Attribution, Automatically"
1953 autoattrib))
23347d76 1954 :group 'mh-letter
70a1d47e 1955 :package-version '(MH-E . "8.0"))
dda00b2c
BW
1956
1957;;; Ranges (:group 'mh-ranges)
1958
c90c4cf1 1959(defcustom-mh mh-interpret-number-as-range-flag t
dda00b2c
BW
1960 "*Non-nil means interpret a number as a range.
1961
1962Since one of the most frequent ranges used is \"last:N\", MH-E
1963will interpret input such as \"200\" as \"last:200\" if this
1964option is on (which is the default). If you need to scan just the
1965message 200, then use the range \"200:200\"."
1966 :type 'boolean
23347d76 1967 :group 'mh-ranges
70a1d47e 1968 :package-version '(MH-E . "7.4"))
dda00b2c
BW
1969
1970;;; Scan Line Formats (:group 'mh-scan-line-formats)
1971
1972(eval-and-compile
1973 (unless (fboundp 'mh-adaptive-cmd-note-flag-check)
1974 (defun mh-adaptive-cmd-note-flag-check (symbol value)
1975 "Temporary definition.
1976Real definition, below, uses variables that aren't defined yet."
1977 (set-default symbol value))))
1978
c90c4cf1 1979(defcustom-mh mh-adaptive-cmd-note-flag t
dda00b2c
BW
1980 "*Non-nil means that the message number width is determined dynamically.
1981
1982If you've created your own format to handle long message numbers,
1983you'll be pleased to know you no longer need it since MH-E adapts its
1984internal format based upon the largest message number if this option
1985is on (the default). This option may only be turned on when
1986`mh-scan-format-file' is set to \"Use MH-E scan Format\".
1987
1988If you prefer fixed-width message numbers, turn off this option and
1989call `mh-set-cmd-note' with the width specified by your format file
1990\(see `mh-scan-format-file'). For example, the default width is 4, so
1991you would use \"(mh-set-cmd-note 4)\"."
1992 :type 'boolean
1993 :group 'mh-scan-line-formats
23347d76 1994 :set 'mh-adaptive-cmd-note-flag-check
70a1d47e 1995 :package-version '(MH-E . "7.0"))
dda00b2c
BW
1996
1997(defun mh-scan-format-file-check (symbol value)
cb5bf6ba 1998 "Check if desired setting is valid.
dda00b2c
BW
1999Throw an error if user tries to set `mh-scan-format-file' to
2000anything but t when `mh-adaptive-cmd-note-flag' is on. Otherwise,
2001set SYMBOL to VALUE."
2002 (if (and (not (eq value t))
fd61b9ab 2003 mh-adaptive-cmd-note-flag)
dda00b2c
BW
2004 (error "%s %s" "You must turn off `mh-adaptive-cmd-note-flag'"
2005 "unless you use \"Use MH-E scan Format\"")
2006 (set-default symbol value)))
2007
c90c4cf1 2008(defcustom-mh mh-scan-format-file t
dda00b2c
BW
2009 "Specifies the format file to pass to the scan program.
2010
2011The default setting for this option is \"Use MH-E scan Format\". This
2012means that the format string will be taken from the either
2013`mh-scan-format-mh' or `mh-scan-format-nmh' depending on whether MH or
efa47761 2014nmh (or GNU mailutils MH) is in use. This setting also enables you to
dda00b2c
BW
2015turn on the `mh-adaptive-cmd-note-flag' option.
2016
2017You can also set this option to \"Use Default scan Format\" to get the
2018same output as you would get if you ran \"scan\" from the shell. If
2019you have a format file that you want MH-E to use but not MH, you can
2020set this option to \"Specify a scan Format File\" and enter the name
2021of your format file.
2022
2023If you change the format of the scan lines you'll need to tell MH-E
2024how to parse the new format. As you will see, quite a lot of variables
2025are involved to do that. Use \"\\[apropos] RET mh-scan.*regexp\" to
2026obtain a list of these variables. You will also have to call
2027`mh-set-cmd-note' if your notations are not in column 4 (columns in
2028Emacs start with 0)."
2029 :type '(choice (const :tag "Use MH-E scan Format" t)
2030 (const :tag "Use Default scan Format" nil)
2031 (file :tag "Specify a scan Format File"))
2032 :group 'mh-scan-line-formats
23347d76 2033 :set 'mh-scan-format-file-check
70a1d47e 2034 :package-version '(MH-E . "6.0"))
dda00b2c
BW
2035
2036(defun mh-adaptive-cmd-note-flag-check (symbol value)
cb5bf6ba 2037 "Check if desired setting is valid.
dda00b2c
BW
2038Throw an error if user tries to turn on
2039`mh-adaptive-cmd-note-flag' when `mh-scan-format-file' isn't t.
2040Otherwise, set SYMBOL to VALUE."
2041 (if (and value
2042 (not (eq mh-scan-format-file t)))
2043 (error "%s %s" "Can't turn on unless `mh-scan-format-file'"
2044 "is set to \"Use MH-E scan Format\"")
2045 (set-default symbol value)))
2046
c90c4cf1 2047(defcustom-mh mh-scan-prog "scan"
dda00b2c
BW
2048 "*Program used to scan messages.
2049
2050The name of the program that generates a listing of one line per
2051message is held in this option. Unless this variable contains an
2052absolute pathname, it is assumed to be in the `mh-progs'
2053directory. You may link another program to `scan' (see
2054\"mh-profile(5)\") to produce a different type of listing."
2055 :type 'string
23347d76 2056 :group 'mh-scan-line-formats
70a1d47e 2057 :package-version '(MH-E . "6.0"))
dda00b2c
BW
2058(make-variable-buffer-local 'mh-scan-prog)
2059
dda00b2c
BW
2060;;; Searching (:group 'mh-search)
2061
c90c4cf1 2062(defcustom-mh mh-search-program nil
dda00b2c
BW
2063 "Search program that MH-E shall use.
2064
2065The default setting of this option is \"Auto-detect\" which means
2066that MH-E will automatically choose one of swish++, swish-e,
2067mairix, namazu, pick and grep in that order. If, for example, you
2068have both swish++ and mairix installed and you want to use
2069mairix, then you can set this option to \"mairix\".
2070
2071More information about setting up an indexing program to use with
2072MH-E can be found in the documentation of `mh-search'."
2073 :type '(choice (const :tag "Auto-detect" nil)
2074 (const :tag "swish++" swish++)
2075 (const :tag "swish-e" swish)
2076 (const :tag "mairix" mairix)
2077 (const :tag "namazu" namazu)
2078 (const :tag "pick" pick)
2079 (const :tag "grep" grep))
23347d76 2080 :group 'mh-search
70a1d47e 2081 :package-version '(MH-E . "8.0"))
dda00b2c
BW
2082
2083;;; Sending Mail (:group 'mh-sending-mail)
2084
c90c4cf1 2085(defcustom-mh mh-compose-forward-as-mime-flag t
dda00b2c
BW
2086 "*Non-nil means that messages are forwarded as attachments.
2087
2088By default, this option is on which means that the forwarded
2089messages are included as attachments. If you would prefer to
2090forward your messages verbatim (as text, inline), then turn off
2091this option. Forwarding messages verbatim works well for short,
2092textual messages, but your recipient won't be able to view any
2093non-textual attachments that were in the forwarded message. Be
2094aware that if you have \"forw: -mime\" in your MH profile, then
2095forwarded messages will always be included as attachments
2096regardless of the settings of this option."
2097 :type 'boolean
23347d76 2098 :group 'mh-sending-mail
70a1d47e 2099 :package-version '(MH-E . "8.0"))
dda00b2c 2100
c90c4cf1 2101(defcustom-mh mh-compose-letter-function nil
dda00b2c
BW
2102 "Invoked when starting a new draft.
2103
2104However, it is the last function called before you edit your
2105message. The consequence of this is that you can write a function
2106to write and send the message for you. This function is passed
2107three arguments: the contents of the TO, SUBJECT, and CC header
2108fields."
2109 :type '(choice (const nil) function)
23347d76 2110 :group 'mh-sending-mail
70a1d47e 2111 :package-version '(MH-E . "6.0"))
dda00b2c 2112
c90c4cf1 2113(defcustom-mh mh-compose-prompt-flag nil
dda00b2c
BW
2114 "*Non-nil means prompt for header fields when composing a new draft."
2115 :type 'boolean
23347d76 2116 :group 'mh-sending-mail
70a1d47e 2117 :package-version '(MH-E . "7.4"))
dda00b2c 2118
c90c4cf1 2119(defcustom-mh mh-forward-subject-format "%s: %s"
dda00b2c
BW
2120 "*Format string for forwarded message subject.
2121
2122This option is a string which includes two escapes (\"%s\"). The
2123first \"%s\" is replaced with the sender of the original message,
2124and the second one is replaced with the original \"Subject:\"."
2125 :type 'string
23347d76 2126 :group 'mh-sending-mail
70a1d47e 2127 :package-version '(MH-E . "6.0"))
dda00b2c 2128
c90c4cf1 2129(defcustom-mh mh-insert-x-mailer-flag t
dda00b2c
BW
2130 "*Non-nil means append an \"X-Mailer:\" header field to the header.
2131
2132This header field includes the version of MH-E and Emacs that you
2133are using. If you don't want to participate in our marketing, you
2134can turn this option off."
2135 :type 'boolean
23347d76 2136 :group 'mh-sending-mail
70a1d47e 2137 :package-version '(MH-E . "7.0"))
dda00b2c 2138
c90c4cf1 2139(defcustom-mh mh-redist-full-contents-flag nil
dda00b2c
BW
2140 "*Non-nil means the \"dist\" command needs entire letter for redistribution.
2141
2142This option must be turned on if \"dist\" requires the whole
2143letter for redistribution, which is the case if \"send\" is
2144compiled with the BERK option (which many people abhor). If you
2145find that MH will not allow you to redistribute a message that
2146has been redistributed before, turn off this option."
2147 :type 'boolean
23347d76 2148 :group 'mh-sending-mail
70a1d47e 2149 :package-version '(MH-E . "8.0"))
dda00b2c 2150
c90c4cf1 2151(defcustom-mh mh-reply-default-reply-to nil
dda00b2c
BW
2152 "*Sets the person or persons to whom a reply will be sent.
2153
2154This option is set to \"Prompt\" by default so that you are
2155prompted for the recipient of a reply. If you find that most of
2156the time that you specify \"cc\" when you reply to a message, set
2157this option to \"cc\". Other choices include \"from\", \"to\", or
2158\"all\". You can always edit the recipients in the draft."
2159 :type '(choice (const :tag "Prompt" nil)
2160 (const "from")
2161 (const "to")
2162 (const "cc")
2163 (const "all"))
23347d76 2164 :group 'mh-sending-mail
70a1d47e 2165 :package-version '(MH-E . "6.0"))
dda00b2c 2166
c90c4cf1 2167(defcustom-mh mh-reply-show-message-flag t
dda00b2c
BW
2168 "*Non-nil means the MH-Show buffer is displayed when replying.
2169
2170If you include the message automatically, you can hide the
2171MH-Show buffer by turning off this option.
2172
2173See also `mh-reply'."
2174 :type 'boolean
23347d76 2175 :group 'mh-sending-mail
70a1d47e 2176 :package-version '(MH-E . "7.0"))
dda00b2c
BW
2177
2178;;; Sequences (:group 'mh-sequences)
2179
2180;; If `mh-unpropagated-sequences' becomes a defcustom, add the following to
2181;; the docstring: "Additional sequences that should not to be preserved can be
2182;; specified by setting `mh-unpropagated-sequences' appropriately." XXX
2183
c90c4cf1 2184(defcustom-mh mh-refile-preserves-sequences-flag t
dda00b2c
BW
2185 "*Non-nil means that sequences are preserved when messages are refiled.
2186
2187If a message is in any sequence (except \"Previous-Sequence:\"
2188and \"cur\") when it is refiled, then it will still be in those
2189sequences in the destination folder. If this behavior is not
2190desired, then turn off this option."
2191 :type 'boolean
23347d76 2192 :group 'mh-sequences
70a1d47e 2193 :package-version '(MH-E . "7.4"))
dda00b2c 2194
c90c4cf1 2195(defcustom-mh mh-tick-seq 'tick
dda00b2c
BW
2196 "The name of the MH sequence for ticked messages.
2197
2198You can customize this option if you already use the \"tick\"
2199sequence for your own use. You can also disable all of the
2200ticking functions by choosing the \"Disable Ticking\" item but
2201there isn't much advantage to that."
2202 :type '(choice (const :tag "Disable Ticking" nil)
2203 symbol)
23347d76 2204 :group 'mh-sequences
70a1d47e 2205 :package-version '(MH-E . "7.3"))
dda00b2c 2206
c90c4cf1 2207(defcustom-mh mh-update-sequences-after-mh-show-flag t
dda00b2c
BW
2208 "*Non-nil means flush MH sequences to disk after message is shown\\<mh-folder-mode-map>.
2209
2210Three sequences are maintained internally by MH-E and pushed out
2211to MH when a message is shown. They include the sequence
2212specified by your \"Unseen-Sequence:\" profile entry, \"cur\",
2213and the sequence listed by the option `mh-tick-seq' which is
2214\"tick\" by default. If you do not like this behavior, turn off
2215this option. You can then update the state manually with the
2216\\[mh-execute-commands], \\[mh-quit], or \\[mh-update-sequences]
2217commands."
2218 :type 'boolean
23347d76 2219 :group 'mh-sequences
70a1d47e 2220 :package-version '(MH-E . "7.0"))
dda00b2c
BW
2221
2222;;; Reading Your Mail (:group 'mh-show)
2223
c90c4cf1 2224(defcustom-mh mh-bury-show-buffer-flag t
dda00b2c
BW
2225 "*Non-nil means show buffer is buried.
2226
2227One advantage of not burying the show buffer is that one can
2228delete the show buffer more easily in an electric buffer list
2229because of its proximity to its associated MH-Folder buffer. Try
2230running \\[electric-buffer-list] to see what I mean."
2231 :type 'boolean
23347d76 2232 :group 'mh-show
70a1d47e 2233 :package-version '(MH-E . "7.0"))
dda00b2c 2234
c90c4cf1 2235(defcustom-mh mh-clean-message-header-flag t
dda00b2c
BW
2236 "*Non-nil means remove extraneous header fields.
2237
2238See also `mh-invisible-header-fields-default' and
2239`mh-invisible-header-fields'."
2240 :type 'boolean
23347d76 2241 :group 'mh-show
70a1d47e 2242 :package-version '(MH-E . "7.0"))
dda00b2c 2243
c90c4cf1 2244(defcustom-mh mh-decode-mime-flag (not (not (locate-library "mm-decode")))
dda00b2c
BW
2245 "*Non-nil means attachments are handled\\<mh-folder-mode-map>.
2246
2247MH-E can handle attachments as well if the Gnus `mm-decode'
2248library is present. If so, this option will be on. Otherwise,
2249you'll see the MIME body parts rather than text or attachments.
2250There isn't much point in turning off this option; however, you
2251can inspect it if it appears that the body parts are not being
2252interpreted correctly or toggle it with the command
2253\\[mh-toggle-mh-decode-mime-flag] to view the raw message.
2254
2255This option also controls the display of quoted-printable
2256messages and other graphical widgets. See the options
2257`mh-graphical-smileys-flag' and `mh-graphical-emphasis-flag'."
2258 :type 'boolean
23347d76 2259 :group 'mh-show
70a1d47e 2260 :package-version '(MH-E . "7.0"))
dda00b2c 2261
c90c4cf1 2262(defcustom-mh mh-display-buttons-for-alternatives-flag nil
dda00b2c
BW
2263 "*Non-nil means display buttons for all alternative attachments.
2264
2265Sometimes, a mail program will produce multiple alternatives of
2266the attachment in increasing degree of faithfulness to the
2267original content. By default, only the preferred alternative is
2268displayed. If this option is on, then the preferred part is shown
2269inline and buttons are shown for each of the other alternatives."
2270 :type 'boolean
23347d76 2271 :group 'mh-show
70a1d47e 2272 :package-version '(MH-E . "7.4"))
dda00b2c 2273
c90c4cf1 2274(defcustom-mh mh-display-buttons-for-inline-parts-flag nil
dda00b2c
BW
2275 "*Non-nil means display buttons for all inline attachments\\<mh-folder-mode-map>.
2276
2277The sender can request that attachments should be viewed inline so
2278that they do not really appear like an attachment at all to the
2279reader. Most of the time, this is desirable, so by default MH-E
2280suppresses the buttons for inline attachments. On the other hand, you
2281may receive code or HTML which the sender has added to his message as
2282inline attachments so that you can read them in MH-E. In this case, it
2283is useful to see the buttons so that you know you don't have to cut
2284and paste the code into a file; you can simply save the attachment.
2285
2286If you want to make the buttons visible for inline attachments, you
2287can use the command \\[mh-toggle-mime-buttons] to toggle the
2288visibility of these buttons. You can turn on these buttons permanently
2289by turning on this option.
2290
2291MH-E cannot display all attachments inline however. It can display
2292text (including HTML) and images."
2293 :type 'boolean
23347d76 2294 :group 'mh-show
70a1d47e 2295 :package-version '(MH-E . "7.0"))
dda00b2c 2296
c90c4cf1 2297(defcustom-mh mh-do-not-confirm-flag nil
dda00b2c
BW
2298 "*Non-nil means non-reversible commands do not prompt for confirmation.
2299
2300Commands such as `mh-pack-folder' prompt to confirm whether to
2301process outstanding moves and deletes or not before continuing.
2302Turning on this option means that these actions will be
2303performed--which is usually desired but cannot be
2304retracted--without question."
2305 :type 'boolean
23347d76 2306 :group 'mh-show
70a1d47e 2307 :package-version '(MH-E . "7.0"))
dda00b2c 2308
c90c4cf1 2309(defcustom-mh mh-fetch-x-image-url nil
dda00b2c
BW
2310 "*Control fetching of \"X-Image-URL:\" header field image.
2311
2312Ths option controls the fetching of the \"X-Image-URL:\" header
2313field image with the following values:
2314
2315Ask Before Fetching
2316 You are prompted before the image is fetched. MH-E will
2317 remember your reply and will either use the already fetched
2318 image the next time the same URL is encountered or silently
2319 skip it if you didn't fetch it the first time. This is a
2320 good setting.
2321
2322Never Fetch
2323 Images are never fetched and only displayed if they are
2324 already present in the cache. This is the default.
2325
2326There isn't a value of \"Always Fetch\" for privacy and DOS (denial of
2327service) reasons. For example, fetching a URL can tip off a spammer
2328that you've read his email (which is why you shouldn't blindly answer
2329yes if you've set this option to \"Ask Before Fetching\"). Someone may
2330also flood your network and fill your disk drive by sending a torrent
2331of messages, each specifying a unique URL to a very large file.
2332
2333The cache of images is found in the directory \".mhe-x-image-cache\"
2334within your MH directory. You can add your own face to the \"From:\"
2335field too. See Info node `(mh-e)Picture'.
2336
2337This setting only has effect if the option `mh-show-use-xface-flag' is
2338turned on."
2339
2340 :type '(choice (const :tag "Ask Before Fetching" ask)
2341 (const :tag "Never Fetch" nil))
23347d76 2342 :group 'mh-show
70a1d47e 2343 :package-version '(MH-E . "7.3"))
dda00b2c 2344
c90c4cf1 2345(defcustom-mh mh-graphical-smileys-flag t
dda00b2c
BW
2346 "*Non-nil means graphical smileys are displayed.
2347
2348It is a long standing custom to inject body language using a
2349cornucopia of punctuation, also known as the \"smileys\". MH-E
2350can render these as graphical widgets if this option is turned
2351on, which it is by default. Smileys include patterns such as :-)
2352and ;-).
2353
2354This option is disabled if the option `mh-decode-mime-flag' is
2355turned off."
2356 :type 'boolean
23347d76 2357 :group 'mh-show
70a1d47e 2358 :package-version '(MH-E . "7.0"))
dda00b2c 2359
c90c4cf1 2360(defcustom-mh mh-graphical-emphasis-flag t
dda00b2c
BW
2361 "*Non-nil means graphical emphasis is displayed.
2362
2363A few typesetting features are indicated in ASCII text with
2364certain characters. If your terminal supports it, MH-E can render
2365these typesetting directives naturally if this option is turned
2366on, which it is by default. For example, _underline_ will be
2367underlined, *bold* will appear in bold, /italics/ will appear in
2368italics, and so on. See the option `gnus-emphasis-alist' for the
2369whole list.
2370
2371This option is disabled if the option `mh-decode-mime-flag' is
2372turned off."
2373 :type 'boolean
23347d76 2374 :group 'mh-show
70a1d47e 2375 :package-version '(MH-E . "7.0"))
dda00b2c 2376
c90c4cf1 2377(defcustom-mh mh-highlight-citation-style 'gnus
dda00b2c
BW
2378 "Style for highlighting citations.
2379
2380If the sender of the message has cited other messages in his
2381message, then MH-E will highlight these citations to emphasize
2382the sender's actual response. This option can be customized to
2383change the highlighting style. The \"Multicolor\" method uses a
2384different color for each indentation while the \"Monochrome\"
2385method highlights all citations in red. To disable highlighting
2386of citations entirely, choose \"None\"."
2387 :type '(choice (const :tag "Multicolor" gnus)
2388 (const :tag "Monochrome" font-lock)
2389 (const :tag "None" nil))
23347d76 2390 :group 'mh-show
70a1d47e 2391 :package-version '(MH-E . "8.0"))
dda00b2c 2392
7911d1c8 2393;; These entries have been intentionally excluded by the developers.
c50115f1
JH
2394;; "Comments:" ; RFC 2822 - show this one
2395;; "Fax:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2396;; "Mail-System-Version:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2397;; "Mailer:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
5cb66178 2398;; "Organization:" ;
c50115f1
JH
2399;; "Phone:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2400;; "Reply-By:" ; RFC 2156
2401;; "Reply-To:" ; RFC 2822
7911d1c8 2402;; "Sender:" ;
c50115f1 2403;; "User-Agent:" ; Similar to X-Mailer, so display it.
5cb66178 2404;; "X-Mailer:" ;
7911d1c8
BW
2405;; "X-Operator:" ; Similar to X-Mailer, so display it
2406
2407;; Keep fields alphabetized (set sort-fold-case to t first).
2408;; Mention source, if known.
dda00b2c 2409(defvar mh-invisible-header-fields-internal
c50115f1
JH
2410 '(
2411 "Abuse-Reports-To:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
7911d1c8
BW
2412 "Accept-Language:"
2413 "AcceptLanguage:"
4690fe3f 2414 "Accreditor:" ; Habeas
243256f8
JH
2415 "Also-Control:" ; H. Spencer: News Article Format and Transmission, June 1994
2416 "Alternate-recipient:" ; RFC 2156
2417 "Approved-By:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2418 "Approved:" ; RFC 1036
2419 "Article-Names:" ; H. Spencer: News Article Format and Transmission, June 1994
2420 "Article-Updates:" ; H. Spencer: News Article Format and Transmission, June 1994
2421 "Authentication-Results:"
2422 "Auto-forwarded:" ; RFC 2156
2423 "Autoforwarded:" ; RFC 2156
dda00b2c 2424 "Bestservhost:"
90404d5a 2425 "Bytes:"
243256f8 2426 "Cancel-Key:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2427 "Cancel-Lock:" ; NNTP posts
b6fd8984 2428 "Comment:" ; Shows up with DomainKeys
243256f8
JH
2429 "Content-" ; RFC 2045, 1123, 1766, 1864, 2045, 2110, 2156, 2183, 2912
2430 "Control:" ; RFC 1036
2431 "Conversion-With-Loss:" ; RFC 2156
2432 "Conversion:" ; RFC 2156
243256f8
JH
2433 "Delivered-To:" ; Egroups/yahoogroups mailing list manager
2434 "Delivery-Date:" ; RFC 2156
dda00b2c 2435 "Delivery:"
243256f8
JH
2436 "Discarded-X400-" ; RFC 2156
2437 "Disclose-Recipients:" ; RFC 2156
2438 "Disposition-Notification-Options:" ; RFC 2298
2439 "Disposition-Notification-To:" ; RFC 2298
2440 "Distribution:" ; RFC 1036
7911d1c8 2441 "DKIM-" ; http://antispam.yahoo.com/domainkeys
7911d1c8 2442 "DL-Expansion-History:" ; RFC 2156
243256f8 2443 "DomainKey-" ; http://antispam.yahoo.com/domainkeys
7911d1c8 2444 "DomainKey-Signature:"
243256f8 2445 "Encoding:" ; RFC 1505
dda00b2c 2446 "Envelope-to:"
243256f8
JH
2447 "Errors-To:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2448 "Expires:" ; RFC 1036
2449 "Expiry-Date:" ; RFC 2156
dda00b2c 2450 "Face:" ; Gnus Face header
243256f8
JH
2451 "Followup-To:" ; RFC 1036
2452 "For-Approval:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2453 "For-Comment:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2454 "For-Handdling:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c
BW
2455 "Forwarded:" ; MH
2456 "From " ; sendmail
243256f8
JH
2457 "Generate-Delivery-Report:" ; RFC 2156
2458 "Importance:" ; RFC 2156, 2421
2459 "In-Reply-To:" ; RFC 2822
2460 "Incomplete-Copy:" ; RFC 2156
2461 "Keywords:" ; RFC 2822
2462 "Language:" ; RFC 2156
2463 "Lines:" ; RFC 1036
2464 "List-" ; RFC 2369, 2919
2465 "Mail-Copies-To:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2466 "Mail-Followup-To:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2467 "Mail-from:" ; MH
7911d1c8 2468 "Mail-Reply-To:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
243256f8
JH
2469 "Mailing-List:" ; Egroups/yahoogroups mailing list manager
2470 "Message-Content:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2471 "Message-Id:" ; RFC 822
243256f8 2472 "Message-Type:" ; RFC 2156
dda00b2c 2473 "Mime-Version" ; RFC 2045
7911d1c8 2474 "Msgid:"
7911d1c8 2475 "NNTP-" ; News
243256f8 2476 "Obsoletes:" ; RFC 2156
dda00b2c 2477 "Old-Return-Path:"
243256f8
JH
2478 "OpenPGP:"
2479 "Original-Encoded-Information-Types:" ; RFC 2156
dda00b2c 2480 "Original-Lines:" ; mail to news
dda00b2c 2481 "Original-Newsgroups:" ; mail to news
7911d1c8 2482 "Original-NNTP-" ; mail to news
dda00b2c
BW
2483 "Original-Path:" ; mail to news
2484 "Original-Received:" ; mail to news
243256f8 2485 "Original-Recipt:" ; RFC 2298
dda00b2c
BW
2486 "Original-To:" ; mail to news
2487 "Original-X-" ; mail to news
243256f8
JH
2488 "Origination-Client:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2489 "Originator:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c
BW
2490 "P1-Content-Type:" ; X400
2491 "P1-Message-Id:" ; X400
2492 "P1-Recipient:" ; X400
243256f8 2493 "Path:" ; RFC 1036
243256f8
JH
2494 "Pics-Label:" ; W3C
2495 "Posted-To:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2496 "Precedence:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2497 "Prev-Resent" ; MH
243256f8
JH
2498 "Prevent-NonDelivery-Report:" ; RFC 2156
2499 "Priority:" ; RFC 2156
2500 "Read-Receipt-To:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2501 "Received-SPF:" ; Gmail
243256f8
JH
2502 "Received:" ; RFC 822
2503 "References:" ; RFC 2822
2504 "Registered-Mail-Reply-Requested-By:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2505 "Remailed-" ; MH
243256f8 2506 "Replaces:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2507 "Replied:" ; MH
243256f8 2508 "Resent-" ; RFC 2822
dda00b2c 2509 "Return-Path:" ; RFC 822
243256f8
JH
2510 "Return-Receipt-Requested:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2511 "Return-Receipt-To:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
4690fe3f 2512 "Seal-Send-Time:"
7911d1c8 2513 "See-Also:" ; H. Spencer: News Article Format and Transmission, June 1994
243256f8
JH
2514 "Sensitivity:" ; RFC 2156, 2421
2515 "Speach-Act:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2516 "Status:" ; sendmail
243256f8
JH
2517 "Supersedes:" ; H. Spencer: News Article Format and Transmission, June 1994
2518 "Telefax:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2519 "Thread-"
7911d1c8
BW
2520 "Thread-Index:"
2521 "Thread-Topic:"
243256f8
JH
2522 "Translated-By:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2523 "Translation-Of:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2524 "Ua-Content-Id:" ; X400
dda00b2c 2525 "Via:" ; MH
dda00b2c 2526 "X-Abuse-and-DMCA-"
7911d1c8 2527 "X-Abuse-Info:"
dda00b2c
BW
2528 "X-Accept-Language:" ; Netscape/Mozilla
2529 "X-Ack:"
243256f8 2530 "X-Admin:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2531 "X-Administrivia-To:"
7911d1c8 2532 "X-AMAZON" ; Amazon.com
dda00b2c 2533 "X-AntiAbuse:" ; cPanel
c50115f1 2534 "X-Antivirus-Scanner:"
7911d1c8 2535 "X-AOL-IP:" ; AOL WebMail
dda00b2c
BW
2536 "X-Apparently-From:" ; MS Outlook
2537 "X-Apparently-To:" ; Egroups/yahoogroups mailing list manager
c50115f1 2538 "X-Attribution:"
243256f8 2539 "X-AuditID:"
c50115f1 2540 "X-Authenticated-Info:" ; Verizon.net?
efd5b7df 2541 "X-Authenticated-Sender:" ; AT&T Message Center (webmail)
dda00b2c 2542 "X-Authentication-Warning:" ; sendmail
7911d1c8 2543 "X-Authority-Analysis:"
efd5b7df 2544 "X-Barracuda-" ; Barracuda spam scores
dda00b2c 2545 "X-Beenthere:" ; Mailman mailing list manager
243256f8 2546 "X-Bigfish:"
dda00b2c 2547 "X-Bogosity:" ; bogofilter
201a821a 2548 "X-Brightmail-Tracker:" ; Brightmail
243256f8 2549 "X-BrightmailFiltered:" ; Brightmail
efd5b7df 2550 "X-Bugzilla-" ; Bugzilla
90404d5a 2551 "X-Campaignid:"
c50115f1 2552 "X-Comment:" ; AT&T Mailennium
243256f8
JH
2553 "X-Complaints-To:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2554 "X-Confirm-Reading-To:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
7911d1c8 2555 "X-Content-Filtered-By:"
dda00b2c 2556 "X-ContentStamp:" ; NetZero
90404d5a 2557 "X-Country-Chain:" ; http://www.declude.com/x-note.htm
c50115f1
JH
2558 "X-Cr-Hashedpuzzle:"
2559 "X-Cr-Puzzleid:"
dda00b2c 2560 "X-Cron-Env:"
7911d1c8 2561 "X-DCC-Usenix-Metrics:"
90404d5a 2562 "X-Declude-" ; http://www.declude.com/x-note.htm
7911d1c8 2563 "X-Dedicated:"
dda00b2c 2564 "X-Delivered"
7911d1c8
BW
2565 "X-DH-Virus-"
2566 "X-DMCA"
2567 "X-Domain:"
2568 "X-Echelon-Distraction"
efd5b7df 2569 "X-EFL-Spamscore:" ; MIT alumni spam filtering
7911d1c8 2570 "X-eGroups-" ; Egroups/yahoogroups mailing list manager
5cb66178 2571 "X-EID:"
dda00b2c 2572 "X-ELNK-Trace:" ; Earthlink mailer
243256f8 2573 "X-Enigmail-Version:"
dda00b2c 2574 "X-Envelope-Date:" ; GNU mailutils
243256f8 2575 "X-Envelope-From:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2576 "X-Envelope-Sender:"
243256f8 2577 "X-Envelope-To:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
c50115f1 2578 "X-EviteMessageId:" ; evite.com
dda00b2c 2579 "X-Evolution:" ; Evolution mail client
243256f8
JH
2580 "X-ExtLoop"
2581 "X-Face:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
90404d5a 2582 "X-fmx-"
dda00b2c
BW
2583 "X-Folder:" ; Spam
2584 "X-From-Line"
2585 "X-Gmail-" ; Gmail
2586 "X-Gnus-Mail-Source:" ; gnus
243256f8 2587 "X-Google-" ; Google mail
7911d1c8 2588 "X-Google-Sender-Auth:"
dda00b2c 2589 "X-Greylist:" ; milter-greylist-1.2.1
243256f8 2590 "X-Habeas-SWE-" ; Spam
201a821a 2591 "X-Hashcash:" ; hashcash
7911d1c8
BW
2592 "X-HPL-"
2593 "X-HR-"
2594 "X-HTTP-UserAgent:"
2cefb8a7 2595 "X-Hz" ; Hertz
90404d5a 2596 "X-Identity:" ; http://www.declude.com/x-note.htm
243256f8 2597 "X-Image-URL:"
7911d1c8 2598 "X-IMAP:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2599 "X-Info:" ; NTMail
243256f8 2600 "X-IronPort-" ; IronPort AV
7911d1c8
BW
2601 "X-ISI-4-30-3-MailScanner:"
2602 "X-J2-"
dda00b2c 2603 "X-Juno-" ; Juno
7911d1c8 2604 "X-Key:"
243256f8 2605 "X-List-Host:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c
BW
2606 "X-List-Subscribe:" ; Unknown mailing list managers
2607 "X-List-Unsubscribe:" ; Unknown mailing list managers
2608 "X-Listprocessor-" ; ListProc(tm) by CREN
243256f8
JH
2609 "X-Listserver:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2610 "X-Loop:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
c50115f1 2611 "X-Lrde-Mailscanner:"
dda00b2c 2612 "X-Lumos-SenderID:" ; Roving ConstantContact
efd5b7df 2613 "X-Mail-from:" ; fastmail.fm
7911d1c8 2614 "X-MAIL-INFO:" ; NetZero
90404d5a 2615 "X-Mailer_"
dda00b2c 2616 "X-Mailing-List:" ; Unknown mailing list managers
efd5b7df 2617 "X-Mailman-Approved-At:" ; Mailman mailing list manager
dda00b2c 2618 "X-Mailman-Version:" ; Mailman mailing list manager
7911d1c8 2619 "X-MailScanner" ; ListProc(tm) by CREN
243256f8 2620 "X-Mailutils-Message-Id" ; GNU Mailutils
dda00b2c 2621 "X-Majordomo:" ; Majordomo mailing list manager
7911d1c8
BW
2622 "X-MB-Message-" ; AOL WebMail
2623 "X-MDaemon-Deliver-To:"
2624 "X-MDRemoteIP:"
dda00b2c 2625 "X-Message-Id"
7911d1c8 2626 "X-Message-Type:"
dda00b2c 2627 "X-MessageWall-Score:" ; Unknown mailing list manager, AUC TeX
7911d1c8
BW
2628 "X-MHE-Checksum:" ; Checksum added during index search
2629 "X-MIME-Autoconverted:" ; sendmail
2630 "X-MIMEOLE:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/sendmail
2631 "X-MIMETrack:"
dda00b2c
BW
2632 "X-Mms-" ; T-Mobile pictures
2633 "X-Mozilla-Status:" ; Netscape/Mozilla
7911d1c8 2634 "X-MS-" ; MS Outlook
dda00b2c 2635 "X-Msmail-" ; MS Outlook
7911d1c8 2636 "X-MSMail-Priority" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c
BW
2637 "X-NAI-Spam-" ; Network Associates Inc. SpamKiller
2638 "X-News:" ; News
243256f8
JH
2639 "X-Newsreader:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2640 "X-No-Archive:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c
BW
2641 "X-Notes-Item:" ; Lotus Notes Domino structured header
2642 "X-OperatingSystem:"
7911d1c8 2643 "X-ORBL:"
dda00b2c 2644 "X-Orcl-Content-Type:"
7911d1c8 2645 "X-Organization:"
243256f8 2646 "X-Original-Arrival-Type:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c
BW
2647 "X-Original-Complaints-To:"
2648 "X-Original-Date:" ; SourceForge mailing list manager
2649 "X-Original-To:"
2650 "X-Original-Trace:"
2651 "X-OriginalArrivalTime:" ; Hotmail
243256f8 2652 "X-Originating-Email:" ; Hotmail
dda00b2c 2653 "X-Originating-IP:" ; Hotmail
90404d5a 2654 "X-pair-"
7911d1c8
BW
2655 "X-PGP:"
2656 "X-PID:"
243256f8 2657 "X-PMG-"
7911d1c8 2658 "X-PMX-Version:"
dda00b2c
BW
2659 "X-Postfilter:"
2660 "X-Priority:" ; MS Outlook
2cefb8a7 2661 "X-Proofpoint-" ; Proofpoint mail filter
13384ea6 2662 "X-Provags-ID:"
7911d1c8 2663 "X-PSTN-"
dda00b2c 2664 "X-Qotd-" ; User added
243256f8 2665 "X-RCPT-TO:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c
BW
2666 "X-Received-Date:"
2667 "X-Received:"
243256f8 2668 "X-Report-Abuse-To:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2669 "X-Request-"
efd5b7df 2670 "X-Resolved-to:" ; fastmail.fm
dda00b2c 2671 "X-Return-Path-Hint:" ; Roving ConstantContact
2cefb8a7 2672 "X-RIM-" ; Research In Motion (i.e. BlackBerry)
7911d1c8 2673 "X-RM"
c50115f1 2674 "X-RocketYMMF:" ; Yahoo
efd5b7df
ED
2675 "X-Roving-" ; Roving ConstantContact
2676 "X-SA-Exim-" ; Exim SpamAssassin
7911d1c8 2677 "X-Sasl-enc:" ; Apple Mail
dda00b2c
BW
2678 "X-SBClass:" ; Spam
2679 "X-SBNote:" ; Spam
2680 "X-SBPass:" ; Spam
7911d1c8 2681 "X-SBRS:"
dda00b2c 2682 "X-SBRule:" ; Spam
f12d6a4a 2683 "X-Scanned-By:"
243256f8 2684 "X-Sender:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c
BW
2685 "X-Server-Date:"
2686 "X-Server-Uuid:"
7911d1c8 2687 "X-Service-Code:"
dda00b2c 2688 "X-Sieve:" ; Sieve filtering
7911d1c8 2689 "X-SMTP-"
dda00b2c
BW
2690 "X-Source"
2691 "X-Spam-" ; Spamassassin
2692 "X-SpamBouncer:" ; Spam
90404d5a 2693 "X-SPF-"
dda00b2c 2694 "X-Status"
7911d1c8 2695 "X-Submission-Address:"
dda00b2c 2696 "X-Submissions-To:"
7911d1c8 2697 "X-Sun-Charset:"
dda00b2c
BW
2698 "X-Telecom-Digest"
2699 "X-Trace:"
2700 "X-UID"
243256f8 2701 "X-UIDL:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
7911d1c8 2702 "X-Unity"
dda00b2c 2703 "X-UNTD-" ; NetZero
243256f8
JH
2704 "X-URI:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
2705 "X-URL:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2706 "X-USANET-" ; usa.net
90404d5a 2707 "X-Usenet-Provider"
dda00b2c 2708 "X-UserInfo1:"
24b2be09 2709 "X-Virus-" ;
dda00b2c 2710 "X-Vms-To:"
7911d1c8 2711 "X-VSMLoop:" ; NTMail
dda00b2c
BW
2712 "X-WebTV-Signature:"
2713 "X-Wss-Id:" ; Worldtalk gateways
243256f8 2714 "X-X-Sender:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
dda00b2c 2715 "X-Yahoo"
7911d1c8
BW
2716 "X-Yahoo-Newman-"
2717 "X-YMail-"
dda00b2c 2718 "X400-" ; X400
243256f8
JH
2719 "Xref:" ; RFC 1036
2720 )
dda00b2c
BW
2721 "List of default header fields that are not to be shown.
2722
2723Do not alter this variable directly. Instead, add entries from
2724here that you would like to be displayed in
2725`mh-invisible-header-fields-default' and add entries to hide in
2726`mh-invisible-header-fields'.")
2727
2728(eval-and-compile
2729 (unless (fboundp 'mh-invisible-headers)
2730 (defun mh-invisible-headers ()
2731 "Temporary definition.
2732Real definition, below, uses variables that aren't defined yet."
2733 nil)))
2734
2735(defvar mh-delay-invisible-header-generation-flag t
2736 "Non-nil means to delay the generation of invisible header fields.
2737Because the function `mh-invisible-headers' uses both
2738`mh-invisible-header-fields' and `mh-invisible-header-fields', it
2739cannot be run until both variables have been initialized.")
2740
c90c4cf1 2741(defcustom-mh mh-invisible-header-fields nil
dda00b2c
BW
2742 "*Additional header fields to hide.
2743
2744Header fields that you would like to hide that aren't listed in
2745`mh-invisible-header-fields-default' can be added to this option
2746with a couple of caveats. Regular expressions are not allowed.
2747Unique fields should have a \":\" suffix; otherwise, the element
2748can be used to render invisible an entire class of fields that
4690fe3f
BW
2749start with the same prefix.
2750
2751If you think a header field should be generally ignored, please
2752update SF #1916032 (see URL
2753`https://sourceforge.net/tracker/index.php?func=detail&aid=1916032&group_id=13357&atid=113357').
dda00b2c
BW
2754
2755See also `mh-clean-message-header-flag'."
2756
2757 :type '(repeat (string :tag "Header field"))
2758 :set (lambda (symbol value)
2759 (set-default symbol value)
2760 (mh-invisible-headers))
23347d76 2761 :group 'mh-show
70a1d47e 2762 :package-version '(MH-E . "7.1"))
dda00b2c 2763
c90c4cf1 2764(defcustom-mh mh-invisible-header-fields-default nil
dda00b2c
BW
2765 "*List of hidden header fields.
2766
2767The header fields listed in this option are hidden, although you
2768can check off any field that you would like to see.
2769
2770Header fields that you would like to hide that aren't listed can
2771be added to the option `mh-invisible-header-fields'.
2772
4690fe3f
BW
2773See also `mh-clean-message-header-flag'.
2774
2775If you think a header field should be added to this list, please
2776update SF #1916032 (see URL
2777`https://sourceforge.net/tracker/index.php?func=detail&aid=1916032&group_id=13357&atid=113357')."
dda00b2c
BW
2778 :type `(set ,@(mapcar (lambda (x) `(const ,x))
2779 mh-invisible-header-fields-internal))
2780 :set (lambda (symbol value)
2781 (set-default symbol value)
2782 (mh-invisible-headers))
23347d76 2783 :group 'mh-show
70a1d47e 2784 :package-version '(MH-E . "8.0"))
dda00b2c
BW
2785
2786(defvar mh-invisible-header-fields-compiled nil
2787 "*Regexp matching lines in a message header that are not to be shown.
2788Do not alter this variable directly. Instead, customize
2789`mh-invisible-header-fields-default' checking for fields normally
2790hidden that you wish to display, and add extra entries to hide in
2791`mh-invisible-header-fields'.")
2792
2793(defun mh-invisible-headers ()
2794 "Make or remake the variable `mh-invisible-header-fields-compiled'.
2795Done using `mh-invisible-header-fields-internal' as input, from
2796which entries from `mh-invisible-header-fields-default' are
2797removed and entries from `mh-invisible-header-fields' are added."
2798 (let ((fields mh-invisible-header-fields-internal))
2799 (when mh-invisible-header-fields-default
2800 ;; Remove entries from `mh-invisible-header-fields-default'
2801 (setq fields
2802 (loop for x in fields
2803 unless (member x mh-invisible-header-fields-default)
2804 collect x)))
2805 (when (and (boundp 'mh-invisible-header-fields)
2806 mh-invisible-header-fields)
2807 (dolist (x mh-invisible-header-fields)
2808 (unless (member x fields) (setq fields (cons x fields)))))
2809 (if fields
2810 (setq mh-invisible-header-fields-compiled
2811 (concat
2812 "^"
2813 ;; workaround for insufficient default
2814 (let ((max-specpdl-size 1000))
2815 (regexp-opt fields t))))
2816 (setq mh-invisible-header-fields-compiled nil))))
2817
2818;; Compile invisible header fields.
2819(mh-invisible-headers)
2820
c90c4cf1 2821(defcustom-mh mh-lpr-command-format "lpr -J '%s'"
dda00b2c
BW
2822 "*Command used to print\\<mh-folder-mode-map>.
2823
2824This option contains the Unix command line which performs the
2825actual printing for the \\[mh-print-msg] command. The string can
2826contain one escape, \"%s\", which is replaced by the name of the
2827folder and the message number and is useful for print job names.
2828I use \"mpage -h'%s' -b Letter -H1of -mlrtb -P\" which produces a
2829nice header and adds a bit of margin so the text fits within my
2830printer's margins.
2831
2832This options is not used by the commands \\[mh-ps-print-msg] or
2833\\[mh-ps-print-msg-file]."
2834 :type 'string
23347d76 2835 :group 'mh-show
70a1d47e 2836 :package-version '(MH-E . "6.0"))
dda00b2c 2837
c90c4cf1 2838(defcustom-mh mh-max-inline-image-height nil
dda00b2c
BW
2839 "*Maximum inline image height if \"Content-Disposition:\" is not present.
2840
2841Some older mail programs do not insert this needed plumbing to
2842tell MH-E whether to display the attachments inline or not. If
2843this is the case, MH-E will display these images inline if they
2844are smaller than the window. However, you might want to allow
2845larger images to be displayed inline. To do this, you can change
2846the options `mh-max-inline-image-width' and
2847`mh-max-inline-image-height' from their default value of zero to
2848a large number. The size of your screen is a good choice for
2849these numbers."
2850 :type '(choice (const nil) integer)
23347d76 2851 :group 'mh-show
70a1d47e 2852 :package-version '(MH-E . "7.0"))
dda00b2c 2853
c90c4cf1 2854(defcustom-mh mh-max-inline-image-width nil
dda00b2c
BW
2855 "*Maximum inline image width if \"Content-Disposition:\" is not present.
2856
2857Some older mail programs do not insert this needed plumbing to
2858tell MH-E whether to display the attachments inline or not. If
2859this is the case, MH-E will display these images inline if they
2860are smaller than the window. However, you might want to allow
2861larger images to be displayed inline. To do this, you can change
2862the options `mh-max-inline-image-width' and
2863`mh-max-inline-image-height' from their default value of zero to
2864a large number. The size of your screen is a good choice for
2865these numbers."
2866 :type '(choice (const nil) integer)
23347d76 2867 :group 'mh-show
70a1d47e 2868 :package-version '(MH-E . "7.0"))
dda00b2c 2869
c90c4cf1 2870(defcustom-mh mh-mhl-format-file nil
dda00b2c
BW
2871 "*Specifies the format file to pass to the \"mhl\" program.
2872
2873Normally MH-E takes care of displaying messages itself (rather than
2874calling an MH program to do the work). If you'd rather have \"mhl\"
2875display the message (within MH-E), change this option from its default
2876value of \"Use Default mhl Format (Printing Only)\".
2877
2878You can set this option to \"Use Default mhl Format\" to get the same
2879output as you would get if you ran \"mhl\" from the shell.
2880
2881If you have a format file that you want MH-E to use, you can set this
2882option to \"Specify an mhl Format File\" and enter the name of your
2883format file. Your format file should specify a non-zero value for
2884\"overflowoffset\" to allow MH-E to parse the header. Note that
2885\"mhl\" is always used for printing and forwarding; in this case, the
2886value of this option is consulted if you have specified a format
2887file."
2888 :type '(choice (const :tag "Use Default mhl Format (Printing Only)" nil)
2889 (const :tag "Use Default mhl Format" t)
2890 (file :tag "Specify an mhl Format File"))
23347d76 2891 :group 'mh-show
70a1d47e 2892 :package-version '(MH-E . "8.0"))
dda00b2c 2893
c90c4cf1 2894(defcustom-mh mh-mime-save-parts-default-directory t
dda00b2c
BW
2895 "Default directory to use for \\<mh-folder-mode-map>\\[mh-mime-save-parts].
2896
2897The default value for this option is \"Prompt Always\" so that
2898you are always prompted for the directory in which to save the
2899attachments. However, if you usually use the same directory
2900within a session, then you can set this option to \"Prompt the
2901First Time\" to avoid the prompt each time. you can make this
2902directory permanent by choosing \"Directory\" and entering the
2903directory's name."
2904 :type '(choice (const :tag "Prompt the First Time" nil)
2905 (const :tag "Prompt Always" t)
2906 directory)
23347d76 2907 :group 'mh-show
70a1d47e 2908 :package-version '(MH-E . "7.0"))
dda00b2c 2909
c90c4cf1 2910(defcustom-mh mh-print-background-flag nil
dda00b2c
BW
2911 "*Non-nil means messages should be printed in the background\\<mh-folder-mode-map>.
2912
2913Normally messages are printed in the foreground. If this is slow on
2914your system, you may elect to turn off this option to print in the
2915background.
2916
2917WARNING: If you do this, do not delete the message until it is printed
2918or else the output may be truncated.
2919
2920This option is not used by the commands \\[mh-ps-print-msg] or
2921\\[mh-ps-print-msg-file]."
2922 :type 'boolean
23347d76 2923 :group 'mh-show
70a1d47e 2924 :package-version '(MH-E . "7.0"))
dda00b2c 2925
c90c4cf1 2926(defcustom-mh mh-show-maximum-size 0
dda00b2c
BW
2927 "*Maximum size of message (in bytes) to display automatically.
2928
2929This option provides an opportunity to skip over large messages
2930which may be slow to load. The default value of 0 means that all
2931message are shown regardless of size."
2932 :type 'integer
23347d76 2933 :group 'mh-show
70a1d47e 2934 :package-version '(MH-E . "8.0"))
dda00b2c 2935
c90c4cf1 2936(defcustom-mh mh-show-use-xface-flag (>= emacs-major-version 21)
dda00b2c
BW
2937 "*Non-nil means display face images in MH-show buffers.
2938
2939MH-E can display the content of \"Face:\", \"X-Face:\", and
2940\"X-Image-URL:\" header fields. If any of these fields occur in the
2941header of your message, the sender's face will appear in the \"From:\"
2942header field. If more than one of these fields appear, then the first
2943field found in the order \"Face:\", \"X-Face:\", and \"X-Image-URL:\"
2944will be used.
2945
2946The option `mh-show-use-xface-flag' is used to turn this feature on
2947and off. This feature will be turned on by default if your system
2948supports it.
2949
2950The first header field used, if present, is the Gnus-specific
2951\"Face:\" field. The \"Face:\" field appeared in GNU Emacs 21 and
2952XEmacs. For more information, see URL
2953`http://quimby.gnus.org/circus/face/'. Next is the traditional
2954\"X-Face:\" header field. The display of this field requires the
2955\"uncompface\" program (see URL
2956`ftp://ftp.cs.indiana.edu/pub/faces/compface/compface.tar.z'). Recent
2957versions of XEmacs have internal support for \"X-Face:\" images. If
2958your version of XEmacs does not, then you'll need both \"uncompface\"
2959and the x-face package (see URL `ftp://ftp.jpl.org/pub/elisp/').
2960
2961Finally, MH-E will display images referenced by the \"X-Image-URL:\"
2962header field if neither the \"Face:\" nor the \"X-Face:\" fields are
2963present. The display of the images requires \"wget\" (see URL
2964`http://www.gnu.org/software/wget/wget.html'), \"fetch\", or \"curl\"
2965to fetch the image and the \"convert\" program from the ImageMagick
2966suite (see URL `http://www.imagemagick.org/'). Of the three header
2967fields this is the most efficient in terms of network usage since the
2968image doesn't need to be transmitted with every single mail.
2969
2970The option `mh-fetch-x-image-url' controls the fetching of the
2971\"X-Image-URL:\" header field image."
2972 :type 'boolean
23347d76 2973 :group 'mh-show
70a1d47e 2974 :package-version '(MH-E . "7.0"))
dda00b2c 2975
c90c4cf1 2976(defcustom-mh mh-store-default-directory nil
dda00b2c
BW
2977 "*Default directory for \\<mh-folder-mode-map>\\[mh-store-msg].
2978
2979If you would like to change the initial default directory,
2980customize this option, change the value from \"Current\" to
2981\"Directory\", and then enter the name of the directory for storing
2982the content of these messages."
2983 :type '(choice (const :tag "Current" nil)
2984 directory)
23347d76 2985 :group 'mh-show
70a1d47e 2986 :package-version '(MH-E . "6.0"))
dda00b2c 2987
c90c4cf1 2988(defcustom-mh mh-summary-height nil
dda00b2c
BW
2989 "*Number of lines in MH-Folder buffer (including the mode line).
2990
2991The default value of this option is \"Automatic\" which means
2992that the MH-Folder buffer will maintain the same proportional
2993size if the frame is resized. If you'd prefer a fixed height,
2994then choose the \"Fixed Size\" option and enter the number of
2995lines you'd like to see."
2996 :type '(choice (const :tag "Automatic" nil)
2997 (integer :tag "Fixed Size"))
23347d76 2998 :group 'mh-show
70a1d47e 2999 :package-version '(MH-E . "7.4"))
dda00b2c
BW
3000
3001;;; The Speedbar (:group 'mh-speedbar)
3002
c90c4cf1 3003(defcustom-mh mh-speed-update-interval 60
dda00b2c
BW
3004 "Time between speedbar updates in seconds.
3005Set to 0 to disable automatic update."
3006 :type 'integer
23347d76 3007 :group 'mh-speedbar
70a1d47e 3008 :package-version '(MH-E . "8.0"))
dda00b2c
BW
3009
3010;;; Threading (:group 'mh-thread)
3011
c90c4cf1 3012(defcustom-mh mh-show-threads-flag nil
dda00b2c
BW
3013 "*Non-nil means new folders start in threaded mode.
3014
3015Threading large number of messages can be time consuming so this
3016option is turned off by default. If you turn this option on, then
3017threading will be done only if the number of messages being
3018threaded is less than `mh-large-folder'."
3019 :type 'boolean
23347d76 3020 :group 'mh-thread
70a1d47e 3021 :package-version '(MH-E . "7.1"))
c26cf6c8 3022
dda00b2c
BW
3023;;; The Tool Bar (:group 'mh-tool-bar)
3024
3025;; mh-tool-bar-folder-buttons and mh-tool-bar-letter-buttons defined
3026;; dynamically in mh-tool-bar.el.
3027
c90c4cf1 3028(defcustom-mh mh-tool-bar-search-function 'mh-search
dda00b2c
BW
3029 "*Function called by the tool bar search button.
3030
3031By default, this is set to `mh-search'. You can also choose
3032\"Other Function\" from the \"Value Menu\" and enter a function
3033of your own choosing."
3034 :type '(choice (const mh-search)
3035 (function :tag "Other Function"))
23347d76 3036 :group 'mh-tool-bar
70a1d47e 3037 :package-version '(MH-E . "7.0"))
dda00b2c
BW
3038
3039;; XEmacs has a couple of extra customizations...
3040(mh-do-in-xemacs
c90c4cf1 3041 (defcustom-mh mh-xemacs-use-tool-bar-flag mh-xemacs-has-tool-bar-flag
dda00b2c
BW
3042 "*If non-nil, use tool bar.
3043
3044This option controls whether to show the MH-E icons at all. By
3045default, this option is turned on if the window system supports
3046tool bars. If your system doesn't support tool bars, then you
3047won't be able to turn on this option."
3048 :type 'boolean
3049 :group 'mh-tool-bar
3050 :set (lambda (symbol value)
3051 (if (and (eq value t)
3052 (not mh-xemacs-has-tool-bar-flag))
3053 (error "Tool bar not supported"))
23347d76 3054 (set-default symbol value))
70a1d47e 3055 :package-version '(MH-E . "7.3"))
dda00b2c 3056
c90c4cf1 3057 (defcustom-mh mh-xemacs-tool-bar-position nil
dda00b2c
BW
3058 "*Tool bar location.
3059
3060This option controls the placement of the tool bar along the four
3061edges of the frame. You can choose from one of \"Same As Default
3062Tool Bar\", \"Top\", \"Bottom\", \"Left\", or \"Right\". If this
3063variable is set to anything other than \"Same As Default Tool
3064Bar\" and the default tool bar is in a different location, then
3065two tool bars will be displayed: the MH-E tool bar and the
3066default tool bar."
3067 :type '(radio (const :tag "Same As Default Tool Bar" :value nil)
3068 (const :tag "Top" :value top)
3069 (const :tag "Bottom" :value bottom)
3070 (const :tag "Left" :value left)
3071 (const :tag "Right" :value right))
23347d76 3072 :group 'mh-tool-bar
70a1d47e 3073 :package-version '(MH-E . "7.3")))
942fc772 3074
c26cf6c8
RS
3075\f
3076
dda00b2c
BW
3077;;; Hooks (:group 'mh-hooks + group where hook described)
3078
c90c4cf1 3079(defcustom-mh mh-after-commands-processed-hook nil
e5d763d8 3080 "Hook run by \\<mh-folder-mode-map>\\[mh-execute-commands] after performing outstanding refile and delete requests.
dda00b2c
BW
3081
3082Variables that are useful in this hook include
3083`mh-folders-changed', which lists which folders were affected by
3084deletes and refiles. This list will always include the current
3085folder, which is also available in `mh-current-folder'."
3086 :type 'hook
3087 :group 'mh-hooks
23347d76 3088 :group 'mh-folder
70a1d47e 3089 :package-version '(MH-E . "8.0"))
dda00b2c 3090
c90c4cf1 3091(defcustom-mh mh-alias-reloaded-hook nil
dda00b2c
BW
3092 "Hook run by `mh-alias-reload' after loading aliases."
3093 :type 'hook
3094 :group 'mh-hooks
23347d76 3095 :group 'mh-alias
70a1d47e 3096 :package-version '(MH-E . "8.0"))
dda00b2c 3097
aad5673d 3098(defcustom-mh mh-annotate-msg-hook nil
7106a02d
BW
3099 "Hook run whenever a message is sent and after the scan lines and message are annotated.
3100Hook functions can access the current folder name with
3101`mh-current-folder' and obtain the message numbers of the
3102annotated messages with `mh-annotate-list'."
aad5673d
SG
3103 :type 'hook
3104 :group 'mh-hooks
3105 :group 'mh-sending-mail
3106 :package-version '(MH-E . "8.1"))
3107
c90c4cf1 3108(defcustom-mh mh-before-commands-processed-hook nil
e5d763d8 3109 "Hook run by \\<mh-folder-mode-map>\\[mh-execute-commands] before performing outstanding refile and delete requests.
dda00b2c
BW
3110
3111Variables that are useful in this hook include `mh-delete-list'
3112and `mh-refile-list' which can be used to see which changes will
3113be made to the current folder, `mh-current-folder'."
3114 :type 'hook
3115 :group 'mh-hooks
23347d76 3116 :group 'mh-folder
70a1d47e 3117 :package-version '(MH-E . "8.0"))
dda00b2c 3118
c90c4cf1 3119(defcustom-mh mh-before-quit-hook nil
dda00b2c
BW
3120 "Hook run by \\<mh-folder-mode-map>\\[mh-quit] before quitting MH-E.
3121
3122This hook is called before the quit occurs, so you might use it
3123to perform any MH-E operations; you could perform some query and
3124abort the quit or call `mh-execute-commands', for example.
3125
3126See also `mh-quit-hook'."
3127 :type 'hook
3128 :group 'mh-hooks
23347d76 3129 :group 'mh-folder
70a1d47e 3130 :package-version '(MH-E . "6.0"))
dda00b2c 3131
c90c4cf1 3132(defcustom-mh mh-before-send-letter-hook nil
dda00b2c
BW
3133 "Hook run at the beginning of the \\<mh-letter-mode-map>\\[mh-send-letter] command.
3134
3135For example, if you want to check your spelling in your message
3136before sending, add the `ispell-message' function."
3137 :type 'hook
3138 :options '(ispell-message)
3139 :group 'mh-hooks
23347d76 3140 :group 'mh-letter
70a1d47e 3141 :package-version '(MH-E . "6.0"))
dda00b2c 3142
c90c4cf1 3143(defcustom-mh mh-delete-msg-hook nil
dda00b2c
BW
3144 "Hook run by \\<mh-letter-mode-map>\\[mh-delete-msg] after marking each message for deletion.
3145
3146For example, a past maintainer of MH-E used this once when he
3147kept statistics on his mail usage."
3148 :type 'hook
3149 :group 'mh-hooks
23347d76 3150 :group 'mh-show
70a1d47e 3151 :package-version '(MH-E . "6.0"))
dda00b2c 3152
c90c4cf1 3153(defcustom-mh mh-find-path-hook nil
dda00b2c
BW
3154 "Hook run by `mh-find-path' after reading the user's MH profile.
3155
3156This hook can be used the change the value of the variables that
3157`mh-find-path' sets if you need to run with different values
3158between MH and MH-E."
3159 :type 'hook
3160 :group 'mh-hooks
23347d76 3161 :group 'mh-e
70a1d47e 3162 :package-version '(MH-E . "7.0"))
dda00b2c 3163
c90c4cf1 3164(defcustom-mh mh-folder-mode-hook nil
dda00b2c
BW
3165 "Hook run by `mh-folder-mode' when visiting a new folder."
3166 :type 'hook
3167 :group 'mh-hooks
23347d76 3168 :group 'mh-folder
70a1d47e 3169 :package-version '(MH-E . "6.0"))
dda00b2c 3170
c90c4cf1 3171(defcustom-mh mh-forward-hook nil
dda00b2c
BW
3172 "Hook run by `mh-forward' on a forwarded letter."
3173 :type 'hook
3174 :group 'mh-hooks
23347d76 3175 :group 'mh-sending-mail
70a1d47e 3176 :package-version '(MH-E . "8.0"))
dda00b2c 3177
c90c4cf1 3178(defcustom-mh mh-inc-folder-hook nil
dda00b2c
BW
3179 "Hook run by \\<mh-folder-mode-map>\\[mh-inc-folder] after incorporating mail into a folder."
3180 :type 'hook
3181 :group 'mh-hooks
23347d76 3182 :group 'mh-inc
70a1d47e 3183 :package-version '(MH-E . "6.0"))
dda00b2c 3184
c90c4cf1 3185(defcustom-mh mh-insert-signature-hook nil
dda00b2c
BW
3186 "Hook run by \\<mh-letter-mode-map>\\[mh-insert-signature] after signature has been inserted.
3187
3188Hook functions may access the actual name of the file or the
3189function used to insert the signature with
3190`mh-signature-file-name'."
3191 :type 'hook
3192 :group 'mh-hooks
23347d76 3193 :group 'mh-letter
70a1d47e 3194 :package-version '(MH-E . "8.0"))
dda00b2c 3195
c90c4cf1 3196(defcustom-mh mh-kill-folder-suppress-prompt-hooks '(mh-search-p)
dda00b2c
BW
3197 "Abnormal hook run at the beginning of \\<mh-folder-mode-map>\\[mh-kill-folder].
3198
3199The hook functions are called with no arguments and should return
3200a non-nil value to suppress the normal prompt when you remove a
3201folder. This is useful for folders that are easily regenerated.
3202
3203The default value of `mh-search-p' suppresses the prompt on
3204folders generated by searching.
3205
3206WARNING: Use this hook with care. If there is a bug in your hook
3207which returns t on \"+inbox\" and you hit \\[mh-kill-folder] by
3208accident in the \"+inbox\" folder, you will not be happy."
3209 :type 'hook
3210 :group 'mh-hooks
23347d76 3211 :group 'mh-folder
70a1d47e 3212 :package-version '(MH-E . "7.4"))
dda00b2c 3213
c90c4cf1 3214(defcustom-mh mh-letter-mode-hook nil
dda00b2c
BW
3215 "Hook run by `mh-letter-mode' on a new letter.
3216
3217This hook allows you to do some processing before editing a
3218letter. For example, you may wish to modify the header after
3219\"repl\" has done its work, or you may have a complicated
3220\"components\" file and need to tell MH-E where the cursor should
3221go."
3222 :type 'hook
3223 :group 'mh-hooks
23347d76 3224 :group 'mh-sending-mail
70a1d47e 3225 :package-version '(MH-E . "6.0"))
dda00b2c 3226
c90c4cf1 3227(defcustom-mh mh-mh-to-mime-hook nil
dda00b2c
BW
3228 "Hook run on the formatted letter by \\<mh-letter-mode-map>\\[mh-mh-to-mime]."
3229 :type 'hook
3230 :group 'mh-hooks
23347d76 3231 :group 'mh-letter
70a1d47e 3232 :package-version '(MH-E . "8.0"))
dda00b2c 3233
c90c4cf1 3234(defcustom-mh mh-search-mode-hook nil
dda00b2c
BW
3235 "Hook run upon entry to `mh-search-mode'\\<mh-folder-mode-map>.
3236
3237If you find that you do the same thing over and over when editing
3238the search template, you may wish to bind some shortcuts to keys.
3239This can be done with this hook which is called when
3240\\[mh-search] is run on a new pattern."
3241 :type 'hook
3242 :group 'mh-hooks
23347d76 3243 :group 'mh-search
70a1d47e 3244 :package-version '(MH-E . "8.0"))
dda00b2c 3245
031c6757
SG
3246(defcustom-mh mh-pack-folder-hook nil
3247 "Hook run by \\<mh-folder-mode-map>\\[mh-pack-folder] after renumbering the messages.
3248Hook functions can access the current folder name with `mh-current-folder'."
3249 :type 'hook
3250 :group 'mh-hooks
3251 :group 'mh-folder
7f1a6a6f 3252 :package-version '(MH-E . "8.2"))
031c6757 3253
c90c4cf1 3254(defcustom-mh mh-quit-hook nil
dda00b2c
BW
3255 "Hook run by \\<mh-folder-mode-map>\\[mh-quit] after quitting MH-E.
3256
3257This hook is not run in an MH-E context, so you might use it to
3258modify the window setup.
3259
3260See also `mh-before-quit-hook'."
3261 :type 'hook
3262 :group 'mh-hooks
23347d76 3263 :group 'mh-folder
70a1d47e 3264 :package-version '(MH-E . "6.0"))
dda00b2c 3265
c90c4cf1 3266(defcustom-mh mh-refile-msg-hook nil
dda00b2c
BW
3267 "Hook run by \\<mh-folder-mode-map>\\[mh-refile-msg] after marking each message for refiling."
3268 :type 'hook
3269 :group 'mh-hooks
23347d76 3270 :group 'mh-folder
70a1d47e 3271 :package-version '(MH-E . "6.0"))
dda00b2c 3272
c90c4cf1 3273(defcustom-mh mh-show-hook nil
dda00b2c
BW
3274 "Hook run after \\<mh-folder-mode-map>\\[mh-show] shows a message.
3275
3276It is the last thing called after messages are displayed. It's
3277used to affect the behavior of MH-E in general or when
3278`mh-show-mode-hook' is too early. See `mh-show-mode-hook'."
3279 :type 'hook
3280 :group 'mh-hooks
23347d76 3281 :group 'mh-show
70a1d47e 3282 :package-version '(MH-E . "6.0"))
dda00b2c 3283
c90c4cf1 3284(defcustom-mh mh-show-mode-hook nil
dda00b2c
BW
3285 "Hook run upon entry to `mh-show-mode'.
3286
3287This hook is called early on in the process of the message
3288display. It is usually used to perform some action on the
3289message's content. See `mh-show-hook'."
3290 :type 'hook
3291 :group 'mh-hooks
23347d76 3292 :group 'mh-show
70a1d47e 3293 :package-version '(MH-E . "6.0"))
dda00b2c 3294
c90c4cf1 3295(defcustom-mh mh-unseen-updated-hook nil
dda00b2c
BW
3296 "Hook run after the unseen sequence has been updated.
3297
3298The variable `mh-seen-list' can be used by this hook to obtain
3299the list of messages which were removed from the unseen
3300sequence."
3301 :type 'hook
3302 :group 'mh-hooks
23347d76 3303 :group 'mh-sequences
70a1d47e 3304 :package-version '(MH-E . "6.0"))
a1b4049d 3305
bdcfe844 3306\f
a1b4049d 3307
dda00b2c
BW
3308;;; Faces (:group 'mh-faces + group where faces described)
3309
3310(if (boundp 'facemenu-unlisted-faces)
3311 (add-to-list 'facemenu-unlisted-faces "^mh-"))
3312
367c48ef
BW
3313;; To add a new face:
3314;; 1. Add entry to variable mh-face-data.
c90c4cf1 3315;; 2. Create face using defface-mh (which removes min-color spec and
367c48ef
BW
3316;; :package-version keyword where these are not supported),
3317;; accessing face data with function mh-face-data.
3318;; 3. Add inherit argument to function mh-face-data if applicable.
6d21875b
BW
3319(defvar mh-face-data
3320 '((mh-folder-followup
3321 ((((class color) (background light))
3322 (:foreground "blue3"))
3323 (((class color) (background dark))
3324 (:foreground "LightGoldenRod"))
3325 (t
3326 (:bold t))))
3327 (mh-folder-msg-number
3328 ((((class color) (min-colors 64) (background light))
3329 (:foreground "snow4"))
3330 (((class color) (min-colors 64) (background dark))
3331 (:foreground "snow3"))
b95d0a24
BW
3332 (((class color) (background light))
3333 (:foreground "purple"))
3334 (((class color) (background dark))
6d21875b
BW
3335 (:foreground "cyan"))))
3336 (mh-folder-refiled
3337 ((((class color) (min-colors 64) (background light))
3338 (:foreground "DarkGoldenrod"))
3339 (((class color) (min-colors 64) (background dark))
3340 (:foreground "LightGoldenrod"))
3341 (((class color))
3342 (:foreground "yellow" :weight light))
3343 (((class grayscale) (background light))
3344 (:foreground "Gray90" :bold t :italic t))
3345 (((class grayscale) (background dark))
3346 (:foreground "DimGray" :bold t :italic t))
3347 (t
3348 (:bold t :italic t))))
3349 (mh-folder-subject
3350 ((((class color) (background light))
3351 (:foreground "blue4"))
3352 (((class color) (background dark))
3353 (:foreground "yellow"))
3354 (t
3355 (:bold t))))
3356 (mh-folder-tick
b95d0a24 3357 ((((class color) (background light))
6d21875b 3358 (:background "#dddf7e"))
b95d0a24 3359 (((class color) (background dark))
6d21875b
BW
3360 (:background "#dddf7e"))
3361 (t
3362 (:underline t))))
3363 (mh-folder-to
3364 ((((class color) (min-colors 64) (background light))
3365 (:foreground "RosyBrown"))
3366 (((class color) (min-colors 64) (background dark))
3367 (:foreground "LightSalmon"))
3368 (((class color))
3369 (:foreground "green"))
3370 (((class grayscale) (background light))
3371 (:foreground "DimGray" :italic t))
3372 (((class grayscale) (background dark))
3373 (:foreground "LightGray" :italic t))
3374 (t
3375 (:italic t))))
3376 (mh-letter-header-field
3377 ((((class color) (background light))
3378 (:background "gray90"))
3379 (((class color) (background dark))
3380 (:background "gray10"))
3381 (t
3382 (:bold t))))
3383 (mh-search-folder
3384 ((((class color) (background light))
3385 (:foreground "dark green" :bold t))
3386 (((class color) (background dark))
3387 (:foreground "indian red" :bold t))
3388 (t
3389 (:bold t))))
3390 (mh-show-cc
3391 ((((class color) (min-colors 64) (background light))
3392 (:foreground "DarkGoldenrod"))
3393 (((class color) (min-colors 64) (background dark))
3394 (:foreground "LightGoldenrod"))
3395 (((class color))
3396 (:foreground "yellow" :weight light))
3397 (((class grayscale) (background light))
3398 (:foreground "Gray90" :bold t :italic t))
3399 (((class grayscale) (background dark))
3400 (:foreground "DimGray" :bold t :italic t))
3401 (t
3402 (:bold t :italic t))))
3403 (mh-show-date
3404 ((((class color) (min-colors 64) (background light))
3405 (:foreground "ForestGreen"))
3406 (((class color) (min-colors 64) (background dark))
3407 (:foreground "PaleGreen"))
3408 (((class color))
3409 (:foreground "green"))
3410 (((class grayscale) (background light))
3411 (:foreground "Gray90" :bold t))
3412 (((class grayscale) (background dark))
3413 (:foreground "DimGray" :bold t))
3414 (t
3415 (:bold t :underline t))))
3416 (mh-show-from
3417 ((((class color) (background light))
3418 (:foreground "red3"))
3419 (((class color) (background dark))
3420 (:foreground "cyan"))
3421 (t
3422 (:bold t))))
3423 (mh-show-header
3424 ((((class color) (min-colors 64) (background light))
3425 (:foreground "RosyBrown"))
3426 (((class color) (min-colors 64) (background dark))
3427 (:foreground "LightSalmon"))
3428 (((class color))
3429 (:foreground "green"))
3430 (((class grayscale) (background light))
3431 (:foreground "DimGray" :italic t))
3432 (((class grayscale) (background dark))
3433 (:foreground "LightGray" :italic t))
3434 (t
3435 (:italic t))))
3436 (mh-show-pgg-bad ((t (:bold t :foreground "DeepPink1"))))
3437 (mh-show-pgg-good ((t (:bold t :foreground "LimeGreen"))))
3438 (mh-show-pgg-unknown ((t (:bold t :foreground "DarkGoldenrod2"))))
3439 (mh-show-signature ((t (:italic t))))
3440 (mh-show-to
3441 ((((class color) (background light))
3442 (:foreground "SaddleBrown"))
3443 (((class color) (background dark))
3444 (:foreground "burlywood"))
3445 (((class grayscale) (background light))
3446 (:foreground "DimGray" :underline t))
3447 (((class grayscale) (background dark))
3448 (:foreground "LightGray" :underline t))
3449 (t (:underline t))))
3450 (mh-speedbar-folder
3451 ((((class color) (background light))
3452 (:foreground "blue4"))
3453 (((class color) (background dark))
3454 (:foreground "light blue"))))
3455 (mh-speedbar-selected-folder
3456 ((((class color) (background light))
3457 (:foreground "red1" :underline t))
3458 (((class color) (background dark))
3459 (:foreground "red1" :underline t))
3460 (t
367c48ef
BW
3461 (:underline t)))))
3462 "MH-E face data.
3463Used by function `mh-face-data' which returns spec that is
c90c4cf1 3464consumed by `defface-mh'.")
367c48ef
BW
3465
3466(require 'cus-face)
3467
3468(defvar mh-inherit-face-flag (assq :inherit custom-face-attributes)
3469 "Non-nil means that the `defface' :inherit keyword is available.
3470The :inherit keyword is available on all supported versions of
3471GNU Emacs and XEmacs from at least 21.5.23 on.")
3472
a3269bc4 3473(defvar mh-min-colors-defined-flag (and (not (featurep 'xemacs))
367c48ef
BW
3474 (>= emacs-major-version 22))
3475 "Non-nil means `defface' supports min-colors display requirement.")
6d21875b
BW
3476
3477(defun mh-face-data (face &optional inherit)
3478 "Return spec for FACE.
367c48ef 3479See `defface' for the spec definition.
6d21875b 3480
367c48ef
BW
3481If INHERIT is non-nil and `defface' supports the :inherit
3482keyword, return INHERIT literally; otherwise, return spec for
3483FACE from the variable `mh-face-data'. This isn't a perfect
3484implementation. In the case that the :inherit keyword is not
3485supported, any additional attributes in the inherit parameter are
3486not added to the returned spec.
3487
3488Furthermore, when `mh-min-colors-defined-flag' is nil, this
3489function finds display entries with \"min-colors\" requirements
3490and either removes the \"min-colors\" requirement or strips the
3491display entirely if the display does not support the number of
3492specified colors."
3493 (let ((spec
3494 (if (and inherit mh-inherit-face-flag)
3495 inherit
3496 (or (cadr (assq face mh-face-data))
3497 (error "Could not find %s in mh-face-data" face)))))
3498
3499 (if mh-min-colors-defined-flag
3500 spec
3501 (let ((cells (mh-display-color-cells))
3502 new-spec)
3503 ;; Remove entries with min-colors, or delete them if we have
3504 ;; fewer colors than they specify.
3505 (loop for entry in (reverse spec) do
3506 (let ((requirement (if (eq (car entry) t)
3507 nil
3508 (assq 'min-colors (car entry)))))
3509 (if requirement
3510 (when (>= cells (nth 1 requirement))
3511 (setq new-spec (cons (cons (delq requirement (car entry))
3512 (cdr entry))
3513 new-spec)))
3514 (setq new-spec (cons entry new-spec)))))
3515 new-spec))))
6d21875b 3516
c90c4cf1 3517(defface-mh mh-folder-address
6d21875b 3518 (mh-face-data 'mh-folder-subject '((t (:inherit mh-folder-subject))))
dda00b2c
BW
3519 "Recipient face."
3520 :group 'mh-faces
23347d76 3521 :group 'mh-folder
70a1d47e 3522 :package-version '(MH-E . "8.0"))
dda00b2c 3523
c90c4cf1 3524(defface-mh mh-folder-body
6d21875b
BW
3525 (mh-face-data 'mh-folder-msg-number
3526 '((((class color))
3527 (:inherit mh-folder-msg-number))
3528 (t
3529 (:inherit mh-folder-msg-number :italic t))))
dda00b2c
BW
3530 "Body text face."
3531 :group 'mh-faces
23347d76 3532 :group 'mh-folder
70a1d47e 3533 :package-version '(MH-E . "8.0"))
dda00b2c 3534
c90c4cf1 3535(defface-mh mh-folder-cur-msg-number
6d21875b
BW
3536 (mh-face-data 'mh-folder-msg-number
3537 '((t (:inherit mh-folder-msg-number :bold t))))
dda00b2c
BW
3538 "Current message number face."
3539 :group 'mh-faces
23347d76 3540 :group 'mh-folder
70a1d47e 3541 :package-version '(MH-E . "8.0"))
dda00b2c 3542
c90c4cf1 3543(defface-mh mh-folder-date
6d21875b 3544 (mh-face-data 'mh-folder-msg-number '((t (:inherit mh-folder-msg-number))))
dda00b2c
BW
3545 "Date face."
3546 :group 'mh-faces
23347d76 3547 :group 'mh-folder
70a1d47e 3548 :package-version '(MH-E . "8.0"))
dda00b2c 3549
c90c4cf1 3550(defface-mh mh-folder-deleted
6d21875b 3551 (mh-face-data 'mh-folder-msg-number '((t (:inherit mh-folder-msg-number))))
dda00b2c
BW
3552 "Deleted message face."
3553 :group 'mh-faces
23347d76 3554 :group 'mh-folder
70a1d47e 3555 :package-version '(MH-E . "8.0"))
dda00b2c 3556
c90c4cf1 3557(defface-mh mh-folder-followup (mh-face-data 'mh-folder-followup)
dda00b2c
BW
3558 "\"Re:\" face."
3559 :group 'mh-faces
23347d76 3560 :group 'mh-folder
70a1d47e 3561 :package-version '(MH-E . "8.0"))
dda00b2c 3562
c90c4cf1 3563(defface-mh mh-folder-msg-number (mh-face-data 'mh-folder-msg-number)
dda00b2c
BW
3564 "Message number face."
3565 :group 'mh-faces
23347d76 3566 :group 'mh-folder
70a1d47e 3567 :package-version '(MH-E . "8.0"))
dda00b2c 3568
c90c4cf1 3569(defface-mh mh-folder-refiled (mh-face-data 'mh-folder-refiled)
dda00b2c
BW
3570 "Refiled message face."
3571 :group 'mh-faces
23347d76 3572 :group 'mh-folder
70a1d47e 3573 :package-version '(MH-E . "8.0"))
dda00b2c 3574
c90c4cf1 3575(defface-mh mh-folder-sent-to-me-hint
6d21875b 3576 (mh-face-data 'mh-folder-msg-number '((t (:inherit mh-folder-date))))
dda00b2c
BW
3577 "Fontification hint face in messages sent directly to us.
3578The detection of messages sent to us is governed by the scan
3579format `mh-scan-format-nmh' and the regular expression
3580`mh-scan-sent-to-me-sender-regexp'."
3581 :group 'mh-faces
23347d76 3582 :group 'mh-folder
70a1d47e 3583 :package-version '(MH-E . "8.0"))
dda00b2c 3584
c90c4cf1 3585(defface-mh mh-folder-sent-to-me-sender
6d21875b 3586 (mh-face-data 'mh-folder-followup '((t (:inherit mh-folder-followup))))
dda00b2c
BW
3587 "Sender face in messages sent directly to us.
3588The detection of messages sent to us is governed by the scan
3589format `mh-scan-format-nmh' and the regular expression
3590`mh-scan-sent-to-me-sender-regexp'."
3591 :group 'mh-faces
23347d76 3592 :group 'mh-folder
70a1d47e 3593 :package-version '(MH-E . "8.0"))
dda00b2c 3594
c90c4cf1 3595(defface-mh mh-folder-subject (mh-face-data 'mh-folder-subject)
dda00b2c
BW
3596 "Subject face."
3597 :group 'mh-faces
23347d76 3598 :group 'mh-folder
70a1d47e 3599 :package-version '(MH-E . "8.0"))
dda00b2c 3600
c90c4cf1 3601(defface-mh mh-folder-tick (mh-face-data 'mh-folder-tick)
dda00b2c
BW
3602 "Ticked message face."
3603 :group 'mh-faces
23347d76 3604 :group 'mh-folder
70a1d47e 3605 :package-version '(MH-E . "8.0"))
dda00b2c 3606
c90c4cf1 3607(defface-mh mh-folder-to (mh-face-data 'mh-folder-to)
dda00b2c
BW
3608 "\"To:\" face."
3609 :group 'mh-faces
23347d76 3610 :group 'mh-folder
70a1d47e 3611 :package-version '(MH-E . "8.0"))
dda00b2c 3612
c90c4cf1 3613(defface-mh mh-letter-header-field (mh-face-data 'mh-letter-header-field)
dda00b2c
BW
3614 "Editable header field value face in draft buffers."
3615 :group 'mh-faces
23347d76 3616 :group 'mh-letter
70a1d47e 3617 :package-version '(MH-E . "8.0"))
dda00b2c 3618
c90c4cf1 3619(defface-mh mh-search-folder (mh-face-data 'mh-search-folder)
6d21875b
BW
3620 "Folder heading face in MH-Folder buffers created by searches."
3621 :group 'mh-faces
23347d76 3622 :group 'mh-search
70a1d47e 3623 :package-version '(MH-E . "8.0"))
6d21875b 3624
c90c4cf1 3625(defface-mh mh-show-cc (mh-face-data 'mh-show-cc)
dda00b2c
BW
3626 "Face used to highlight \"cc:\" header fields."
3627 :group 'mh-faces
23347d76 3628 :group 'mh-show
70a1d47e 3629 :package-version '(MH-E . "8.0"))
dda00b2c 3630
c90c4cf1 3631(defface-mh mh-show-date (mh-face-data 'mh-show-date)
dda00b2c
BW
3632 "Face used to highlight \"Date:\" header fields."
3633 :group 'mh-faces
23347d76 3634 :group 'mh-show
70a1d47e 3635 :package-version '(MH-E . "8.0"))
dda00b2c 3636
c90c4cf1 3637(defface-mh mh-show-from (mh-face-data 'mh-show-from)
dda00b2c
BW
3638 "Face used to highlight \"From:\" header fields."
3639 :group 'mh-faces
23347d76 3640 :group 'mh-show
70a1d47e 3641 :package-version '(MH-E . "8.0"))
dda00b2c 3642
c90c4cf1 3643(defface-mh mh-show-header (mh-face-data 'mh-show-header)
dda00b2c
BW
3644 "Face used to deemphasize less interesting header fields."
3645 :group 'mh-faces
23347d76 3646 :group 'mh-show
70a1d47e 3647 :package-version '(MH-E . "8.0"))
dda00b2c 3648
c90c4cf1 3649(defface-mh mh-show-pgg-bad (mh-face-data 'mh-show-pgg-bad)
dda00b2c
BW
3650 "Bad PGG signature face."
3651 :group 'mh-faces
23347d76 3652 :group 'mh-show
70a1d47e 3653 :package-version '(MH-E . "8.0"))
dda00b2c 3654
c90c4cf1 3655(defface-mh mh-show-pgg-good (mh-face-data 'mh-show-pgg-good)
dda00b2c
BW
3656 "Good PGG signature face."
3657 :group 'mh-faces
23347d76 3658 :group 'mh-show
70a1d47e 3659 :package-version '(MH-E . "8.0"))
dda00b2c 3660
c90c4cf1 3661(defface-mh mh-show-pgg-unknown (mh-face-data 'mh-show-pgg-unknown)
dda00b2c
BW
3662 "Unknown or untrusted PGG signature face."
3663 :group 'mh-faces
23347d76 3664 :group 'mh-show
70a1d47e 3665 :package-version '(MH-E . "8.0"))
dda00b2c 3666
c90c4cf1 3667(defface-mh mh-show-signature (mh-face-data 'mh-show-signature)
dda00b2c
BW
3668 "Signature face."
3669 :group 'mh-faces
23347d76 3670 :group 'mh-show
70a1d47e 3671 :package-version '(MH-E . "8.0"))
dda00b2c 3672
c90c4cf1 3673(defface-mh mh-show-subject
6d21875b 3674 (mh-face-data 'mh-folder-subject '((t (:inherit mh-folder-subject))))
dda00b2c
BW
3675 "Face used to highlight \"Subject:\" header fields."
3676 :group 'mh-faces
23347d76 3677 :group 'mh-show
70a1d47e 3678 :package-version '(MH-E . "8.0"))
dda00b2c 3679
c90c4cf1 3680(defface-mh mh-show-to (mh-face-data 'mh-show-to)
dda00b2c
BW
3681 "Face used to highlight \"To:\" header fields."
3682 :group 'mh-faces
23347d76 3683 :group 'mh-show
70a1d47e 3684 :package-version '(MH-E . "8.0"))
dda00b2c 3685
c90c4cf1 3686(defface-mh mh-show-xface
6d21875b 3687 (mh-face-data 'mh-show-from '((t (:inherit (mh-show-from highlight)))))
6d21875b 3688"X-Face image face.
dda00b2c
BW
3689The background and foreground are used in the image."
3690 :group 'mh-faces
23347d76 3691 :group 'mh-show
70a1d47e 3692 :package-version '(MH-E . "8.0"))
dda00b2c 3693
c90c4cf1 3694(defface-mh mh-speedbar-folder (mh-face-data 'mh-speedbar-folder)
dda00b2c
BW
3695 "Basic folder face."
3696 :group 'mh-faces
23347d76 3697 :group 'mh-speedbar
70a1d47e 3698 :package-version '(MH-E . "8.0"))
dda00b2c 3699
c90c4cf1 3700(defface-mh mh-speedbar-folder-with-unseen-messages
6d21875b
BW
3701 (mh-face-data 'mh-speedbar-folder
3702 '((t (:inherit mh-speedbar-folder :bold t))))
dda00b2c
BW
3703 "Folder face when folder contains unread messages."
3704 :group 'mh-faces
23347d76 3705 :group 'mh-speedbar
70a1d47e 3706 :package-version '(MH-E . "8.0"))
dda00b2c 3707
c90c4cf1 3708(defface-mh mh-speedbar-selected-folder
6d21875b 3709 (mh-face-data 'mh-speedbar-selected-folder)
dda00b2c
BW
3710 "Selected folder face."
3711 :group 'mh-faces
23347d76 3712 :group 'mh-speedbar
70a1d47e 3713 :package-version '(MH-E . "8.0"))
dda00b2c 3714
c90c4cf1 3715(defface-mh mh-speedbar-selected-folder-with-unseen-messages
6d21875b
BW
3716 (mh-face-data 'mh-speedbar-selected-folder
3717 '((t (:inherit mh-speedbar-selected-folder :bold t))))
dda00b2c
BW
3718 "Selected folder face when folder contains unread messages."
3719 :group 'mh-faces
23347d76 3720 :group 'mh-speedbar
70a1d47e 3721 :package-version '(MH-E . "8.0"))
f1ed9461 3722
bdcfe844
BW
3723(provide 'mh-e)
3724
cee9f5c6
BW
3725;; Local Variables:
3726;; indent-tabs-mode: nil
3727;; sentence-end-double-space: nil
3728;; End:
bdcfe844 3729
cee9f5c6 3730;; arch-tag: cce884de-bd37-4104-9963-e4439d5ed22b
c26cf6c8 3731;;; mh-e.el ends here