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