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