]> code.delx.au - gnu-emacs/blob - lisp/mh-e/mh-e.el
4cef92681ca8dec3c51116cdbcb17c87b40e98df
[gnu-emacs] / lisp / mh-e / mh-e.el
1 ;;; mh-e.el --- GNU Emacs interface to the MH mail system
2
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.
6
7 ;; Author: Bill Wohler <wohler@newt.com>
8 ;; Maintainer: Bill Wohler <wohler@newt.com>
9 ;; Version: 8.1
10 ;; Keywords: mail
11
12 ;; This file is part of GNU Emacs.
13
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.
18
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.
23
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/>.
26
27 ;;; Commentary:
28
29 ;; MH-E is an Emacs interface to the MH mail system.
30
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.
36
37 ;; MH (Message Handler) is a powerful mail reader. See
38 ;; http://rand-mh.sourceforge.net/.
39
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.
43
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.
48
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)
53
54 ;; If Emacs can't find mh-rmail or mh-smail, add the following to ~/.emacs:
55 ;; (require 'mh-autoloads)
56
57 ;; If you want to customize MH-E before explicitly loading it, add this:
58 ;; (require 'mh-cus-load)
59
60 ;; Mailing Lists:
61 ;; mh-e-users@lists.sourceforge.net
62 ;; mh-e-announce@lists.sourceforge.net
63 ;; mh-e-devel@lists.sourceforge.net
64
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
68
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.
73
74 ;; Feature Requests:
75 ;; https://sourceforge.net/tracker/?group_id=13357&atid=363357
76
77 ;; Support:
78 ;; https://sourceforge.net/tracker/?group_id=13357&atid=213357
79
80 ;;; Change Log:
81
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.
88
89 ;;; Code:
90
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)
95
96 (mh-require-cl)
97
98 (require 'mh-buffers)
99 (require 'mh-compat)
100
101 (mh-do-in-xemacs
102 (require 'mh-xemacs))
103
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)))))
123
124 \f
125
126 ;;; Global Variables
127
128 ;; Try to keep variables local to a single file. Provide accessors if
129 ;; variables are shared. Use this section as a last resort.
130
131 (defconst mh-version "8.1" "Version number of MH-E.")
132
133 ;; Variants
134
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'.")
150
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.")
155
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\".")
160
161 (defvar mh-progs nil
162 "Directory containing MH commands, such as inc, repl, and rmm.")
163
164 ;;;###autoload
165 (put 'mh-progs 'risky-local-variable t)
166
167 (defvar mh-lib nil
168 "Directory containing the MH library.
169 This directory contains, among other things, the components file.")
170
171 ;;;###autoload
172 (put 'mh-lib 'risky-local-variable t)
173
174 (defvar mh-lib-progs nil
175 "Directory containing MH helper programs.
176 This directory contains, among other things, the mhl program.")
177
178 ;;;###autoload
179 (put 'mh-lib-progs 'risky-local-variable t)
180
181 ;; Profile Components
182
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.")
187
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.")
192
193 (defvar mh-user-path nil
194 "Cached value of the \"Path:\" MH profile component.
195 User's mail folder directory.")
196
197 ;; Maps declared here so that they can be used in docstrings.
198
199 (defvar mh-folder-mode-map (make-keymap)
200 "Keymap for MH-Folder mode.")
201
202 (defvar mh-folder-seq-tool-bar-map nil
203 "Keymap for MH-Folder tool bar.")
204
205 (defvar mh-folder-tool-bar-map nil
206 "Keymap for MH-Folder tool bar.")
207
208 (defvar mh-inc-spool-map (make-sparse-keymap)
209 "Keymap for MH-E's mh-inc-spool commands.")
210
211 (defvar mh-letter-mode-map (copy-keymap text-mode-map)
212 "Keymap for MH-Letter mode.")
213
214 (defvar mh-letter-tool-bar-map nil
215 "Keymap for MH-Letter tool bar.")
216
217 (defvar mh-search-mode-map (make-sparse-keymap)
218 "Keymap for MH-Search mode.")
219
220 (defvar mh-show-mode-map (make-sparse-keymap)
221 "Keymap MH-Show mode.")
222
223 (defvar mh-show-seq-tool-bar-map nil
224 "Keymap for MH-Show tool bar.")
225
226 (defvar mh-show-tool-bar-map nil
227 "Keymap for MH-Show tool bar.")
228
229 ;; MH-Folder Locals (alphabetical)
230
231 (defvar mh-arrow-marker nil
232 "Marker for arrow display in fringe.")
233
234 (defvar mh-colors-available-flag nil
235 "Non-nil means colors are available.")
236
237 (defvar mh-current-folder nil
238 "Name of current folder, a string.")
239
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'.")
244
245 (defvar mh-folder-view-stack nil
246 "Stack of previous folder views.")
247
248 (defvar mh-index-data nil
249 "Info about index search results.")
250
251 (defvar mh-index-previous-search nil)
252
253 (defvar mh-index-msg-checksum-map nil)
254
255 (defvar mh-index-checksum-origin-map nil)
256
257 (defvar mh-index-sequence-search-flag nil)
258
259 (defvar mh-mode-line-annotation nil
260 "Message range displayed in buffer.")
261
262 (defvar mh-next-direction 'forward
263 "Direction to move to next message.")
264
265 (defvar mh-previous-window-config nil
266 "Window configuration before MH-E command.")
267
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'.")
272
273 (defvar mh-seen-list nil
274 "List of displayed messages to be removed from the \"Unseen\" sequence.")
275
276 (defvar mh-seq-list nil
277 "Alist of this folder's sequences.
278 Elements have the form (SEQUENCE . MESSAGES).")
279
280 (defvar mh-sequence-notation-history nil
281 "Remember original notation that is overwritten by `mh-note-seq'.")
282
283 (defvar mh-show-buffer nil
284 "Buffer that displays message for this folder.")
285
286 (defvar mh-showing-mode nil
287 "If non-nil, show the message in a separate window.")
288
289 (defvar mh-view-ops nil
290 "Stack of operations that change the folder view.
291 These operations include narrowing or threading.")
292
293 ;; MH-Show Locals (alphabetical)
294
295 (defvar mh-globals-hash (make-hash-table)
296 "Keeps track of MIME data on a per buffer basis.")
297
298 (defvar mh-show-folder-buffer nil
299 "Keeps track of folder whose message is being displayed.")
300
301 ;; MH-Letter Locals
302
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'.")
308
309 (defvar mh-mail-header-separator "--------"
310 "*Line used by MH to separate headers from text in messages being composed.
311
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.
317
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'.")
321
322 (defvar mh-sent-from-folder nil
323 "Folder of msg assoc with this letter.")
324
325 (defvar mh-sent-from-msg nil
326 "Number of msg assoc with this letter.")
327
328 ;; Sequences
329
330 (defvar mh-unseen-seq nil
331 "Cached value of the \"Unseen-Sequence:\" MH profile component.
332 Name of the Unseen sequence.")
333
334 (defvar mh-previous-seq nil
335 "Cached value of the \"Previous-Sequence:\" MH profile component.
336 Name of the Previous sequence.")
337
338 ;; Etc. (alphabetical)
339
340 (defvar mh-flists-present-flag nil
341 "Non-nil means that we have \"flists\".")
342
343 (defvar mh-index-data-file ".mhe_index"
344 "MH-E specific file where index seach info is stored.")
345
346 (defvar mh-letter-header-field-regexp "^\\([A-Za-z][A-Za-z0-9-]*\\):")
347
348 (defvar mh-page-to-next-msg-flag nil
349 "Non-nil means next SPC or whatever goes to next undeleted message.")
350
351 (defvar mh-pgp-support-flag (not (not (locate-library "mml2015")))
352 "Non-nil means PGP support is available.")
353
354 (defvar mh-signature-separator "-- \n"
355 "Text of a signature separator.
356
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.")
362
363 (defvar mh-signature-separator-regexp "^-- $"
364 "This regular expression matches the signature separator.
365 See `mh-signature-separator'.")
366
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)
370
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)
376
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.")
381
382 \f
383
384 ;;; MH-E Entry Points
385
386 (eval-when-compile (require 'gnus))
387
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)
393
394 (defun mh-run-time-gnus-version ()
395 "Return Gnus version available at run time."
396 (require 'gnus)
397 gnus-version)
398
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))
431
432 \f
433
434 ;;; Support Routines
435
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)))
439
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)))
454 (t
455 (error "Bad element: %s" element))))
456 new-list))
457
458 \f
459
460 ;;; MH-E Process Support
461
462 (defvar mh-index-max-cmdline-args 500
463 "Maximum number of command line args.")
464
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)))))
489
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 "\""))
499
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))))))
520
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))))))
537
538 (defun mh-exec-cmd-daemon (command filter &rest args)
539 "Execute MH command COMMAND in the background.
540
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.
544
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))
556
557 (defun mh-exec-cmd-env-daemon (env command filter &rest args)
558 "In environment ENV, execute mh-command COMMAND in the background.
559
560 ENV is nil or a string of space-separated \"var=value\" elements.
561 Signals an error if process does not complete successfully.
562
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.
566
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)))
572
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)))
580
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)))
599
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))
609
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))
616
617 ;; Shush compiler.
618 (defvar mark-active) ; XEmacs
619
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)))
634
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))
640
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)))
656
657 \f
658
659 ;;; MH-E Customization Support Routines
660
661 ;; Shush compiler (Emacs 21 and XEmacs).
662 (defvar customize-package-emacs-version-alist)
663
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))))
678
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)
688
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)
698
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)
708
709 \f
710
711 ;;; Variant Support
712
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"))
719
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)))
739
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))))))
749
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:
754 ;;
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)))))))))
780
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)))))))))
802
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)))))))))
822
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)))
826
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)))))
865
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)))))
872
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)))
881
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)
889 (t
890 (re-search-forward "[\t ]*\\([^\t \n].*\\)$" nil t)
891 (let ((start (match-beginning 1)))
892 (end-of-line)
893 (buffer-substring start (point)))))))
894
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)))
906
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)))))
916
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))
928 (t
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)))
934 (t
935 (message "Unknown variant %s; use %s"
936 variant
937 (mapconcat '(lambda (x) (format "%s" (car x)))
938 (mh-variants) " or "))))))
939
940 (defcustom-mh mh-variant 'autodetect
941 "*Specifies the variant used by MH-E.
942
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\".
953
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"))
967
968 \f
969
970 ;;; MH-E Customization
971
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.
976
977 ;; This section contains the following sub-sections:
978
979 ;; 1. MH-E Customization Groups
980
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 .
984
985 ;; 2. MH-E Customization
986
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.
991
992 ;; 3. Hooks
993
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.
998
999 ;; 4. Faces
1000
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.
1005
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)))
1014
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"))))
1020
1021 \f
1022
1023 ;;; MH-E Customization Groups
1024
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"))
1032
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"))
1039
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"))
1046
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"))
1053
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"))
1060
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"))
1067
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"))
1074
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"))
1081
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"))
1088
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"))
1095
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"))
1102
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"))
1109
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"))
1116
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"))
1123
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"))
1130
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"))
1137
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"))
1144
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"))
1151
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"))
1159
1160 \f
1161
1162 ;;; MH-E Customization
1163
1164 ;; See Variant Support, above, for mh-e group.
1165
1166 ;;; Aliases (:group 'mh-alias)
1167
1168 (defcustom-mh mh-alias-completion-ignore-case-flag t
1169 "*Non-nil means don't consider case significant in MH alias completion.
1170
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"))
1178
1179 (defcustom-mh mh-alias-expand-aliases-flag nil
1180 "*Non-nil means to expand aliases entered in the minibuffer.
1181
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"))
1188
1189 (defcustom-mh mh-alias-flash-on-comma t
1190 "*Specify whether to flash address or warn on translation.
1191
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"))
1201
1202 (defcustom-mh mh-alias-insert-file nil
1203 "*Filename used to store a new MH-E alias.
1204
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"))
1215
1216 (defcustom-mh mh-alias-insertion-location 'sorted
1217 "Specifies where new aliases are entered in alias files.
1218
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"))
1227
1228 (defcustom-mh mh-alias-local-users t
1229 "*Non-nil means local users are added to alias completion.
1230
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\".
1237
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.
1241
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"))
1248
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\".
1252
1253 For example, consider the following password file entry:
1254
1255 psg:x:1000:1000:Peter S Galbraith,,,:/home/psg:/bin/tcsh
1256
1257 The following settings of this option will produce the associated
1258 aliases:
1259
1260 \"local.\" local.peter.galbraith
1261 \"\" peter.galbraith
1262 Use Login psg
1263
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"))
1270
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.
1273
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"))
1282
1283 ;;; Organizing Your Mail with Folders (:group 'mh-folder)
1284
1285 (defcustom-mh mh-new-messages-folders t
1286 "Folders searched for the \"unseen\" sequence.
1287
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.
1292
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"))
1299
1300 (defcustom-mh mh-ticked-messages-folders t
1301 "Folders searched for `mh-tick-seq'.
1302
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.
1307
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"))
1314
1315 (defcustom-mh mh-large-folder 200
1316 "The number of messages that indicates a large folder.
1317
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"))
1326
1327 (defcustom-mh mh-recenter-summary-flag nil
1328 "*Non-nil means to recenter the summary window.
1329
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"))
1335
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"))
1341
1342 (defcustom-mh mh-sortm-args nil
1343 "*Additional arguments for \"sortm\"\\<mh-folder-mode-map>.
1344
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"))
1353
1354 ;;; Folder Selection (:group 'mh-folder-selection)
1355
1356 (defcustom-mh mh-default-folder-for-message-function nil
1357 "Function to select a default folder for refiling or \"Fcc:\".
1358
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"))
1367
1368 (defcustom-mh mh-default-folder-list nil
1369 "*List of addresses and folders.
1370
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.
1377
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"))
1385
1386 (defcustom-mh mh-default-folder-must-exist-flag t
1387 "*Non-nil means guessed folder name must exist to be used.
1388
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.
1393
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"))
1399
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.
1403
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"))
1409
1410 ;;; Identities (:group 'mh-identity)
1411
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)))
1418
1419 (defcustom-mh mh-identity-list nil
1420 "*List of identities.
1421
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\".
1426
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.
1441
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.
1446
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"))
1487
1488 (defcustom-mh mh-auto-fields-list nil
1489 "List of recipients for which header lines are automatically inserted.
1490
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\".
1496
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.
1512
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'.
1521
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"))
1548
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"))
1555
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"))
1566
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'.
1574
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.
1582
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.
1588
1589 The handler associated with the \":default\" field is used when no
1590 other field matches.
1591
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"))
1600
1601 ;;; Incorporating Your Mail (:group 'mh-inc)
1602
1603 (defcustom-mh mh-inc-prog "inc"
1604 "*Program to incorporate new mail into a folder.
1605
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"))
1614
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)))
1621
1622 (defcustom-mh mh-inc-spool-list nil
1623 "*Alternate spool files.
1624
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.
1629
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\":
1633
1634 MAILDIR=$HOME/mail
1635 :0:
1636 * ^From mh-e-devel-admin@stop.mail-abuse.org
1637 mh-e
1638
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\".
1643
1644 You can use \"xbuffy\" to automate the incorporation of this mail
1645 using the Emacs 22 command \"emacsclient\" as follows:
1646
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)'
1653
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"))
1664
1665 ;;; Dealing with Junk Mail (:group 'mh-junk)
1666
1667 (defvar mh-junk-choice nil
1668 "Chosen spam fighting program.")
1669
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.
1676
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.")
1680
1681 (defun mh-junk-choose (symbol value)
1682 "Choose spam program to use.
1683
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)))))
1694
1695 (defcustom-mh mh-junk-background nil
1696 "If on, spam programs are run in background.
1697
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.
1702
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"))
1712
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"))
1719
1720 (defcustom-mh mh-junk-program nil
1721 "Spam program that MH-E should use.
1722
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"))
1735
1736 ;;; Editing a Draft (:group 'mh-letter)
1737
1738 (defcustom-mh mh-compose-insertion (if (locate-library "mml") 'mml 'mh)
1739 "Type of tags used when composing MIME messages.
1740
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"))
1751
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"))
1759
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"))
1765
1766 (defcustom-mh mh-delete-yanked-msg-window-flag nil
1767 "*Non-nil means delete any window displaying the message.
1768
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"))
1775
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].
1778
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"))
1789
1790 (defcustom-mh mh-ins-buf-prefix "> "
1791 "*String to put before each line of a yanked or inserted message.
1792
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.
1798
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"))
1805
1806 (defcustom-mh mh-letter-complete-function 'ispell-complete-word
1807 "*Function to call when completing outside of address or folder fields.
1808
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"))
1815
1816 (defcustom-mh mh-letter-fill-column 72
1817 "*Fill column to use in MH Letter mode.
1818
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"))
1824
1825 (defcustom-mh mh-mml-method-default (if mh-pgp-support-flag "pgpmime" "none")
1826 "Default method to use in security tags.
1827
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\".
1832
1833 The `pgg' customization group may have some settings which may
1834 interest you (see Info node `(pgg)').
1835
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"))
1847
1848 (defcustom-mh mh-signature-file-name "~/.signature"
1849 "*Source of user's signature.
1850
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.
1855
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.
1863
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"))
1870
1871 (defcustom-mh mh-signature-separator-flag t
1872 "*Non-nil means a signature separator should be inserted.
1873
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"))
1881
1882 (defcustom-mh mh-x-face-file "~/.face"
1883 "*File containing face header field to insert in outgoing mail.
1884
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.
1889
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/').
1896
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').
1900
1901 The URL of any image can be used for the \"X-Image-URL:\" field and no
1902 processing of the image is required.
1903
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"))
1910
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].
1913
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\".
1918
1919 Choose \"Invoke supercite\" to pass the entire message and header
1920 through supercite.
1921
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.
1926
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.
1937
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.
1941
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"))
1955
1956 ;;; Ranges (:group 'mh-ranges)
1957
1958 (defcustom-mh mh-interpret-number-as-range-flag t
1959 "*Non-nil means interpret a number as a range.
1960
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"))
1968
1969 ;;; Scan Line Formats (:group 'mh-scan-line-formats)
1970
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))))
1977
1978 (defcustom-mh mh-adaptive-cmd-note-flag t
1979 "*Non-nil means that the message number width is determined dynamically.
1980
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\".
1986
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"))
1995
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)))
2006
2007 (defcustom-mh mh-scan-format-file t
2008 "Specifies the format file to pass to the scan program.
2009
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.
2015
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.
2021
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"))
2034
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)))
2045
2046 (defcustom-mh mh-scan-prog "scan"
2047 "*Program used to scan messages.
2048
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)
2058
2059 ;;; Searching (:group 'mh-search)
2060
2061 (defcustom-mh mh-search-program nil
2062 "Search program that MH-E shall use.
2063
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\".
2069
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"))
2081
2082 ;;; Sending Mail (:group 'mh-sending-mail)
2083
2084 (defcustom-mh mh-compose-forward-as-mime-flag t
2085 "*Non-nil means that messages are forwarded as attachments.
2086
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"))
2099
2100 (defcustom-mh mh-compose-letter-function nil
2101 "Invoked when starting a new draft.
2102
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"))
2111
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"))
2117
2118 (defcustom-mh mh-forward-subject-format "%s: %s"
2119 "*Format string for forwarded message subject.
2120
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"))
2127
2128 (defcustom-mh mh-insert-x-mailer-flag t
2129 "*Non-nil means append an \"X-Mailer:\" header field to the header.
2130
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"))
2137
2138 (defcustom-mh mh-redist-full-contents-flag nil
2139 "*Non-nil means the \"dist\" command needs entire letter for redistribution.
2140
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"))
2149
2150 (defcustom-mh mh-reply-default-reply-to nil
2151 "*Sets the person or persons to whom a reply will be sent.
2152
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"))
2165
2166 (defcustom-mh mh-reply-show-message-flag t
2167 "*Non-nil means the MH-Show buffer is displayed when replying.
2168
2169 If you include the message automatically, you can hide the
2170 MH-Show buffer by turning off this option.
2171
2172 See also `mh-reply'."
2173 :type 'boolean
2174 :group 'mh-sending-mail
2175 :package-version '(MH-E . "7.0"))
2176
2177 ;;; Sequences (:group 'mh-sequences)
2178
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
2182
2183 (defcustom-mh mh-refile-preserves-sequences-flag t
2184 "*Non-nil means that sequences are preserved when messages are refiled.
2185
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"))
2193
2194 (defcustom-mh mh-tick-seq 'tick
2195 "The name of the MH sequence for ticked messages.
2196
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"))
2205
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>.
2208
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"))
2220
2221 ;;; Reading Your Mail (:group 'mh-show)
2222
2223 (defcustom-mh mh-bury-show-buffer-flag t
2224 "*Non-nil means show buffer is buried.
2225
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"))
2233
2234 (defcustom-mh mh-clean-message-header-flag t
2235 "*Non-nil means remove extraneous header fields.
2236
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"))
2242
2243 (defcustom-mh mh-decode-mime-flag (not (not (locate-library "mm-decode")))
2244 "*Non-nil means attachments are handled\\<mh-folder-mode-map>.
2245
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.
2253
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"))
2260
2261 (defcustom-mh mh-display-buttons-for-alternatives-flag nil
2262 "*Non-nil means display buttons for all alternative attachments.
2263
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"))
2272
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>.
2275
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.
2284
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.
2289
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"))
2295
2296 (defcustom-mh mh-do-not-confirm-flag nil
2297 "*Non-nil means non-reversible commands do not prompt for confirmation.
2298
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"))
2307
2308 (defcustom-mh mh-fetch-x-image-url nil
2309 "*Control fetching of \"X-Image-URL:\" header field image.
2310
2311 Ths option controls the fetching of the \"X-Image-URL:\" header
2312 field image with the following values:
2313
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.
2320
2321 Never Fetch
2322 Images are never fetched and only displayed if they are
2323 already present in the cache. This is the default.
2324
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.
2331
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'.
2335
2336 This setting only has effect if the option `mh-show-use-xface-flag' is
2337 turned on."
2338
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"))
2343
2344 (defcustom-mh mh-graphical-smileys-flag t
2345 "*Non-nil means graphical smileys are displayed.
2346
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 ;-).
2352
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"))
2358
2359 (defcustom-mh mh-graphical-emphasis-flag t
2360 "*Non-nil means graphical emphasis is displayed.
2361
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.
2369
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"))
2375
2376 (defcustom-mh mh-highlight-citation-style 'gnus
2377 "Style for highlighting citations.
2378
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"))
2391
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
2405
2406 ;; Keep fields alphabetized (set sort-fold-case to t first).
2407 ;; Mention source, if known.
2408 (defvar mh-invisible-header-fields-internal
2409 '(
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
2719 )
2720 "List of default header fields that are not to be shown.
2721
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'.")
2726
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)))
2733
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.")
2739
2740 (defcustom-mh mh-invisible-header-fields nil
2741 "*Additional header fields to hide.
2742
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.
2749
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').
2753
2754 See also `mh-clean-message-header-flag'."
2755
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"))
2762
2763 (defcustom-mh mh-invisible-header-fields-default nil
2764 "*List of hidden header fields.
2765
2766 The header fields listed in this option are hidden, although you
2767 can check off any field that you would like to see.
2768
2769 Header fields that you would like to hide that aren't listed can
2770 be added to the option `mh-invisible-header-fields'.
2771
2772 See also `mh-clean-message-header-flag'.
2773
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"))
2784
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'.")
2791
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
2811 "^"
2812 ;; workaround for insufficient default
2813 (let ((max-specpdl-size 1000))
2814 (regexp-opt fields t))))
2815 (setq mh-invisible-header-fields-compiled nil))))
2816
2817 ;; Compile invisible header fields.
2818 (mh-invisible-headers)
2819
2820 (defcustom-mh mh-lpr-command-format "lpr -J '%s'"
2821 "*Command used to print\\<mh-folder-mode-map>.
2822
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.
2830
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"))
2836
2837 (defcustom-mh mh-max-inline-image-height nil
2838 "*Maximum inline image height if \"Content-Disposition:\" is not present.
2839
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"))
2852
2853 (defcustom-mh mh-max-inline-image-width nil
2854 "*Maximum inline image width if \"Content-Disposition:\" is not present.
2855
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"))
2868
2869 (defcustom-mh mh-mhl-format-file nil
2870 "*Specifies the format file to pass to the \"mhl\" program.
2871
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)\".
2876
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.
2879
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"))
2892
2893 (defcustom-mh mh-mime-save-parts-default-directory t
2894 "Default directory to use for \\<mh-folder-mode-map>\\[mh-mime-save-parts].
2895
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"))
2908
2909 (defcustom-mh mh-print-background-flag nil
2910 "*Non-nil means messages should be printed in the background\\<mh-folder-mode-map>.
2911
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.
2915
2916 WARNING: If you do this, do not delete the message until it is printed
2917 or else the output may be truncated.
2918
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"))
2924
2925 (defcustom-mh mh-show-maximum-size 0
2926 "*Maximum size of message (in bytes) to display automatically.
2927
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"))
2934
2935 (defcustom-mh mh-show-use-xface-flag (>= emacs-major-version 21)
2936 "*Non-nil means display face images in MH-show buffers.
2937
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.
2944
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.
2948
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/').
2959
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.
2968
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"))
2974
2975 (defcustom-mh mh-store-default-directory nil
2976 "*Default directory for \\<mh-folder-mode-map>\\[mh-store-msg].
2977
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"))
2986
2987 (defcustom-mh mh-summary-height nil
2988 "*Number of lines in MH-Folder buffer (including the mode line).
2989
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"))
2999
3000 ;;; The Speedbar (:group 'mh-speedbar)
3001
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"))
3008
3009 ;;; Threading (:group 'mh-thread)
3010
3011 (defcustom-mh mh-show-threads-flag nil
3012 "*Non-nil means new folders start in threaded mode.
3013
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"))
3021
3022 ;;; The Tool Bar (:group 'mh-tool-bar)
3023
3024 ;; mh-tool-bar-folder-buttons and mh-tool-bar-letter-buttons defined
3025 ;; dynamically in mh-tool-bar.el.
3026
3027 (defcustom-mh mh-tool-bar-search-function 'mh-search
3028 "*Function called by the tool bar search button.
3029
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"))
3037
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.
3042
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"))
3055
3056 (defcustom-mh mh-xemacs-tool-bar-position nil
3057 "*Tool bar location.
3058
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")))
3073
3074 \f
3075
3076 ;;; Hooks (:group 'mh-hooks + group where hook described)
3077
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.
3080
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"))
3089
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"))
3096
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"))
3106
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.
3109
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"))
3117
3118 (defcustom-mh mh-before-quit-hook nil
3119 "Hook run by \\<mh-folder-mode-map>\\[mh-quit] before quitting MH-E.
3120
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.
3124
3125 See also `mh-quit-hook'."
3126 :type 'hook
3127 :group 'mh-hooks
3128 :group 'mh-folder
3129 :package-version '(MH-E . "6.0"))
3130
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.
3133
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"))
3141
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.
3144
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"))
3151
3152 (defcustom-mh mh-find-path-hook nil
3153 "Hook run by `mh-find-path' after reading the user's MH profile.
3154
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"))
3162
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"))
3169
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"))
3176
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"))
3183
3184 (defcustom-mh mh-insert-signature-hook nil
3185 "Hook run by \\<mh-letter-mode-map>\\[mh-insert-signature] after signature has been inserted.
3186
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"))
3194
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].
3197
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.
3201
3202 The default value of `mh-search-p' suppresses the prompt on
3203 folders generated by searching.
3204
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"))
3212
3213 (defcustom-mh mh-letter-mode-hook nil
3214 "Hook run by `mh-letter-mode' on a new letter.
3215
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"))
3225
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"))
3232
3233 (defcustom-mh mh-search-mode-hook nil
3234 "Hook run upon entry to `mh-search-mode'\\<mh-folder-mode-map>.
3235
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"))
3244
3245 (defcustom-mh mh-quit-hook nil
3246 "Hook run by \\<mh-folder-mode-map>\\[mh-quit] after quitting MH-E.
3247
3248 This hook is not run in an MH-E context, so you might use it to
3249 modify the window setup.
3250
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"))
3256
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"))
3263
3264 (defcustom-mh mh-show-hook nil
3265 "Hook run after \\<mh-folder-mode-map>\\[mh-show] shows a message.
3266
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"))
3274
3275 (defcustom-mh mh-show-mode-hook nil
3276 "Hook run upon entry to `mh-show-mode'.
3277
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"))
3285
3286 (defcustom-mh mh-unseen-updated-hook nil
3287 "Hook run after the unseen sequence has been updated.
3288
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"))
3296
3297 \f
3298
3299 ;;; Faces (:group 'mh-faces + group where faces described)
3300
3301 (if (boundp 'facemenu-unlisted-faces)
3302 (add-to-list 'facemenu-unlisted-faces "^mh-"))
3303
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"))
3316 (t
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))
3338 (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"))
3345 (t
3346 (:bold t))))
3347 (mh-folder-tick
3348 ((((class color) (background light))
3349 (:background "#dddf7e"))
3350 (((class color) (background dark))
3351 (:background "#dddf7e"))
3352 (t
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))
3365 (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"))
3372 (t
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))
3379 (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))
3392 (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))
3405 (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"))
3412 (t
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))
3425 (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))
3451 (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'.")
3456
3457 (require 'cus-face)
3458
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.")
3463
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.")
3467
3468 (defun mh-face-data (face &optional inherit)
3469 "Return spec for FACE.
3470 See `defface' for the spec definition.
3471
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.
3478
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)))))
3489
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)
3498 nil
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))))
3507
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"))
3514
3515 (defface-mh mh-folder-body
3516 (mh-face-data 'mh-folder-msg-number
3517 '((((class color))
3518 (:inherit mh-folder-msg-number))
3519 (t
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"))
3525
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"))
3533
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"))
3540
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"))
3547
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"))
3553
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"))
3559
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"))
3565
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"))
3575
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"))
3585
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"))
3591
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"))
3597
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"))
3603
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"))
3609
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"))
3615
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"))
3621
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"))
3627
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"))
3633
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"))
3639
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"))
3645
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"))
3651
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"))
3657
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"))
3663
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"))
3670
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"))
3676
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"))
3684
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"))
3690
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"))
3698
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"))
3705
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"))
3713
3714 (provide 'mh-e)
3715
3716 ;; Local Variables:
3717 ;; indent-tabs-mode: nil
3718 ;; sentence-end-double-space: nil
3719 ;; End:
3720
3721 ;; arch-tag: cce884de-bd37-4104-9963-e4439d5ed22b
3722 ;;; mh-e.el ends here