;;; mh-e.el --- GNU Emacs interface to the MH mail system
;; Copyright (C) 1985, 1986, 1987, 1988,
-;; 1990, 1992, 1993, 1994, 1995, 1997, 1999,
-;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; 1990, 1992, 1993, 1994, 1995, 1997, 1999,
+;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;; Free Software Foundation, Inc.
;; Author: Bill Wohler <wohler@newt.com>
;; Maintainer: Bill Wohler <wohler@newt.com>
-;; Version: 8.0.3+cvs
+;; Version: 8.2
;; Keywords: mail
;; This file is part of GNU Emacs.
;; MH-E is an Emacs interface to the MH mail system.
-;; MH-E is supported by GNU Emacs 21 and 22, as well as XEmacs 21
+;; MH-E is supported in GNU Emacs 21 and 22, as well as XEmacs 21
;; (except for versions 21.5.9-21.5.16). It is compatible with MH
;; versions 6.8.4 and higher, all versions of nmh, and GNU mailutils
-;; 0.4 and higher.
+;; 1.0 and higher. Gnus is also required; version 5.10 or higher is
+;; recommended.
;; MH (Message Handler) is a powerful mail reader. See
;; http://rand-mh.sourceforge.net/.
;; Provide functions to the rest of MH-E. However, mh-e.el must not
;; use any definitions in files that require mh-e from mh-loaddefs,
;; for if it does it will introduce a require loop.
-(require 'mh-loaddefs)
+(eval-and-compile
+ ;; Load it during compilation as well, since it defines the macro
+ ;; mh-require-cl.
+ (load "mh-loaddefs" nil 'nomessage))
(mh-require-cl)
;; Try to keep variables local to a single file. Provide accessors if
;; variables are shared. Use this section as a last resort.
-(defconst mh-version "8.0.3+cvs" "Version number of MH-E.")
+(defconst mh-version "8.2" "Version number of MH-E.")
;; Variants
"/usr/contrib/mh/bin/" ; BSDI
"/usr/pkg/bin/" ; NetBSD
"/usr/local/bin/"
- "/usr/local/bin/mu-mh/" ; GNU mailutils - default
- "/usr/bin/mu-mh/") ; GNU mailutils - packaged
+ "/usr/local/bin/mu-mh/" ; GNU mailutils MH - default
+ "/usr/bin/mu-mh/") ; GNU mailutils MH - packaged
"List of directories to search for variants of the MH variant.
The list `exec-path' is searched in addition to this list.
There's no need for users to modify this list. Instead add extra
(defvar mh-show-buffer nil
"Buffer that displays message for this folder.")
-(defvar mh-showing-mode nil
- "If non-nil, show the message in a separate window.")
+(define-minor-mode mh-showing-mode
+ "Minor mode to show the message in a separate window."
+ ;; FIXME: maybe this should be moved to mh-show.el.
+ :lighter " Show")
(defvar mh-view-ops nil
"Stack of operations that change the folder view.
The side effects are what is desired. Any output is assumed to be
an error and is shown to the user. The output is not read or
parsed by MH-E."
- (save-excursion
- (set-buffer (get-buffer-create mh-log-buffer))
+ (with-current-buffer (get-buffer-create mh-log-buffer)
(let* ((initial-size (mh-truncate-log-buffer))
(start (point))
(args (mh-list-to-string args)))
"In environment ENV, execute mh-command COMMAND with ARGS.
ENV is nil or a string of space-separated \"var=value\" elements.
Signals an error if process does not complete successfully."
- (save-excursion
- (set-buffer (get-buffer-create mh-temp-buffer))
+ (with-current-buffer (get-buffer-create mh-temp-buffer)
(erase-buffer)
(let ((process-environment process-environment))
;; XXX: We should purge the list that split-string returns of empty
`set-process-filter' for more details of FILTER.
ARGS are passed to COMMAND as command line arguments."
- (save-excursion
- (set-buffer (get-buffer-create mh-log-buffer))
+ (with-current-buffer (get-buffer-create mh-log-buffer)
(mh-truncate-log-buffer))
(let* ((process-connection-type nil)
(process (apply 'start-process
process))
(defun mh-exec-cmd-env-daemon (env command filter &rest args)
- "In ennvironment ENV, execute mh-command COMMAND in the background.
+ "In environment ENV, execute mh-command COMMAND in the background.
ENV is nil or a string of space-separated \"var=value\" elements.
Signals an error if process does not complete successfully.
(insert (if (integerp status)
(format "%s: exit code %d\n" command status)
(format "%s: %s\n" command status)))
- (save-excursion
- (let ((error-message (buffer-substring (point-min) (point-max))))
- (set-buffer (get-buffer-create mh-log-buffer))
+ (let ((error-message (buffer-substring (point-min) (point-max))))
+ (with-current-buffer (get-buffer-create mh-log-buffer)
(mh-truncate-log-buffer)
(insert error-message)))
(error "%s failed, check buffer %s for error message"
(defun mh-variant-info (dir)
"Return MH variant found in DIR, or nil if none present."
- (save-excursion
- (let ((tmp-buffer (get-buffer-create mh-temp-buffer)))
- (set-buffer tmp-buffer)
+ (let ((tmp-buffer (get-buffer-create mh-temp-buffer)))
+ (with-current-buffer tmp-buffer
(cond
((mh-variant-mh-info dir))
((mh-variant-nmh-info dir))
- ((mh-variant-mu-mh-info dir))))))
+ ((mh-variant-gnu-mh-info dir))))))
(defun mh-variant-mh-info (dir)
- "Return info for MH variant in DIR assuming a temporary buffer is setup."
+ "Return info for MH variant in DIR assuming a temporary buffer is set up."
;; MH does not have the -version option.
;; Its version number is included in the output of "-help" as:
;;
(mh-progs ,dir)
(flists nil)))))))))
-(defun mh-variant-mu-mh-info (dir)
- "Return info for GNU mailutils variant in DIR.
-This assumes that a temporary buffer is setup."
+(defun mh-variant-gnu-mh-info (dir)
+ "Return info for GNU mailutils MH variant in DIR.
+This assumes that a temporary buffer is set up."
;; 'mhparam -version' output:
;; mhparam (GNU mailutils 0.3.2)
(let ((mhparam (expand-file-name "mhparam" dir)))
(let ((version (match-string 1))
(mh-progs dir))
`(,version
- (variant mu-mh)
+ (variant gnu-mh)
(mh-lib-progs ,(mh-profile-component "libdir"))
(mh-lib ,(mh-profile-component "etcdir"))
(mh-progs ,dir)
(expand-file-name "flists" dir)))))))))
(defun mh-variant-nmh-info (dir)
- "Return info for nmh variant in DIR assuming a temporary buffer is setup."
+ "Return info for nmh variant in DIR assuming a temporary buffer is set up."
;; `mhparam -version' outputs:
;; mhparam -- nmh-1.1-RC1 [compiled on chaak at Fri Jun 20 11:03:28 PDT 2003]
(let ((mhparam (expand-file-name "mhparam" dir)))
(and (file-regular-p file) (file-executable-p file)))
(defun mh-variant-set-variant (variant)
- "Setup the system variables for the MH variant named VARIANT.
+ "Set up the system variables for the MH variant named VARIANT.
If VARIANT is a string, use that key in the alist returned by the
function `mh-variants'.
If VARIANT is a symbol, select the first entry that matches that
(defun mh-variant-p (&rest variants)
"Return t if variant is any of VARIANTS.
-Currently known variants are 'MH, 'nmh, and 'mu-mh."
+Currently known variants are 'MH, 'nmh, and 'gnu-mh."
(let ((variant-in-use
(cadr (assoc 'variant (assoc mh-variant-in-use (mh-variants))))))
(not (null (member variant-in-use variants)))))
(defun mh-profile-component (component)
"Return COMPONENT value from mhparam, or nil if unset."
(save-excursion
- ;; MH and nmh use -components, Mailutils uses -component. Since MH
- ;; and nmh work with an unambiguous prefix, the `s' is dropped here.
+ ;; MH and nmh use -components, GNU mailutils MH uses -component.
+ ;; Since MH and nmh work with an unambiguous prefix, the `s' is
+ ;; dropped here.
(mh-exec-cmd-quiet nil "mhparam" "-component" component)
(mh-profile-component-value component)))
Sets `mh-progs', `mh-lib', `mh-lib-progs' and
`mh-flists-present-flag'.
If the VARIANT is \"autodetect\", then first try nmh, then MH and
-finally GNU mailutils."
+finally GNU mailutils MH."
(interactive
(list (completing-read
"MH variant: "
(mapcar (lambda (x) (list (car x))) (mh-variants))
nil t)))
+
+ ;; TODO Remove mu-mh backwards compatibility in 9.0.
+ (when (and (stringp variant)
+ (string-match "^mu-mh" variant))
+ (message
+ (format "%s\n%s; %s" "The variant name mu-mh has been renamed to gnu-mh"
+ "and will be removed in MH-E 9.0"
+ "try M-x customize-option mh-variant"))
+ (sit-for 5)
+ (setq variant (concat "gnu-mh" (substring variant (match-end 0)))))
+
(let ((valid-list (mapcar (lambda (x) (car x)) (mh-variants))))
(cond
((eq variant 'none))
(message "%s installed as MH variant" mh-variant-in-use))
((mh-variant-set-variant 'mh)
(message "%s installed as MH variant" mh-variant-in-use))
- ((mh-variant-set-variant 'mu-mh)
+ ((mh-variant-set-variant 'gnu-mh)
(message "%s installed as MH variant" mh-variant-in-use))
(t
(message "No MH variant found on the system"))))
(message "Warning: %s variant not found. Autodetecting..." variant)
(mh-variant-set 'autodetect)))
(t
- (message "Unknown variant; use %s"
+ (message "Unknown variant %s; use %s"
+ variant
(mapconcat '(lambda (x) (format "%s" (car x)))
(mh-variants) " or "))))))
The default setting of this option is \"Auto-detect\" which means
that MH-E will automatically choose the first of nmh, MH, or GNU
-mailutils that it finds in the directories listed in
+mailutils MH that it finds in the directories listed in
`mh-path' (which you can customize), `mh-sys-path', and
`exec-path'. If MH-E can't find MH at all, you may have to
customize `mh-path' and add the directory in which the command
\"mhparam\" is located. If, on the other hand, you have both nmh
-and mailutils installed (for example) and `mh-variant-in-use' was
-initialized to nmh but you want to use mailutils, then you can
-set this option to \"mailutils\".
+and GNU mailutils MH installed (for example) and
+`mh-variant-in-use' was initialized to nmh but you want to use
+GNU mailutils MH, then you can set this option to \"gnu-mh\".
When this variable is changed, MH-E resets `mh-progs', `mh-lib',
`mh-lib-progs', `mh-flists-present-flag', and `mh-variant-in-use'
The default setting for this option is \"Use MH-E scan Format\". This
means that the format string will be taken from the either
`mh-scan-format-mh' or `mh-scan-format-nmh' depending on whether MH or
-nmh (or GNU mailutils) is in use. This setting also enables you to
+nmh (or GNU mailutils MH) is in use. This setting also enables you to
turn on the `mh-adaptive-cmd-note-flag' option.
You can also set this option to \"Use Default scan Format\" to get the
"X-HPL-"
"X-HR-"
"X-HTTP-UserAgent:"
+ "X-Hz" ; Hertz
"X-Identity:" ; http://www.declude.com/x-note.htm
"X-Image-URL:"
"X-IMAP:" ; http://people.dsv.su.se/~jpalme/ietf/mail-headers/
"X-PMX-Version:"
"X-Postfilter:"
"X-Priority:" ; MS Outlook
+ "X-Proofpoint-" ; Proofpoint mail filter
"X-Provags-ID:"
"X-PSTN-"
"X-Qotd-" ; User added
"X-Request-"
"X-Resolved-to:" ; fastmail.fm
"X-Return-Path-Hint:" ; Roving ConstantContact
+ "X-RIM-" ; Research In Motion (i.e. BlackBerry)
"X-RM"
"X-RocketYMMF:" ; Yahoo
"X-Roving-" ; Roving ConstantContact
:package-version '(MH-E . "8.0"))
(defcustom-mh mh-annotate-msg-hook nil
- "Hook run by `mh-annotate-msg' after annotation.
-Variables that are useful in this hook include `mh-current-folder',
-the current folder, and `mh-annotate-list', the messages annotated."
+ "Hook run whenever a message is sent and after the scan lines and message are annotated.
+Hook functions can access the current folder name with
+`mh-current-folder' and obtain the message numbers of the
+annotated messages with `mh-annotate-list'."
:type 'hook
:group 'mh-hooks
:group 'mh-sending-mail
:group 'mh-search
:package-version '(MH-E . "8.0"))
+(defcustom-mh mh-pack-folder-hook nil
+ "Hook run by \\<mh-folder-mode-map>\\[mh-pack-folder] after renumbering the messages.
+Hook functions can access the current folder name with `mh-current-folder'."
+ :type 'hook
+ :group 'mh-hooks
+ :group 'mh-folder
+ :package-version '(MH-E . "8.2"))
+
(defcustom-mh mh-quit-hook nil
"Hook run by \\<mh-folder-mode-map>\\[mh-quit] after quitting MH-E.