Commit 3d7ca223 authored by Bill Wohler's avatar Bill Wohler

Upgraded to MH-E version 7.2.

See etc/MH-E-NEWS and lisp/mh-e/ChangeLog for details.
parent 6ed82072
2003-02-03 Bill Wohler <>
* MH-E-NEWS: Upgraded to MH-E version 7.2.
2003-01-31 Joe Buehler <>
* MACHINES: Added Cygwin.
* Changes in mh-e 7.1
* Changes in MH-E 7.2
This release includes the new features of filing hints, hierarchical
file name completion, indexed search and pick integration, unification
between `mh-visit-folder' and the speedbar, a displayed message
indicator, buffer name organization, support for mairix indexed
search, and last but not least, the MH-E logo has been added to the
mode line. Code that handles sequences and message regions runs
faster. Bugs have been fixed.
** New Features in MH-E 7.2
*** Filing Hints
When you file a message, MH-E now looks for an alias corresponding to
the address of the sender and offers that as a default folder (closes
SF #657096). The new variable `mh-default-folder-prefix' can be used
to put these folders in a sub-folder. The new variable
`mh-default-folder-must-exist-flag' means to suppress the suggested
folder (thereby providing the previous folder used) if the folder
doesn't already exist. The new variable `mh-default-folder-list' can
be used to map additional addresses and folders.
*** Hierarchical File Name Completion
When you completed filenames in the past, you were presented with a
list of all your folders at all depths in the tree. Now you are
presented with only one level at a time (closes SF #664821).
As a result, the variables `mh-auto-folder-collect-flag' and
`mh-folder-list-change-hook' are obsolete.
*** Indexed Search and Pick Integration
The indexed and pick searches have been integrated (closes SF
#664816). Both "F s (mh-search-folder)" and "F i (mh-index-search)"
use the pick template for forming queries. To submit the query, use
"C-c C-c (mh-do-search)" which will use the query method you selected.
If you change your mind while forming the query, you can use "C-c C-i
(mh-index-do-search)" or "C-c C-p (mh-pick-do-search)" to submit the
query using the respective method.
Second, the results from a pick search are now saved in a sub-folder
of +mhe-index like an indexed search.
Third, `pick' is now a valid choice for `mh-index-program'.
*** mh-visit-folder Metamorphosis Continues
When visiting a folder from the speedbar, only the unseen messages are
shown if there are unseen messages. If there aren't any unseen
messages, all of the messages are shown if there are fewer than
`mh-large-folder' messages; otherwise, the user is prompted for the
range of messages to display. The "F v (mh-visit-folder)" command has
been modified to mimic this behavior. Use a prefix arg to force the
message range prompt.
*** Displayed Message Indicator
In graphical Emacs, the message that is shown is marked by a triangle
in the fringe. In textual Emacs, there is a ">" in the first column
(closes SF #664824).
*** Buffer Name Organization
All ephemeral buffer names start with " *mh" while all interesting
buffers start with "*MH-E ". The "*Folders*", "*Sequences*", and
"*Recipients*" buffers were therefore renamed to "*MH-E Folders*",
"*MH-E Sequences*" and "*MH-E Recipients*" respectively (programmers
should see mh-utils.el for the names of the new constants). Also, the
output of MH commands is saved in the "*MH-E Log*" buffer.
*** mh-index-program
Add choices for `mairix' and `pick'.
*** Logo Displayed on Mode Line
** New Variables in MH-E 7.2
The new variables have been discussed elsewhere.
** Bug Fixes in MH-E 7.2
*** mh-decode-content-transfer-encoded-message
Messages that had been encoded with base64 were not decoded. This has
been fixed with this new function (closes SF #674190). As a result,
the variable `mh-decode-quoted-printable-flag' has been renamed to
*** mh-kill-folder
Now restores previous window configuration (closes SF #664828).
*** mh-mime-display
MH-E was not using the charset defined in the content-type
header. This meant that mail in a different charset would not
be properly displayed. This has been fixed (closes SF #655123).
*** mh-read-address
In XEmacs and Emacs20, this function would always prompt using "To: "
instead of using the command argument. This has been fixed (closes SF
*** mh-rmail
Unseen messages are now shown in addition to new ones (closes SF
*** mh-scan-msg-overflow-regexp
Change the variable so that a space is always maintained in the
beginning of the scan line.
*** mh-swish-execute-search
The example configuration file in the docstring didn't show the
backslash in the FileRules filename. If the example had been used
literally by the user, no files would be indexed! This has been fixed
(closes SF #665888).
*** mh-thread-refile
The "T o (mh-thread-refile)" command did not provide refiling hints
like `mh-refile-msg'. This has been fixed (closes SF #664829).
*** mh-toggle-threads
If the threaded view was modified and then toggled, the standard view
may not have been accurate (as it contained a potentially old first
message to last message range). This has been fixed (closes SF
*** mh-tool-bar-show-set, mh-tool-bar-letter-set, mh-tool-bar-folder-set
Clicking the customize and help buttons now deletes the other windows
in the frame.
*** mh-version
The "M-x mh-version" command displayed "Aliasfile: aliases". This has
been fixed (closes SF #664467). See Buffer Name Organization above.
* Changes in MH-E 7.1
This release includes the new features of multiple identities and
alias completion. In addition, indexed searching has been revamped.
......@@ -204,7 +351,7 @@ changed (closes SF #643701).
* Changes in mh-e 7.0
* Changes in MH-E 7.0
This is a major release which includes a lot of new features including
improved MIME handling, speedbar folder browsing, and indexed
......@@ -95,7 +95,7 @@ You can now put the init files .emacs and .emacs_SHELL under
** MH-E changes.
Upgraded to MH-E version 7.1. There have been major changes since
Upgraded to MH-E version 7.2. There have been major changes since
version 5.0.2; see MH-E-NEWS for details.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -91,6 +91,10 @@
;; `mh-alias-insert-file'). In particular, there is a tool-bar icon to grab
;; an alias from the From line of the current message.
;;; Change Log:
;; $Id: mh-alias.el,v 1.25 2003/01/27 04:16:47 wohler Exp $
;;; Code:
(require 'mh-e)
......@@ -283,7 +287,7 @@ Blind aliases or users from /etc/passwd are not expanded."
(multi-prompt "," nil prompt mh-alias-alist nil nil))
(completing-read "To: " mh-alias-alist nil nil)
(completing-read prompt mh-alias-alist nil nil)
(if (not mh-alias-expand-aliases-flag)
(mapconcat 'identity the-answer ", ")
......@@ -447,14 +451,14 @@ Set `mh-alias-insert-file' or set AliasFile in your .mh_profile file"))
(completing-read "Alias file [press Tab]: "
(mapcar 'list autolist) nil t))))))))
(defun mh-alias-address-to-alias (address)
"Return the ADDRESS alias if defined, or nil."
(let* ((aliases (mh-alias-ali address t)))
(if (string-equal aliases address)
nil ; ali returned same string -> no.
;; For the comma-separated aliases reyurned by ali, check that one of
;; them doesn't expand into a list. e.g. we do have an individual
;; alias for that adress.
;; Double-check that we have an individual alias. This means that the
;; alias doesn't expand into a list (of which this address is part).
(car (delq nil (mapcar
(lambda (alias)
......@@ -501,7 +505,7 @@ after it."
((string-match "^a" answer)
(forward-line 1))
error "Quitting."))))
(error "Quitting")))))
;; No, so sort-in at the right place
;; search for "^alias", then "^alia", etc.
((eq mh-alias-insertion-location 'sorted)
......@@ -30,7 +30,7 @@
;;; Change Log:
;; $Id: mh-comp.el,v 1.26 2003/01/08 23:21:16 wohler Exp $
;; $Id: mh-comp.el,v 1.173 2003/01/26 19:37:22 jchonig Exp $
;;; Code:
......@@ -461,7 +461,7 @@ setting of the variable `mh-redist-full-contents'. See its documentation."
"-component" "Resent:"
"-text" (format "\"%s %s\"" to cc))
(if mh-redist-background
(mh-exec-cmd-daemon "/bin/sh" "-c"
(mh-exec-cmd-daemon "/bin/sh" nil "-c"
(format "mhdist=1 mhaltmsg=%s %s %s %s"
(if mh-redist-full-contents
......@@ -1038,12 +1038,18 @@ called, with no arguments, before the signature is actually inserted."
(let ((file-name buffer-file-name))
(message "Checking recipients...")
(mh-in-show-buffer ("*Recipients*")
(mh-in-show-buffer (mh-recipients-buffer)
(bury-buffer (current-buffer))
(mh-exec-cmd-output "whom" t file-name))
(message "Checking recipients...done")))
(defun mh-tidy-draft-buffer ()
"Run when a draft buffer is destroyed."
(let ((buffer (get-buffer mh-recipients-buffer)))
(if buffer
(kill-buffer buffer))))
;;; Routines to compose and send a letter.
......@@ -1067,20 +1073,29 @@ The versions of MH-E, Emacs, and MH are shown."
;; Lazily initialize mh-x-mailer-string.
(when (null mh-x-mailer-string)
(set-buffer mh-temp-buffer)
(if mh-nmh-flag
(search-forward-regexp "^nmh-\\(\\S +\\)")
(search-forward-regexp "^MH \\(\\S +\\)" nil t))
(let ((x-mailer-mh (buffer-substring (match-beginning 1) (match-end 1))))
(setq mh-x-mailer-string
(format "MH-E %s; %s %s; %s %d.%d"
mh-version (if mh-nmh-flag "nmh" "MH") x-mailer-mh
(if mh-xemacs-flag
emacs-major-version emacs-minor-version)))
(kill-buffer mh-temp-buffer)))
;; User would be confused if version info buffer disappeared magically,
;; so don't delete buffer if it already existed.
(let ((info-buffer-exists-p (get-buffer mh-info-buffer)))
(set-buffer mh-info-buffer)
(if mh-nmh-flag
(search-forward-regexp "^nmh-\\(\\S +\\)")
(search-forward-regexp "^MH \\(\\S +\\)" nil t))
(let ((x-mailer-mh (buffer-substring (match-beginning 1)
(match-end 1))))
(setq mh-x-mailer-string
(format "MH-E %s; %s %s; %sEmacs %s"
mh-version (if mh-nmh-flag "nmh" "MH") x-mailer-mh
(if mh-xemacs-flag "X" "GNU ")
(cond ((not mh-xemacs-flag) emacs-version)
((string-match "[0-9.]*\\( +\([ a-z]+[0-9]+\)\\)?"
(match-string 0 emacs-version))
(t (format "%s.%s"
(if (not info-buffer-exists-p)
(kill-buffer mh-info-buffer)))))
;; Insert X-Mailer, but only if it doesn't already exist.
(when (null (mh-goto-header-field "X-Mailer"))
......@@ -1152,7 +1167,9 @@ CONFIG is the window configuration to restore after sending the letter."
(setq mh-annotate-char annotate-char)
(setq mh-annotate-field annotate-field)
(setq mh-previous-window-config config)
(setq mode-line-buffer-identification (list "{%b}"))
(setq mode-line-buffer-identification (list " {%b}"))
(add-hook 'kill-buffer-hook 'mh-tidy-draft-buffer nil t)
(if (and (boundp 'mh-compose-letter-function)
;; run-hooks will not pass arguments.
......@@ -1223,7 +1240,7 @@ Insert X-Face field if the file specified by `mh-x-face-file' exists."
(recenter -1)
(set-buffer draft-buffer)) ; for annotation below
(mh-exec-cmd-daemon mh-send-prog "-nodraftfolder" "-noverbose"
(mh-exec-cmd-daemon mh-send-prog nil "-nodraftfolder" "-noverbose"
mh-send-args file-name)))
(if mh-annotate-char
(mh-annotate-msg mh-sent-from-msg
......@@ -55,15 +55,21 @@
;;; Change Log:
;; $Id: mh-customize.el,v 1.1 2003/01/08 23:21:16 wohler Exp $
;; $Id: mh-customize.el,v 1.30 2003/02/02 17:28:50 wohler Exp $
;;; Code:
(provide 'mh-customize)
(require 'mh-e)
(defun mh-customize ()
"Customize MH-E variables."
(customize-group 'mh))
(defun mh-customize (&optional delete-other-windows-flag)
"Customize MH-E variables.
With optional argument DELETE-OTHER-WINDOWS-FLAG, other windows in the frame
are removed."
(interactive "P")
(customize-group 'mh)
(when delete-other-windows-flag
;;; MH-E Customization Groups
......@@ -326,13 +332,14 @@ See `mh-search-folder' and `mh-index-search' for details."
(if (member mh-tool-bar-item-prefs mh-tool-bar-folder-buttons)
(tool-bar-add-item "preferences" (lambda ()
(customize-group "mh"))
(mh-customize t))
:help mh-tool-bar-item-prefs))
(if (member mh-tool-bar-item-help mh-tool-bar-folder-buttons)
(tool-bar-add-item "help" (lambda ()
(Info-goto-node "(mh-e)Top"))
(Info-goto-node "(mh-e)Top")
:help mh-tool-bar-item-help))
......@@ -373,13 +380,14 @@ See `mh-search-folder' and `mh-index-search' for details."
(if (member mh-tool-bar-item-comp-prefs mh-tool-bar-letter-buttons)
(tool-bar-add-item "preferences" (lambda ()
(customize-group "mh-compose"))
(mh-customize t))
:help mh-tool-bar-item-comp-prefs))
(if (member mh-tool-bar-item-help mh-tool-bar-letter-buttons)
(tool-bar-add-item "help" (lambda ()
(Info-goto-node "(mh-e)Draft Editing"))
(Info-goto-node "(mh-e)Draft Editing")
:help mh-tool-bar-item-help))
......@@ -485,13 +493,14 @@ See `mh-search-folder' and `mh-index-search' for details."
(if (member mh-tool-bar-item-prefs mh-tool-bar-folder-buttons)
(tool-bar-add-item "preferences" (lambda ()
(customize-group "mh"))
(mh-customize t))
:help mh-tool-bar-item-prefs))
(if (member mh-tool-bar-item-help mh-tool-bar-folder-buttons)
(tool-bar-add-item "help" (lambda ()
(Info-goto-node "(mh-e)Top"))
(Info-goto-node "(mh-e)Top")
:help mh-tool-bar-item-help))
......@@ -631,6 +640,8 @@ be updated manually with the \\[mh-speed-flists] command."
:type 'boolean
:group 'mh-speed)
;;; Options for controlling scan listing (:group 'mh-folder)
(defcustom mh-adaptive-cmd-note-flag t
......@@ -646,13 +657,37 @@ If you prefer fixed-width message numbers, set this variable to nil and call
:type 'boolean
:group 'mh-folder)
(defcustom mh-auto-folder-collect-flag t
"*Non-nil means to collect all folder names at startup in the background.
Otherwise, the internal list of folder names is built as folders are
(defcustom mh-default-folder-list nil
"*Alist of addresses and folders.
When refiling messages, these folders are the default that is provided if the
sender has the associated address. You do not need to list your aliases here
as that lookup is already performed.
See `mh-prompt-for-refile-folder' and `mh-folder-from-address' for more
:type '(repeat (list (string :tag "Address")
(string :tag "Folder")))
:group 'mh-folder)
(defcustom mh-default-folder-must-exist-flag t
"*Non-nil means guessed folder name must exist to be used.
If this variable is t, then the guessed name is only used if the folder
already exists\; if the folder doesn't exist, then the last folder name used
is suggested. This is useful if you get mail from various people for whom you
have an alias, but file them all in the same project folder.
See `mh-prompt-for-refile-folder' and `mh-folder-from-address' for more
:type 'boolean
:group 'mh-folder)
(defcustom mh-default-folder-prefix ""
"*Prefix used for guessed folder names.
This can be used to put folders associated with your aliases in a sub-folder
so as to not clutter your mail directory.
See `mh-prompt-for-refile-folder' and `mh-folder-from-address' for more
:type 'string
:group 'mh-folder)
(defcustom mh-inc-prog "inc"
"*Program to run to incorporate new mail into a folder.
Normally \"inc\". This file is searched for relative to
......@@ -742,6 +777,8 @@ display MIME content using \"M-! mhshow RET\""
:type 'boolean
:group 'mh-folder)
;;; Message display (:group 'mh-show)
(defcustom mh-bury-show-buffer-flag t
......@@ -761,18 +798,18 @@ what is removed."
:type 'boolean
:group 'mh-show)
(defcustom mh-decode-quoted-printable-flag
(not (null (and (fboundp 'executable-find)(executable-find "mimedecode"))))
"Non-nil means decode quoted-printable MIME part with `mimedecode'.
(defcustom mh-decode-content-transfer-encoded-message-flag
(and (fboundp 'executable-find) (executable-find "mimencode") t)
"Non-nil means decode messages with `mimencode', if necessary.
Quoted-printable message parts are translated to 8-bit characters by the
`mimedecode' command. However, unless there is only one quoted-printable body
part, Gnus will have already decoded the quoted-printable parts.
Messages which are encoded as quoted-printable or base64 are translated into
8-bit characters by the `mimencode' command.
This variable is initialized t if `mimedecode' is available.
This variable is initialized to t if `mimencode' is available.
The source code for `mimedecode' can be obtained from"
The `mimencode' program is part of the metamail package. The source can be
obtained from"
:type 'boolean
:group 'mh-show)
......@@ -812,7 +849,7 @@ list. The setting only has effect if `mh-decode-mime-flag' is non-nil."
(defcustom mh-highlight-citation-p 'gnus
"How to highlight citations in show buffers.
The gnus method uses a different color for each indentation."
:type '(choice (const :tag "Use gnus" gnus)
:type '(choice (const :tag "Use Gnus" gnus)
(const :tag "Use font-lock" font-lock)
(const :tag "Don't fontify" nil))
:group 'mh-show)
......@@ -906,12 +943,11 @@ Done using `mh-invisible-header-fields' as input."
(setq mh-invisible-headers
(let ((max-specpdl-size 1000)) ;workaround for insufficient default
(if (not mh-show-use-xface-flag)
'("X-Face: "))
(let ((max-specpdl-size 1000) ;workaround for insufficient default
(fields (append (if (not mh-show-use-xface-flag)
'("X-Face: "))
(regexp-opt fields t)))))
(defun mh-invisible-header-fields-set (symbol value)
"Update `mh-invisible-header-fields'.
......@@ -1003,6 +1039,7 @@ variable `mh-invisible-fields' is set."
"X-Mailing-List: " ; Unknown mailing list managers
"X-Mailman-Version: " ; Mailman mailing list manager
"X-MHE-Checksum" ; Checksum added during index search
"X-MimeOLE: " ; MS Outlook
"X-Mozilla-Status: " ; Netscape/Mozilla
"X-Msmail-" ; MS Outlook
......@@ -1044,19 +1081,21 @@ variable `mh-invisible-fields' is set."
"X400-" ; X400
"Xref: ")
"*List of header fields that are not to be shown.
Regexps are not allowed. Unique fields should have a \": \" suffix;
otherwise, the element can be used to render an entire class of fields
that start with the same prefix invisible.
Regexps are not allowed. Unique fields should have a \": \" suffix; otherwise,
the element can be used to render invisible an entire class of fields that
start with the same prefix.
This variable is ignored if `mh-visible-headers' is set."
:type '(repeat (string :tag "Header field"))
:set 'mh-invisible-header-fields-set
:group 'mh-show)
;;; Composing messages (:group 'mh-letter)
(defcustom mh-compose-insertion (if (locate-library "mml") 'gnus 'mhn)
"Use either 'gnus or 'mhn to insert MIME message directives in messages."
:type '(choice (const :tag "Use gnus" gnus)
:type '(choice (const :tag "Use Gnus" gnus)
(const :tag "Use mhn" mhn))
:group 'mh-letter)
......@@ -1122,7 +1161,8 @@ This corresponds to:
While it might be tempting to add a descriptive name to the mailing list
address, consider that this field will appear in other people's outgoing
mail in their To: field. It might be best to keep it simple."
:type '(repeat (list (string :tag "regexp") (string :tag "address")))
:type '(repeat (list (string :tag "Regexp")
(string :tag "Address")))
:group 'mh-letter)
(defcustom mh-insert-x-mailer-flag t
......@@ -1225,6 +1265,8 @@ to the yanked region."
:type '(choice function (const nil))
:group 'mh-letter)
;;; Alias handling (:group 'mh-alias)
(defcustom mh-alias-system-aliases
......@@ -1293,21 +1335,30 @@ Options are sorted alphabetically, at the top of the file or at the bottom."
(const :tag "At the bottom of file" bottom))
:group 'mh-alias)
;;; Indexed searching (:group 'mh-index)
(defcustom mh-index-program nil
"Indexing program that MH-E shall use.
The possible choices are swish++, swish-e, namazu, glimpse and grep. By
default this variable is nil which means that the programs are tried in order
and the first one found is used."
:type '(choice (const :tag "auto-detect" nil)
The possible choices are swish++, swish-e, mairix, namazu, glimpse, pick and
grep. By default this variable is nil which means that the programs are tried
in order and the first one found is used.
More information about setting up an indexing program to use with MH-E can be
found in the documentation of `mh-index-search'."
:type '(choice (const :tag "Auto-detect" nil)
(const :tag "swish++" swish++)
(const :tag "swish-e" swish)
(const :tag "mairix" mairix)
(const :tag "namazu" namazu)
(const :tag "glimpse" glimpse)
(const :tag "pick" pick)
(const :tag "grep" grep))
:group 'mh-index)
;;; Multiple personalities (:group 'mh-identity)
(defcustom mh-identity-list nil
......@@ -1366,11 +1417,13 @@ This would produce the equivalent of:
;; (const "work"))
:type (append
(cons '(const :tag "none" nil)
(cons '(const :tag "None" nil)
(mapcar (function (lambda (arg) `(const ,arg)))
(mapcar 'car mh-identity-list))))
:group 'mh-identity)
;;; Hooks (:group 'mh-hooks + group where hook defined)
;;; These are alphabetized. All hooks should be placed in the 'mh-hook group;
......@@ -1408,12 +1461,6 @@ See also `mh-quit-hook'."
:group 'mh-hooks
:group 'mh-folder)
(defcustom mh-folder-list-change-hook nil
"Invoked whenever the cached folder list `mh-folder-list' is changed."
:type 'hook
:group 'mh-hooks
:group 'mh-folder)
(defcustom mh-folder-mode-hook nil
"Invoked in `mh-folder-mode' on a new folder."
:type 'hook
......@@ -1527,6 +1574,8 @@ will be removed from the unseen sequence."
"Face used for the current folder when it has unread messages."
:group 'mh-speed-faces)