diff options
author | Bill Wohler <wohler@newt.com> | 2003-02-03 20:55:30 +0000 |
---|---|---|
committer | Bill Wohler <wohler@newt.com> | 2003-02-03 20:55:30 +0000 |
commit | c04186f854feeb91c6dc4501816ff049111fb363 (patch) | |
tree | 6b257b0856ccb379350a11484811560a5cfd4cfe /lisp | |
parent | 772890e5a7e6f45e40ea3f144220a19c4bb1deab (diff) | |
download | emacs-c04186f854feeb91c6dc4501816ff049111fb363.tar.gz |
Upgraded to MH-E version 7.2.
See etc/MH-E-NEWS and lisp/mh-e/ChangeLog for details.
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/mh-e/ChangeLog | 6019 | ||||
-rw-r--r-- | lisp/mh-e/mh-alias.el | 14 | ||||
-rw-r--r-- | lisp/mh-e/mh-comp.el | 55 | ||||
-rw-r--r-- | lisp/mh-e/mh-customize.el | 149 | ||||
-rw-r--r-- | lisp/mh-e/mh-e.el | 254 | ||||
-rw-r--r-- | lisp/mh-e/mh-funcs.el | 73 | ||||
-rw-r--r-- | lisp/mh-e/mh-identity.el | 2 | ||||
-rw-r--r-- | lisp/mh-e/mh-index.el | 397 | ||||
-rw-r--r-- | lisp/mh-e/mh-loaddefs.el | 112 | ||||
-rw-r--r-- | lisp/mh-e/mh-mime.el | 18 | ||||
-rw-r--r-- | lisp/mh-e/mh-pick.el | 218 | ||||
-rw-r--r-- | lisp/mh-e/mh-seq.el | 271 | ||||
-rw-r--r-- | lisp/mh-e/mh-speed.el | 79 | ||||
-rw-r--r-- | lisp/mh-e/mh-utils.el | 411 | ||||
-rw-r--r-- | lisp/mh-e/mh-xemacs-compat.el | 2 | ||||
-rw-r--r-- | lisp/toolbar/mh-logo.xpm | 22 |
16 files changed, 7449 insertions, 647 deletions
diff --git a/lisp/mh-e/ChangeLog b/lisp/mh-e/ChangeLog new file mode 100644 index 00000000000..6e937b7f51f --- /dev/null +++ b/lisp/mh-e/ChangeLog @@ -0,0 +1,6019 @@ +2003-02-03 Bill Wohler <wohler@newt.com> + + * Released MH-E version 7.2. + + * MH-E-NEWS, README: Updated for release 7.2. + + * mh-e.el (Version, mh-version): Updated for release 7.2. + +2003-02-03 Bill Wohler <wohler@newt.com> + + * Makefile (dist): mkdir needs to happen *before* files are + copied. + + * MH-E-NEWS: Fixed some awkward verbiage. + +2003-02-02 Bill Wohler <wohler@newt.com> + + * mh-customize.el (mh-invisible-headers): Surround regexp-opt + expression in parens to avoid problems viewing certain messages. + +2003-01-30 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-speed.el (mh-speed-flists): Search for flists in mh-progs. + The original was inadvertently searching for flists in the user's + path. + +2003-01-27 Bill Wohler <wohler@newt.com> + + * mh-customize.el (mh-default-folder-must-exist-flag): Changed + default to t according to the principle of least surprise. + +2003-01-26 Bill Wohler <wohler@newt.com> + + * mh-utils.el: Checkdoc fixes. + + * mh-pick.el (mh-do-search, mh-search-folder): Checkdoc fixes. + + * mh-loaddefs.el: Regenerated (lm-verify fixes). + + * mh-index.el (mh-mairix-next-result): Checkdoc fixes. + + * mh-alias.el: lm-verify fix. + + * Makefile (MH-E-SRC): Added ChangeLog, now that Emacs has a + lisp/mh-e directory. + (MH-E-ETC-ETC): Removed ChangeLog. + (dist): Moved creation of mail directory next to copy of files + into mail directory. + (install-emacs): Copy $(MH-E-SRC) into new directory + $(EMACS_HOME/lisp/mh-e. + (MH-E-SRC): Moved ChangeLog into new variable MH-E-OTHERS and + include MH-E-LOADDEFS there too. + (mh-loaddefs.el): Added lines so that lm-verify passes. + (dist, install-emacs): Use MH-E-OTHERS instead of MH-E-LOADDEFS. + +2003-01-26 Jeffrey C Honig <jch@honig.net> + + * mh-comp.el (mh-tidy-draft-buffer, mh-compose-and-send-mail): + Rename mh-kill-draft-hook to mh-tidy-draft-buffer. + +2003-01-25 Jeffrey C Honig <jch@honig.net> + + * mh-utils.el (mh-exec-cmd, mh-exec-cmd-daemon) + (mh-process-daemon): Use mh-log-buffer for the output of commands + from mh-exec-cmd. + + * mh-utils.el (mh-temp-folders-buffer): Sequences and folders + loose the -temp from their buffer names as they are interesting to + the user. + + * mh-seq.el (mh-list-sequences): New name, mh-sequences-buffer as + it is intended to be interesting to the user. + + * mh-funcs.el (mh-list-folders): New name, mh-folders-buffer as it + is intended to be interesting to the user. + + * mh-comp.el (mh-check-whom, mh-compose-and-send-mail): Use + mh-recipients-buffer constant. Add a kill buffer hook to delete + the recipients buffer when a draft buffer is killed. + +2003-01-25 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-customize.el (mh-customize): New interactive argument + deletes other windows. + (mh-tool-bar-show-set, mh-tool-bar-letter-set) + (mh-tool-bar-folder-set): Modified so that clicking the customize + and help buttons deletes the other windows in the frame. + + * mh-mime.el (mh-mm-inline-message): Remove unused code. + + * mh-seq.el (mh-notate-deleted-and-refiled): Fix a small bug where + the wrong notation was being used. + (mh-toggle-threads): The function had a bug if you did the + following starting from an unthreaded wide folder: + (1) Create a sequence with S p + (2) Narrow to new sequence with S n + (3) Thread narrowed folder with T t + (4) Kill sequence with S k + (5) Unthread narrowed folder with T t + At this point we would have an empty folder. The change fixes + this. + (mh-toggle-threads): Fix documentation. + + * mh-customize.el (mh-invisible-header-fields): Add + X-MHE-Checksum to invisible headers. + + * mh-comp.el (mh-insert-x-mailer): Slightly more informative + X-Mailer header. + +2003-01-24 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-header-display): Modified so that quoted-printable + or base64 encoded messages are left untouched. + + * mh-utils.el (mh-decode-content-transfer-encoded-message): Munge + the Content-Transfer-Encoding header so that the MIME decoding + routines of Gnus doesn't get confused. + (mh-display-msg): Use insert-file-contents-literally so that + display will work for non-ascii. + + * mh-mime.el (mh-mime-display): Use charset info to decode + message file (closes SF #655123). + +2003-01-24 Bill Wohler <wohler@newt.com> + + * mh-alias.el (mh-alias-add-alias-to-file): Removed period from + error message and added parens around error function. + +2003-01-24 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-customize.el (mh-decode-quoted-printable-flag): Removed. + (mh-decode-content-transfer-encoded-message-flag): This replaces + mh-decode-quoted-printable-flag. + + * mh-utils.el (mh-decode-content-transfer-encoded-message): New + function which handles messages that are encoded as base64 or + quoted-printable (closes SF #674190). + (mh-decode-quoted-printable): Removed. + (mh-display-msg): Use mh-decode-content-transfer-encoded-message + instead of mh-decode-quoted-printable. + +2003-01-23 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-generate-scan-lines): Fix a little bug + that would occasionally cause angles ('<' and '>') to appear at + root level. + +2003-01-21 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-notate-cur): Enable overlay arrow display in text + mode too. + + * mh-e.el (mh-folder-mode): Initialize overlay-arrow-string so + that a '>' is displayed in text mode. + +2003-01-20 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-scan-msg-overflow-regexp): Change the variable + so that a space is always maintained in the beginning of the scan + line. + + * mh-seq.el (mh-notate-seq, mh-notate-cur): Make the functions + faster by cutting down on the use of mh-goto-msg. + (mh-toggle-threads): Add call to mh-notate-cur, since inserting + the folder names in a search results folder screws up the + location of the overlay arrow. + + * mh-index.el (mh-index-delete-folder-headers): Position the + point on a message line if possible. + + * mh-funcs.el (mh-copy-msg): Use the mh-iterate macro to make the + function faster. + + * mh-e.el (mh-scan-folder): Reuse mh-notate-deleted-and-refiled. + + * mh-loaddefs.el: Regenerated. + + * mh-utils.el (mh-add-msgs-to-seq): Add a new parameter that + suppresses the annotation of the sequence since it is + inefficient. + + * mh-seq.el (mh-delete-seq): Speed up the part of the function + that removes the sequence notation. + (mh-put-msg-in-seq, mh-notate-deleted-and-refiled): Use + mh-iterate-on-messages-in-region to make the function fasters when + operating on regions. The key idea is to loop over the folder + buffer exactly once and do all annotations. The existing algo + would walk over the buffer multiple times thereby slowing things + down. + (mh-iterate-on-messages-in-region): Added an extra parameter which + is bound to the message index as the loop is executed. + (mh-region-to-msg-list, mh-thread-delete, mh-thread-refile): Use + the new mh-iterate-on-messages-in-region macro. + + * mh-e.el (mh-delete-msg-no-motion, mh-refile-msg, mh-undo): Same + as above. + (mh-notate-user-sequences): Change algorithm to make notating of + user sequences fast. + +2003-01-19 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-logo.xpm: New image file that contains the MH-E logo. + Change foreground color to the blue in the MH-E logo. + + * Makefile (MH-E-IMG): Add mh-logo.xpm to list of image files. + + * mh-utils.el (mh-show-buffer-mode-line-buffer-id): Adjust it to + keep space in the beginning for the logo. + (mh-logo-cache): New variable that caches the logo image file + location. + (mh-logo-display): Display the MH-E logo on the mode line. + (mh-display-msg): Display logo in mh-show-mode. + + * mh-e.el (mh-make-folder-mode-line): Display logo in + mh-folder-mode. + + * mh-comp.el (mh-compose-and-send-mail): Display logo in + mh-letter-mode. + + * mh-loaddefs.el: Regenerated. + + * mh-seq.el (mh-iterate-on-messages-in-region): New macro to + iterate on all messages in a region. + (mh-region-to-msg-list): Simplified since it uses + mh-iterate-on-messages-in-region now. + + * mh-e.el (mh-delete-msg, mh-refile-msg): Change interactive spec + to pass the region that is to be deleted when appropriate. + (mh-delete-msg-no-motion, mh-refile-msg, mh-undo): Operate on + regions directly without creating the list of messages to be + deleted/refiled. + (mh-delete-a-msg, mh-refile-a-msg, mh-undo-msg): The msg + parameter in these functions can now be nil. If so, the current + message is deleted, refiled or undone respectively. Avoids the + use of mh-goto-msg in this case and speeds up operations on + regions quite a bit. + +2003-01-19 Peter S Galbraith <psg@debian.org> + + * mh-alias.el (mh-read-address): Bug Fix. In XEmacs and Emacs20, + it would always prompt using "To: " instead of using the command + argument (closes SF #670913). + +2003-01-19 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-folder-completion-function): If there is a + +foo/bar folder and the user types foo//bar then the completion + function would say a match happened without showing the + normalized folder name. This change fixes that. + +2003-01-18 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-rmail): Modified so that new and unseen messages + are shown (closes SF #667542). + +2003-01-17 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-generate-pretty-name): Generate nicer + names. In particular all '-' characters are removed. + +2003-01-16 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-customize.el (mh-index-program): Documentation fix. + + * mh-loaddefs.el: Regenerated. + + * mh-customize.el (mh-index-program): Add choices for mairix and + pick. + + * mh-index.el (mh-indexer-choices): Add search interfaces for + mairix and pick. + (mh-index-search): Add links for mairix and pick. + (mh-index-pick-folder, mh-pick-binary): Variables needed to + implement pick support. + (mh-pick-execute-search, mh-pick-next-result): New functions to + implement pick support. + (mh-mairix-binary, mh-mairix-directory, mh-mairix-folder): New + variables for mairix support. + (mh-mairix-execute-search, mh-mairix-next-result) + (mh-mairix-regexp-builder, mh-mairix-convert-to-sop*): New + functions for mairix. + + * mh-funcs.el (mh-kill-folder): Move message to the end. + + * mh-e.el (mh-folder-mode): Make overlay-arrow-position and + overlay-arrow-string local variables so that the arrow will + remain even if some other folder is visited. + (mh-remove-cur-notation, mh-remove-all-notation): The test isn't + required any more since overlay-arrow-position is local. + (mh-goto-cur-msg): Remove overlay arrow if current message + doesn't exist. + + * mh-seq.el (mh-notate-cur): Don't need to set + overlay-arrow-string any more since it is local and has been set + at initialization. + +2003-01-15 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-speed.el (mh-speed-current-folder): Keep track of current + folder when flists is called. + (mh-speed-flists, mh-speed-parse-flists-output): Try to avoid + ambiguity when folders are present with + at the end of the name. + Unfortunately it can't always be avoided. + + * mh-e.el (mh-folder-size): Remove the unnecessary error check. + (mh-parse-flist-output-line): Add extra argument which + occasionally avoid problems with folder names that end with '+'. + + * mh-utils.el (mh-sub-folders-actual): Fix the folder name + parsing so that it doesn't get confused by trailing '+' chars in + the folder name. + +2003-01-14 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-normalize-folder-name): Enhanced so that it can + now handle ".." and "." correctly during folder name completion. + (mh-normalize-folder-name): Avoid error in boundary condition + where the folder string is empty. + +2003-01-14 Mark D. Baushke <mdb@gnu.org> + + * mh-e.el (mh-visit-folder): Pass `current-prefix-arg' to + the `mh-read-msg-range' function as the optional + always-prompt-flag. + +2003-01-14 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-normalize-folder-name): New function that + normalizes folder names. + (mh-sub-folders): Use mh-normalize-folder-name. Also the function + has been modified so that a trailing slash is only added if the + folder potentially has subfolders. + (mh-sub-folders-actual): Simplified since the folder has already + been normalized in mh-sub-folders. + (mh-remove-from-sub-folders-cache): Modified so that the cached + results of two of the folders ancestors are invalidated. + (mh-folder-completion-map): Ugly hack to make the error go away + when minibuffer-complete-word is called. + (mh-folder-completion-function): The completion function will now + be more selective in adding '/' at the end of completed folder + names. + (mh-folder-completing-read): The folder name is normalized before + return. The minibuffer-local-completion-map is shadowed to avoid + error with SPC (bound to minibuffer-complete-word). We really + need a better solution. + +2003-01-13 Bill Wohler <wohler@newt.com> + + * mh-seq.el: Edited comment and docstring text to conform with RFC + 2822 terminology. Message-ID is the header field. It contains a + message identifier. + +2003-01-13 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-sub-folders): Add an argument that returns + sub-folders with a / character appended at the end. + (mh-folder-completion-function): Modify the function so that one + tab is now sufficient to complete the folder name and add a + trailing /. + (mh-folder-completing-read): Remove the trailing / that the + completion function now adds to the folder name. Also multiple / + characters in the folder input are removed. So if the user inputs + +foo///bar//baz///// then that will be converted to +foo/bar/baz. + This will improve the performance of caching. + + * mh-seq.el (mh-notate-cur): Check that a valid current message + exists before trying to notate (closes SF #667331). + (mh-message-id-regexp): New variable to store regexp to recognize + message-ids. + (mh-thread-generate): Use mh-message-id-regexp to filter out non + message-id's from the References: header. + +2003-01-12 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-notate-cur): Disable overlay-arrow display if we + aren't on a graphic display. + +2003-01-11 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-notate-cur): New function to notate the current + message. The marker in the fringe is updated too. + (mh-narrow-to-seq, mh-widen, mh-thread-inc, mh-thread-folder): Use + the specialized function mh-notate-cur instead of mh-notate-seq. + + * mh-e.el (mh-arrow-marker): New buffer local variable to store + the position where the marker in the fringe is going to be + displayed (closes SF #664824). + (mh-folder-mode): Create a marker for the fringe. + (mh-update-sequences, mh-get-new-mail, mh-goto-cur-msg): Call the + specialized function mh-notate-cur instead of mh-notate-seq or + mh-notate. + (mh-remove-cur-notation, mh-remove-all-notation): Reset the + overlay-arrow-position if needed. + + * mh-loaddefs.el: Regenerated. + +2003-01-10 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-remove-from-sub-folders-cache): Modified so that + creating nested folders doesn't produce inconsistent results. + (mh-prompt-for-folder): Remove call of mh-folder-list-change-hook. + + * mh-funcs.el (mh-kill-folder): Don't ask for confirmation if + called on a folder holding index search results. Also the now + removed mh-folder-list-change-hook is called no more. + + * mh-customize.el (mh-auto-folder-collect-flag) + (mh-folder-list-change-hook): Removed. + + * mh-loaddefs.el: Regenerated. + +2003-01-10 Bill Wohler <wohler@newt.com> + + * mh-customize.el (mh-default-folder-must-exist-flag): New + variable to suppress suggested folder if the folder doesn't + already exist (closes SF #657096). + (mh-default-folder-list): New variable that + holds mapping between an address and the desired folder for + filing (closes SF #657096). + (mh-default-folder-prefix, mh-default-folder-must-exist-flag): In + docstring, refer to documentation for mh-prompt-for-refile-folder + and mh-folder-from-address. + (mh-highlight-citation-p, mh-compose-insertion, + (mh-insert-mail-followup-to-list, mh-index-program, + (mh-identity-default): Fixed case of tags. + + * mh-e.el (mh-folder-from-address): Use new variable + mh-default-folder-must-exist-flag to return nil if this variable + is t and the folder doesn't already exist. In addition, can now + look up a default folder in the new variable + mh-default-folder-list (closes SF #657096). + (mh-prompt-for-refile-folder): In docstring, refer to + documentation in mh-folder-from-address. + + * mh-index.el (mh-swish-execute-search): Changed \..* to \\..* in + the FileRules filename in the sample config file. Otherwise, the + users don't see the backslash at all, and no files are indexed! + (closes SF #665888). + +2003-01-10 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-folder): Get headers for exactly the + messages that are present. If only messages 1-10 and 3800-3900 + are being shown then we will now scan exactly those messages and + not the full range from 1-3900 as was being done earlier. + (mh-toggle-threads): When converting from threaded to normal view + only the messages present in the buffer are scanned. Earlier all + messages from the minimum to the maximum would be scanned (closes + SF #626117). + + * mh-pick.el (mh-search-folder): Fix typo. + (mh-pick-do-search): Fix bug from cut and paste. Also set window + config properly. + + * mh-utils.el (mh-prompt-for-folder): Add new argument to allow + it to accept + as a folder name. This allows the user to search + all folders when "Fs" is used. + + * mh-pick.el (mh-search-folder): Fix interactive spec of function. + (mh-pick-do-search): Rewritten to call pick in one go. This will + make adding pick as a default index search program easier. Also + pick now accepts the same query syntax as the index search + programs (closes SF #664816). + (mh-next-pick-field): Removed. + (mh-pick-parse-search-buffer): New function to parse the search + buffer. + (mh-pick-construct-regexp, mh-pick-regexp-builder): New function + to produce a pick query from the parsed representation. + + * mh-index.el (mh-index-do-search): Refactor the search pattern + parser into a new function and use that instead. + + * mh-loaddefs.el: Regenerated. + +2003-01-10 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-loaddefs.el: Regenerated. + + * mh-utils.el (mh-remove-from-sub-folders-cache) + (mh-prompt-for-folder): Replace mh-update-sub-folders-cache with + mh-remove-from-sub-folders-cache. + (mh-exec-cmd-daemon): Mention set-process-filter in documentation. + + * mh-pick.el (mh-searching-function): New buffer local variable + that keeps track of the default searching function to be used. + (mh-pick-mode): Make mh-searching-function buffer local. + (mh-search-folder): Set mh-searching-function to use pick. + (mh-search-folder, mh-pick-menu, mh-pick-mode-help-messages) + (mh-pick-mode, mh-do-pick-search, mh-pick-do-search): Rename + mh-do-pick-search to mh-pick-do-search. But keep + mh-do-pick-search as a deprecated function. + (mh-do-search): New interactive function that performs the + default search. + (mh-pick-mode-map): Update keymap. + + * mh-index.el (mh-index-search): Set mh-searching-function to do + index search. + (mh-index-new-folder): Replace mh-update-sub-folders-cache with + mh-remover-from-sub-folders-cache. + + * mh-funcs.el (mh-kill-folder): Same as above. + + * mh-index.el (mh-index-evaluate, mh-swish++-regexp-builder): + Checkdoc fixes. + + * mh-customize.el: Fixes to make byte compiler in CVS Emacs + perfectly happy. + +2003-01-09 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-folder-from-address): New function that proposes the + name of a folder with an alias for the address in the current message. + (mh-prompt-for-refile-folder): Use it (closes SF #657096). + + * mh-customize.el (mh-default-folder-prefix): New variable used by + mh-folder-from-address. + (mh-invisible-header-fields): Edited docstring. + + * mh-alias.el (mh-alias-address-to-alias): Added ;;;###mh-autoload + cookie (used by mh-folder-from-address in mh-e.el). Edited text in + comment. + + * mh-utils.el: Provided naming conventions for buffer and buffer + variable names. + (mh-temp-folders-buffer): Renamed buffer to " *mh-folders*". + (mh-temp-sequences-buffer): Renamed buffer to " *mh-sequences*". + (mh-info-buffer): Renamed from mh-temp-info-buffer. + (mh-log-buffer): New buffer variable to hold name of "*MH-E Log*" + buffer which is expected to be used for the output of MH commands. + Perhaps we always create this buffer at initialization and append + to it rather than erase it each time? + + * mh-e.el (mh-quit): Loop over all buffers and delete MH-E + temporary and working buffers. As long as the buffer naming + conventions are followed, new buffers will be automatically + killed. + (mh-version): Renamed mh-temp-info-buffer to mh-info-buffer. + + * mh-comp.el (mh-insert-x-mailer): Renamed mh-temp-info-buffer to + mh-info-buffer. + +2003-01-09 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-folder-size): If the user doesn't have a + Unseen-Sequence definition in .mh_profile then an error was + produced. This change fixes that. + + * mh-seq.el (mh-thread-generate): Replace the *mh-thread* buffer + with a temporary buffer which is cleaned up when the function + exits. + + * mh-e.el (mh-prompt-for-refile-folder): New function which + refactors out the intelligent folder guessing code from + mh-refile-msg. + (mh-refile-msg): Use mh-prompt-for-refile-folder. + + * mh-seq.el (mh-thread-refile): Use mh-prompt-for-refile-folder to + do the same intelligent destination folder guessing as + mh-refile-msg (closes SF #664829). + + * mh-utils.el (mh-folder-list, mh-make-folder-list-process) + (mh-folder-list-temp, mh-folder-list-partial-line) + (mh-set-folder-list): Removed. + (mh-sub-folders-cache, mh-sub-folders, mh-sub-folders-actual): + Moved over from mh-speed.el to implement hierarchical completion. + (mh-update-sub-folders-cache): Utility function called when + new folders are created or folders are removed. + (mh-folder-completion-function): New function is the folder name + completion function used in completing-read. + (mh-folder-completing-read): A thin wrapper function that is used + instead of completing-read directly. In the future we might want + to allow the user a customizable variable which will turn off + folders based completion. + (mh-prompt-for-folder): Use mh-folder-completing-read to read in + the folder name with hierachical completion (closes SF #664821). + + * mh-speed.el (mh-speed-folders, mh-speed-folders-cache) + (mh-speed-folders-actual): Moved to mh-utils.el as mh-sub-folders, + mh-sub-folders-cache and mh-sub-folders-actual respectively. + (mh-speed-invalidate-map, mh-speed-invalidate-map) + (mh-speed-add-folder): Use the new names. + + * mh-funcs.el (mh-kill-folder): Remove code that used to update + mh-folder-list which is no longer present. Instead + mh-update-sub-folders-cache is called. + + * mh-index.el (mh-index-new-folder): Same as above. + +2003-01-08 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-exec-cmd-daemon): An argument was added which + controls what is done with the process output. + + * mh-funcs.el (mh-kill-folder): Use mh-previous-window-config to + restore window configuration. Also the call to mh-exec-cmd-daemon + only displays output if an error happened (closes SF #664828). + (mh-rmf-daemon): Check rmf output and display it only if + something went wrong. + (mh-print-msg): Pass in nil argument to mh-exec-cmd-daemon. + + * mh-comp.el (mh-redistribute, mh-send-letter): Pass in nil + argument to mh-exec-cmd-daemon so that the functions will behave + as before. + + * mh-pick.el (mh-search-folder): The current window config is + stored. + (mh-make-pick-template): Make the message headers read-only. + (mh-pick-mode-help-messages): Update help message. + (mh-do-pick-search): Fix problem when buffer isn't showing any + messages. + (mh-next-pick-field): Use buffer-substring-no-properties is + better. + (mh-pick-mode-map): Add key bindings (partially addresses + SF #664816) + + * mh-index.el (mh-indexer-choices): Add a new field for each + index program choice. If it is non-nil then it is the name of a + function that given a lisp expression to search for generates a + pattern that is acceptable to the search program. + (mh-index-regexp-builder): New variable that stores the function + to be used to convert from the lisp expression syntax to + something that the search program understands. + (mh-index-generate-pretty-name): Generalized so that it can take + a list of strings as input. + (mh-index-search): Modified so that if the configured program has + a corresponding regexp-builder then a search buffer like pick + search is produced. Otherwise the previous behavior is maintained. + (mh-index-do-search): New interactive function that takes the + contents of the search buffer, generates an appropriate query and + produces the search results buffer by calling mh-index-search. + (mh-replace-string, mh-index-parse-search-regexp) + (mh-index-add-implicit-ops, mh-index-evaluate): New functions + which parses the infix search expression that the user enters. A + parse tree from which queries for different search programs can + be produced is produced. + (mh-swish++-regexp-builder, mh-swish++-print-regexp): Takes the + internal form of the query and produces input suitable for + swish++. + + * mh-loaddefs.el: Regenerated. + +2003-01-08 Bill Wohler <wohler@newt.com> + + * Makefile (emacs-logs): New target for viewing CVS Emacs logs. + Useful to see if an Emacs developer has changed MH-E. + + * MH-E-NEWS: Fixed case of MH-E in the "Changes" title. + + * mh-utils.el (mh-temp-info-buffer): New variable to hold name of + buffer that contains version info. + + * mh-e.el (mh-version): Use mh-temp-info-buffer instead of + mh-temp-buffer since version information was getting clobbered by + the aliasing code before it could be seen (closes SF #664467). + (mh-quit): Delete mh-temp-info-buffer. + + * mh-comp.el (mh-insert-x-mailer): Use mh-temp-info-buffer to find + version info instead of mh-temp-buffer. You kind of need this + patch to send mail. + +2003-01-07 Bill Wohler <wohler@newt.com> + + * mh-e.el (Version, mh-version): Set to 7.1+cvs. + +2003-01-07 Bill Wohler <wohler@newt.com> + + * Released MH-E version 7.1. + + * MH-E-NEWS, README: Updated for release 7.1. + + * mh-e.el (Version, mh-version): Updated for release 7.1. + +2003-01-07 Bill Wohler <wohler@newt.com> + + * mh-customize.el (mh-auto-folder-collect-flag, + mh-alias-system-aliases, mh-alias-insert-file): Edited docstrings. + + * Makefile (MH-E-IMG): Added alias.pbm and alias.xpm. + + * mh-alias.el (mh-alias-insert-file, mh-alias-add-alias): Fixed + checkdoc warnings. + +2003-01-07 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-search-from-end): New function that is used to + replace our usage of the CL function search. + (font-lock): The library is loaded to avoid compilation warning + in CVS Emacs. + + * mh-speed.el (mh-speed-goto-folder, mh-speed-add-folder) + (mh-speed-extract-folder-name, mh-speed-invalidate-map): Use + mh-search-from-end instead of search. + + * mh-seq.el (mh-thread-remove-parent-link): Use loop instead of + remove*. + (mh-thread-process-in-reply-to): Use mh-search-from-end instead + of search. + + * mh-index.el (mh-md5-parser): Fix name of function. + (mh-index-update-single-msg, mh-index-update-maps): Avoid using + destructuring-bind since Emacs-20.7 can't handle this particular + usage. + (mh-namazu-next-result): Use mh-search-from-end instead of + search. + + * mh-e.el (recursive-load-depth-limit): Add a defvar since CVS + emacs which doesn't have the variable defined causes a compiler + warning. + (mh-refile-a-msg): Rewritten to avoid using pushnew. + (mh-undo-msg): Use loop instead of remove-if. + + * mh-comp.el (mh-show-buffer-message-number): Use + mh-search-from-end instead of search. + +2003-01-01 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-visit-folder): Modified so that if RANGE is nil then + all messages are displayed. Documentation modified so that this is + explicitly stated. + (mh-visit-folder): Really fix it this time. + +2003-01-01 Mark D Baushke <mdb@gnu.org> + + * mh-alias.el (mh-alias-from-has-no-alias-p): Needs the + mh-autoload comment or mh-customize may have problems finding the + function. + + * mh-loaddefs.el: Regenerated. + +2002-12-28 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-namazu-execute-search): Fix bug in documentation. + +2002-12-28 Bill Wohler <wohler@newt.com> + + * mh-comp.el (mh-letter-mode): Mention mh-compose-insertion + variable in docstring, explain how to expand directives, and + don't mention mh-mhn-compose-insertion which isn't used directly + any more. + (mh-send-letter): Mention that X-Mailer and X-Face are inserted + automatically so that a user isn't tempted to do so himself in + mh-before-send-letter-hook. + (mh-insert-letter): Use "variable" prefix for mh-invisible-headers + now that we have both a function and a variable. Clarified + language a bit. + +2002-12-26 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-show-xface-function): Only load x-face-e21 if + the emacs is not XEmacs. + + * mh-index.el (mh-index-new-folder): The folder created should + always be added to mh-folder-list. Otherwise folder name + completion doesn't find the new folder created. + +2002-12-24 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-customize.el (mh-clean-message-header-flag) + (mh-visible-headers, mh-invisible-headers) + (mh-invisible-header-fields-set): Reworded to satisfy checkdoc. + + * mh-loaddefs.el: Regenerated. + + * mh-e.el (mh-inc-folder, mh-visit-folder, mh-read-msg-range): + Handle nil value of mh-large-folder properly. + + * mh-customize.el (mh-tool-bar-show-set, mh-tool-bar-letter-set) + (mh-tool-bar-folder-set, mh-tool-bar-folder-buttons) + (mh-invisible-headers, mh-invisible-header-fields-set): Checkdoc + fixes. + (mh-large-folder): Updated to allow for infinity. If + mh-large-folder is nil then all folders are deemed small. + +2002-12-23 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-inc-folder, mh-visit-folder): Emit a message if + threading was suppressed because the number of messages exceed + mh-large-folder. + +2002-12-23 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-invisible-headers): Deleted. Moved to + mh-customize.el + + * mh-customize.el (mh-invisible-header-fields): New + defcustom. Simple user interface to change mh-invisible-headers. + (mh-invisible-header-fields-set): New function called when + mh-invisible-header-fields is set. + (mh-invisible-headers): New function. Does the actual work of + building the variable mh-invisible-headers from + mh-invisible-header-fields. + (mh-invisible-headers): defvar moved from mh-utils.el + +2002-12-22 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-speed.el (mh-speed-folder-size): Removed. Something very + similar appears as mh-folder-size. + (mh-speed-view): Simplified since the range selection logic has + been moved to mh-read-msg-range. + (mh-speed-parse-flists-output-line): Moved to mh-e.el as + mh-parse-flist-output-line. + + * mh-funcs.el (mh-pack-folder): Use the new mh-read-msg-range. + + * mh-e.el (mh-rescan-folder): Use the new mh-read-msg-range. + (mh-parse-flist-output-line): Moved from mh-speed.el where this + function was called mh-speed-parse-flists-output-line. + (mh-folder-size): Renamed from mh-speed-folder-size. The function + has been made more general and can be called from any buffer and + not just the speedbar buffer. + (mh-visit-folder): Use the new mh-read-msg-range (addresses SF + #655891). + (mh-read-msg-range): Rewritten. + +2002-12-21 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-delete-subject-or-thread): New interactive + function that intelligently deletes messages based on threading, + if the folder is threaded, or on subject if folder isn't threaded. + + * mh-utils.el (mh-show-delete-subject-or-thread): New interactive + function, callable from the show buffer, to intelligently delete + messages based on threading info or subject. + (mh-show-mode-map): Change binding of "k" to call + mh-show-delete-subject-or-thread. + + * mh-e.el (mh-folder-mode-map): Change binding of "k" to call + mh-delete-subject-or-thread. + + * mh-comp.el (mh-letter-mode-map): Add key binding for + mh-insert-identity. + + * mh-loaddefs.el: Regenerated. + +2002-12-21 Peter S Galbraith <psg@debian.org> + + * mh-customize.el (mh-tool-bar-letter-set): Bug fix. The + `tool-bar-add-item-from-menu' items were broken. I can't use my + constants there. + +2002-12-21 Peter S Galbraith <psg@debian.org> + + * mh-alias.el (mh-alias-insert-file): Bug fix. I never checked + that an AliasFile entry existed in .mh_profile. + +2002-12-21 Peter S Galbraith <psg@debian.org> + + * mh-customize.el (mh-alias-insertion-location): New defustom. + Specifies where new aliases are entered in alias files. + + * mh-alias.el (mh-alias-add-alias-to-file): Use it. + +2002-12-21 Peter S Galbraith <psg@debian.org> + + * mh-alias.el (mh-alias-add-alias-to-file): If ALIAS matches + exactly, prompt to [i]nsert before old value or [a]ppend after it. + (mh-alias-insert-file): Make sure we don't edit the passwd file. + Add optional argument for alias; If ALIAS is specified and it + already exists, try to return the file that contains it. + (mh-alias-which-file-has-alias): New function. Return the name of + writable file which defines ALIAS from list FILE-LIST. + (mh-alias-add-alias): Remove prompts for case of alias already + defined; done in mh-alias-add-alias-to-file. + +2002-12-21 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-speed.el (mh-speed-folders-actual): Fix bug in parsing of + folder names that have spaces in them. The original function would + truncate the folder name at the first space. + (mh-speed-flists): Add -sequence option to flists. This guards + against the user specifying something other than the unseen + sequence in his .mh_profile. + (mh-speed-parse-flists-output-line): New function that parses a + single line in the output of flists to find the folder name and + the counts of unseesn and total messages. + (mh-speed-parse-flists-output): Fix parsing bug which truncates + the folder names at the first space. + + * mh-index.el (mh-index-generate-pretty-name): New function which + generates a nicer name for the search results. It trims white + space at the beginning and end and replaces white space with + underscores within the search regexp. + (mh-index-search): Use mh-index-generate-pretty-name. + + * mh-loaddefs.el: Regenerated. + +2002-12-20 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-new-folder): Add new folder to + mh-folder-list to enable name completion. + (mh-glimpse-execute-search, mh-swish-execute-search) + (mh-swish++-execute-search): Fix documentation. + + * mh-seq.el (mh-thread-generate): Fixed a stupid bug where the wrong + folder could get 'scan'ed when generating the threaded view. + + * mh-index.el (mh-index-search): If optional prefix arg is given + then the search in the current index buffer is redone. + (mh-glimpse-execute-search, mh-swish-execute-search) + (mh-namazu-execute-search): Documentation fixes. + + * mh-e.el (mh-index-previous-search): New buffer local variable + stores parameters of search that created the buffer. + (mh-folder-mode): Make mh-index-previous-search buffer local. + (mh-visit-folder): Tweak the function so that only a single window + with the folder buffer is shown if mh-showing-mode is nil. + + * mh-loaddefs.el: Regenerated. + +2002-12-19 Peter S Galbraith <psg@debian.org> + + * mh-alias.el (mh-alias-add-alias): Bug fix. + +2002-12-19 Peter S Galbraith <psg@debian.org> + + * mh-alias.el (mh-alias-add-alias): New interactive command. Add + ALIAS for ADDRESS in personal alias file. + (mh-alias-grab-from-field): New interactive command. Add ALIAS for + ADDRESS in personal alias file. + (mh-alias-add-address-under-point): New interactive + command. Insert an alias for email address under point. + (mh-alias-suggest-alias): New function. Suggest an alias for STRING. + (mh-alias-insert-file): New function. Return the alias file to + write a new entry in. + (mh-alias-address-to-alias): New function. Return the ADDRESS + alias if defined, or nil." + (mh-alias-from-has-no-alias-p): New function. Return t is From has + no current alias set. Used as tool-bar button enable function. + (mh-alias-add-alias-to-file): New function. Add ALIAS for ADDRESS + in alias FILE without alias check or prompts. + + * alias.xpm, alias.pbm: New tool-bar icon for + mh-alias-grab-from-field. + + * mh-e.el (mh-folder-line-matches-show-buffer-p): New function. + Return t if the message under point in folder-mode is in the show + buffer. + + * mh-utils.el (mh-goto-address-find-address-at-point): New + function copied from goto-addr.el, which we don't want to + force-load on users. Find e-mail address around or before point. + (mh-address-mail-regexp): New defvar. A regular expression + probably matching an e-mail address. + + * mh-customize.el (mh-alias-insert-file): New defcustom. + Filename to use to store new MH-E aliases. + (mh-tool-bar-folder-buttons): Enable mh-tool-bar-item-alias icon. + + * mh-comp.el (mh-extract-from-header-value): New function. + Extract From: string from header. + +2002-12-19 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-update-single-msg): New defvar controls + max number of command line args. + (mh-index-execute): New function which is to be used + instead of xargs so that we don't give the shell too many command + line args. + (mh-index-update-maps): Use mh-index-execute instead of xargs. + (mh-index-search): Remove unused code. Also the first message in + folder buffer is made current. + +2002-12-18 Peter S Galbraith <psg@debian.org> + + * mh-loaddefs.el: Regenerated. + + * mh-comp.el (mh-letter-tool-bar-map): Moved to mh-customize.el + + * mh-e.el (mh-folder-tool-bar-map): Moved to mh-customize.el + + * mh-utils.el (mh-get-msg-num): autoloaded. + (mh-show-tool-bar-map): Moved to mh-customize.el + + * mh-customize.el (mh-tool-bar-item-*): 33 new defconsts for + tool-bar setup and customization. + (mh-tool-bar-folder-buttons-set): New function to setup the + tool-bar after customization. + (mh-tool-bar-folder-buttons): New defcustom to specify which icons + appears in the tool-bar. + (mh-tool-bar-letter-buttons-set): New function to setup the + tool-bar after customization. + (mh-tool-bar-letter-buttons): New defcustom to specify which icons + appears in the tool-bar. + (mh-tool-bar-show-set): New function to setup mh-letter-tool-bar-map. + (mh-tool-bar-letter-set): New function to setup + mh-letter-tool-bar-map. + +2002-12-18 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-folder-mode-map): Change entries for "\t", "\M-\t" + and backtab to call mh-index-next-folder and + mh-index-previous-folder as appropriate. + + * mh-index.el (mh-index-next-folder, mh-index-previous-folder): + New interactive functions which jumps to search results of next + and previous folders respectively. + + * mh-loadddefs.el: Regenerated. + + * mh-index.el (mh-index-delete-folder-headers): Arrange for + mh-goto-cur-msg to just go to the current message. + + * mh-e.el (mh-visit-folder): Since mh-scan-folder erases the whole + buffer anyway, we don't need to delete the folder headers. Also + index-data is non-nil only when the buffer folder doesn't exist. + So we need to call mh-make-folder. + (mh-folder-mode): Fix bug in that mh-index-checksum-origin-map was + not being made buffer local! + +2002-12-17 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-visit-folder): Fix bug. + + * mh-index.el (mh-md5sum-buffer): Buffer from which md5sum is run. + (mh-index-folder-first, mh-index-folder-last) + (mh-index-original-msg-list): Convenience macros aren't needed + anymore since the data structure has been changed. + (mh-index-update-single-msg): New function to update maps that + relate MD5 checksums to actual messages and vice-versa for a + single message. + (mh-index-update-maps): Do the above for all messages. If some + messages don't have MD5 checksums, they are annotated with the + result of md5sum. + (mh-index-search): Updated for the new version of mh-index-data. + (mh-msg-exists-p): New function to test a message exists. + (mh-index-insert-folder-headers): Updated for new mh-index-data. + (mh-index-delete-folder-headers): New function used to eliminate + original folder names from the buffer and make it look like a + plain folder buffer. This is used from mh-process-commands. + (mh-index-visit-folder): Use new version of mh-index-data. + (mh-index-match-checksum): New function which checks if the + X-MHE-Checksum header of a message matches. + (mh-index-execute-commands): New function that rmm's the original + messages. Then after mh-execute-commands executes it will seem + that the original messages were executed upon. This completes the + fix of SF #623321. + (mh-checksum-buffer): Renamed from mh-md5sum-buffer. + (mh-checksum-cmd, mh-checksum-parser): New globals to allow + different checksum programs to be used. + (mh-checksum-choose): New functions to find a checksum program. + (mh-openssl-parser, mh-md5sum-parser, mh-md5-parser): Functions to + parse the output of md5, md5sum and openssl. + (mh-index-update-maps): Use checksum parsing function. + (mh-index-search): Set checksum choice. Add a call to recenter, + otherwise the window point in the index buffer doesn't get set + properly. + + * mh-funcs.el (mh-pack-folder, mh-sort-folder): Enable these + functions in folders created by index search. + + * mh-e.el (mh-index-msg-checksum-map) + (mh-index-checksum-origin-map): New buffer local variables that + keep track of message checksums (used to implement + refiling/deletion for folders created by index folders). + (mh-last-msg): Make the function behave like mh-first-msg. + (mh-visit-folder): Add new optional argument which initializes + folders created by mh-index-search. + (mh-folder-mode): Make the variables mh-index-msg-checksum-map and + mh-index-checksum-origin-map buffer local. + (mh-process-commands): Call mh-index-execute-commands when called + from an index search buffer. This will reflect the changes being + made in the search folder to the original folders. + + * mh-loaddefs.el: Regenerated. + +2002-12-16 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-insert-folder-headers): Fix a bug which + caused the folder buffer to be marked as modified after rescanning + an index folder. + +2002-12-15 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-visit-folder): The function should insert folder + names if it is visiting a folder created by index search. + + * mh-index.el (mh-index-insert-folder-headers): The function now + maintains the old value of buffer-modified-p and temporarily makes + the buffer writable. + + * mh-utils.el (mh-show-index-visit-folder): New interactive + function callable from show buffer that displays search results + from one folder. + (mh-show-mode-map): Key binding for "v". + + * mh-speed.el: Fix credits. + (mh-index-folder-speedbar-buttons) + (mh-index-show-speedbar-buttons) + (mh-index-folder-speedbar-key-map) + (mh-index-show-speedbar-key-map) + (mh-index-folder-speedbar-menu-items) + (mh-index-show-speedbar-menu-items): Removed since the modes + mh-index-folder-mode and mh-index-show-mode no longer exist. + (mh-speed-extract-folder-name): Remove the bits about + mh-index-folder-mode and mh-index-show-mode. + + * mh-seq.el (mh-copy-seq-to-eob): Updated to work properly with + index search results. + (mh-region-to-msg-list): Skip over non-scan lines. + (mh-thread-inc, mh-thread-add-spaces, mh-thread-folder): Skip + non-scan lines when populating mh-thread-scan-line-map. + (mh-thread-folder, mh-toggle-threads): Move the check for buffer + modification from mh-thread-folder to mh-toggle-threads. + (mh-toggle-threads): When returning to unthreaded view insert the + folder names if called from a index folder. + + * mh-index.el: Fix credits and update commentary. + (font-lock-defaults, mh-index-buffer, mh-index-show-buffer) + (mh-index-ma-x-msg-index, mh-index-other-buffer) + (mh-index-matches, mh-index-previous-window-configuration) + (mh-index-current-msg, mh-index-folder-mode-keymap) + (mh-index-button-map, mh-index-folder-mode-help-messages): Remove + eliminated variables. + (mh-index-folder): New variable sets the MH folder under which the + index searches are stored. + (mh-index-folder-first, mh-index-folder-last) + (mh-index-original-msg-list): Convenience macros used to pull data + elements out of a list. If needed setf can be used to change them + as well. + (mh-index-search): Rewritten to create real folders where all the + normal folder operation. This partially fixes SF #623321 (refiles + and deletes doesn't work on original messages). + (mh-index-find-max-width, mh-index-search-again) + (mh-index-insert-scan, mh-index-callback, mh-index-search) + (mh-index-notate, mh-index-show, mh-index-header-display) + (mh-index-next, mh-index-folder-mode, mh-index-show-mode): + Functions, macros and modes removed. + (mh-folder-exists-p): New function to check if a folder exists. + (mh-index-new-folder): Generate a new folder name from a given + base string that mimics the way emacs generates buffer names. + (mh-index-insert-folder-headers): Insert folder names among the + search results. + (mh-index-visit-folder): New interactive function to show the + search results of one individual folder. + (mh-swish++-execute-search): Update documentation. + + * mh-funcs.el (mh-pack-folder, mh-sort-folder): Disable these + functions if index search results are being viewed. + + * mh-e.el (mh-folder-font-lock-keywords): Add highlight for + folder. + (mh-index-data): New buffer local variable that will be used to + store info about index search results. + (mh-rescan-folder): Implement rescanning for index search results. + (mh-folder-mode): Make mh-index-data buffer local. + (mh-remove-all-notation): Modified to take into account not all + lines in the folder buffer are normal scan lines. + (mh-folder-mode-map): Add key binding for "v" to jump to original + folder narrowed to search results. + + * mh-customize.el (mh-index-folder-face): Make it bold so that it + will look like before. + + * mh-loaddefs.el: Regenerated. + +2002-12-12 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-map-to-seq-msgs): Modified so that it can be given + a list of messages in addition to a sequence. + (mh-region-to-sequence, mh-region-to-msg-list): The function + mh-region-to-msg-list replaces mh-region-to-sequence. The new + function avoids creating a dummy sequence in MH-E. + (mh-thread-delete, mh-thread-refile, mh-put-msg-in-seq): Modified + to use mh-region-to-msg-list. + + * mh-funcs.el (mh-copy-msg): Modified to use mh-region-to-msg-list. + + * mh-e.el (mh-delete-msg, mh-refile-msg, mh-undo): Modified to use + mh-region-to-msg-list. + + * mh-comp.el (mh-forward): Modified to use mh-region-to-msg-list. + The buffer-local variable mail-header-separator is no longer + bound. This fixes a bug where the default value of + mail-header-separator gets used if mh-forward is called in a fresh + emacs session. + (mh-annotate-msg): Update this so that it will handle message + lists too. + (mh-insert-letter): Make the test stronger. Since %d is being used + the argument better be an integer. + + * mh-loaddefs.el: Regenerated. + +2002-12-11 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-funcs.el (mh-copy-msg): Add support for transient-mark-mode. + If mark is active and transient-mark-mode is enabled then all the + messages in the region are copied. + + * mh-seq.el (mh-list-sequences): Use mh-coalesce-msg-list to print + messages in sequence nicely. The prompt for the folder is removed + (the current folder is always used) and the output is made nicer + by not overflowing the screen width. + + * mh-loaddefs.el: Regenerated. + +2002-12-09 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-comp.el (mh-letter-complete): Checkdoc fix. + + * mh-seq.el (mh-thread-current-indentation-level): New function + which returns the thread indentation level of current message. + (mh-thread-next-sibling, mh-thread-previous-sibling): New + interactive functions to jump to the next and previous siblings in + thread tree respectively. + (mh-thread-immediate-ancestor): New function to jump to ancestor + of current message in thread tree. + (mh-thread-ancestor): New interactive function to jump to + immediate ancestor or to root message of current thread depending + on optional argument. + + * mh-utils.el (mh-show-thread-ancestor) + (mh-show-thread-next-sibling, mh-show-thread-previous-sibling): + Interactive functions callable from the show buffer. + (mh-show-thread-map): Bindings for Tu, Tp and Tn. + + * mh-e.el (mh-thread-map): Bindings for Tu, Tp and Tn. + + * mh-loaddefs.el: Regenerated. + +2002-12-09 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-region-to-sequence): Change name of region + sequence created to 'mhe-region. This avoids any chance of + collision with actual MH sequences. + (mh-put-msg-in-seq, mh-thread-delete, mh-thread-refile): Change + name of region sequence used to 'mhe-region. Also delete the + 'mhe-region sequence when done. + + * mh-e.el (mh-delete-msg, mh-refile-msg, mh-undo): Same as above. + + * mh-comp.el (mh-forward): Same as above. + + * mh-loaddefs.el: Regenerated. + +2002-12-08 Bill Wohler <wohler@newt.com> + + * mh-alias.el: Edited documentation. Broke up file into 2 + sections: Alias Loading and Alias Expansion. Made terminology + consistent (replaced expand, substitute, and translate with + expand). + (mh-alias-reload): Brought message in line with coding conventions + and made more concise too. + (mh-alias-translate): Renamed to mh-alias-expand. + (mh-alias-substitute-aliases-flag): Renamed to + mh-alias-expand-aliases-flag. + (mh-alias-reload-local-users): Renamed to mh-alias-local-users. + Now just returns an alist of local users rather than have + side-effects. + (mh-alias-reload): Set timestamp at beginning of function to catch + edge case when alias added just after ali runs. Changed logic to + reflect return value of mh-alias-local-users. + + * mh-customize.el (mh-alias-substitute-aliases-flag): Renamed to + mh-alias-expand-aliases-flag. + (mh-alias-local-users): Fixed documentation. + + * mh-loaddefs.el: Regenerated + +2002-12-08 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (require): Load Gnus at compile time so that the + constant gnus-version is defined when MH-E is being compiled. + (mh-macro-expansion-time-gnus-version, mh-run-time-gnus-version): + Use the constant gnus-version instead of the function gnus-version + to find out about gnus version information. + (gnus-version): Remove the autoload since it is not needed any + more. + +2002-12-08 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-version): Moved compilation information in front of + Emacs information. The idea is that you start at MH-E and move + outwards. Show N/A if Gnus not compiled (be explicit). Matched + coding style with other output statements. (Aside: not that + efficiency matters here, but fewer calls to format have to be + faster, right? ;-). Matched output style of old output to new + statement--liked Satyaki's indentation better ;-). + +2002-12-08 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (gnus-version): Autoload the function for use in + mh-version. + (mh-macro-expansion-time-gnus-version): New macro that finds the + Gnus version at macro expansion time. + (mh-run-time-gnus-version): New function to find the Gnus version + at run time. + (mh-version): Add information about Gnus versions available at + compile time and run time. + +2002-12-07 Peter S Galbraith <psg@debian.org> + + * mh-alias.el (mh-alias-ali): Add optional argument. if USER is + t, then assume ALIAS is an address and call ali with option -user. + + * mh-alias.el (mh-alias-filenames): if ARG is t, appends list of + files from `mh-alias-system-aliases' to output list obtained from + mhparam output user list only. + (mh-alias-tstamp): Use it. + +2002-12-05 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-mime.el (mh-inline-vcard-p): A new function which decides if + a vcard should be displayed inline. + (mh-mime-display-single): Use mh-inline-vcard-p to display + attached vcard as a signature if no other signature is present + (this partially addresses SF #649216). + +2002-12-05 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-send-letter): Edits docs for mh-mml-to-mime + getting run if variable `mh-mml-compose-insert-flag' is set. + (mh-get-header-field): use buffer-substring-no-properties instead + of buffer-substring. + +2002-12-04 Peter S Galbraith <psg@debian.org> + + * mh-loaddefs.el: Regenerated. + + * mh-customize.el (mh-customize): Add ;;;###mh-autoload tag. + +2002-12-04 Peter S Galbraith <psg@debian.org> + + * mh-loaddefs.el: Regenerated. + + * mh-comp.el (mh-letter-complete): New command to do alias or word + completion in letter-mode. + (mh-letter-mode-map): Add \M-\t binding for mh-letter-complete. + + * mh-alias.el (mh-alias-letter-mode-expand-alias-hook): Obsolete. + Replaced by mh-letter-complete command. + (mh-alias-reload-maybe): New function to rebuild alias table if + out of date. + (mh-alias-letter-expand-alias): No longer interactive. Use + mh-letter-complete instead. + +2002-12-04 Peter S Galbraith <psg@debian.org> + + * mh-customize.el (mh-letter-complete-function): New defcustom. + Function to call when completing outside of fields specified to + aliases. + + * mh-alias.el (mh-alias-filenames): + s/mh-mhparam-component/mh-profile-component/ + (mh-profile-component): Move to mh-utils.el and make interactive. + (mh-read-address): Make it autoloaded. + + * mh-loaddefs.el: Regenerated. + + * mh-comp.el (mh-read-address): Removed. Replaced by mh-alias + version. + + * mh-utils.el (mh-profile-component): Moved from mh-alias.el. + +2002-12-04 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-msg-is-in-seq): Formatting change. + + * mh-index.el (mh-index-insert-scan): Remove unused variable. + +2002-12-04 Bill Wohler <wohler@newt.com> + + * mh-loaddefs.el: Regenerated. + + * Makefile (MH-E-SRC): Moved mh-loaddefs.el into MH-E-LOADDEFS as + this was causing a cycle. + (MH-E-LOADDEFS): New variable to house mh-loaddefs.el. + (emacs): Reintroduced autoloads. + (autoloads): We're baaa-aack! + (dist, install-emacs): Use MH-E-LOADDEFS. + + * mh-comp.el (mh-customize): Moved to mh-customize.el. + + * mh-customize.el (mh-customize): Moved here from mh-comp. Makes + more sense, doesn't it? + + * mh-alias.el, mh-comp.el, mh-e.el, mh-index.el, mh-mime.el, + mh-pick.el, mh-speed.el: Added mh-autoload cookie to all + interactive functions. + +2002-12-04 Satyaki Das <satyaki@theforce.stanford.edu> + + * Makefile (world): Remove target. + (mh-loaddefs.el): Add comment that only GNU Emacs can be used to + regenerate mh-loaddefs.el. + + * mh-make.el: Removed. + +2002-12-04 Mark D. Baushke <mdb@gnu.org> + + * mh-e.el (recursive-load-depth-limit): Only modify the limit + if it is an integer. + +2002-12-04 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-header-field-beginning): New function. Move to + the beginning of the current header field. + +2002-12-04 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-make.el (mh-files): Read in the MH-E filenames from the + environment variable where the Makefile puts it. + (mh-generate-autoloads, step2): Simplified since we now have the + complete file names. + + * Makefile (world): Pass the MH-E files into the script, so that + the filenames don't need to be repeated in the script. + +2002-12-04 Bill Wohler <wohler@newt.com> + + * mh-loaddefs.el: New file. Check in automatically generated file + and include in package for the benefit of those who don't want to + or can't compile. + + * Makefile (MH-E-SRC): Added mh-loaddefs.el now that it is checked + in and will be packaged. + (emacs): Removed autoloads. Adding mh-loaddefs.el to MH-E-SRC is + sufficient to build it. + (compile): Depend on MH-E-SRC instead of MH-E-OBJ and pass $? into + emacs so that Emacs is only invoked once to compile files. This + speeds things up by a factor of 3. It would be nice to only pass + those files that have been modified, but Emacs 21.4 will have + batch-byte-compile-if-not-done which we might be able to copy into + mh-make.el (or my proposed mh-e-dev.el which would be more + general-purpose). + (.SUFFIXES): Removed. Now that compile works directly on the + sources, the implicit rule is obsolete. + (autoloads): Deleted. See emacs change above. + +2002-12-03 Bill Wohler <wohler@newt.com> + + * Makefile (MH-E-SRC, emacs): + +2002-12-03 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-make.el (mh-emacs): Make failing condition more strict. + (mh-loaddefs-end): Remove redundant statement. + + * Makefile (world): A little typo. The bug didn't seem to make any + difference though. + + * mh-make.el: New script that compiles MH-E. + (mh-loaddefs-beginning, mh-loaddefs-end): Don't save the autoloads + file in between. Only save at the end. + (mh-emacs-generate-autoloads, mh-xemacs-generate-autoloads) + (mh-generate-autoloads): Replace the separate functions in Emacs + and XEmacs with one that works in both variants. This simplifies + the script a lot. + (mh-generate-autoloads): doc fix. + + * Makefile (world): New target which works for both GNU Emacs and + XEmacs. + +2002-12-03 Peter S Galbraith <psg@debian.org> + + * mh-alias.el (mh-mhparam-component): Don't raise error if call to + mhparam fails. + + * mh-alias.el (mh-alias-letter-expand-alias): Build alias table if + not already available. + +2002-12-03 Bill Wohler <wohler@newt.com> + + * mh-customize.el (mh-show-threads-flag): Alphabetized. + +2002-12-03 Jeffrey C Honig <jch@honig.net> + + * Makefile: Moved .PHONY rule after all rule for compatibility + with BSD/OS's old pmake. + +2002-12-03 Mark D Baushke <mdb@gnu.org> + + * mh-e.el (mh-get-new-mail): Simplify no-new-mail test. + (mh-add-cur-notation): Remove unnecessary function. + +2002-12-03 Peter S Galbraith <psg@debian.org> + + * mh-identity.el (mh-identity-make-menu): Check if + 'mh-letter-mode-map' is bound, since this code also gets run when + mh-customize.el is loaded at startup. + +2002-12-03 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-customize.el (mh-show-threads-flag): New customizable + variable which controls if new folders start of in threaded mode + (closes SF #646794). + + * mh-e.el (mh-rescan-folder): Fix the function so that threading + is preserved across rescans. + (mh-visit-folder, mh-inc-folder): The folder is threaded if it was + already threaded or if mh-show-threads-flag is non-nil and the + number of scan lines is fewer than mh-large-folders (closes SF + #646794). + +2002-12-02 Mark D Baushke <mdb@gnu.org> + + * mh-e.el (mh-add-cur-notation): New function to mark the + current message with the mh-note-cur character. + (mh-get-new-mail): Use mh-add-cur-notation to undo the work of + mh-remove-cur-notation if there was no new mail (closes SF #647681). + + * mh-e.el (mh-set-cmd-note): Do not update the default mh-cmd-note + value (closes SF #643701). + +2002-12-02 Peter S Galbraith <psg@debian.org> + + * mh-alias.el (mh-alias-reload): Renamed from mh-alias-learn-aliases. + (mh-alias-load-local-users): Renamed from mh-alias-learn-local-users. + (mh-alias-passwd-alist): New variable, holding aliases extracted + from the passwd file. + (mh-alias-tstamp): New variable storing the timestamp for alias + list generation. + (mh-read-address, mh-alias-reload, mh-alias-reload-local-users): + Complete rewrite. + (mh-alias-minibuffer-confirm-address): Use mh-alias-translate. + (mh-alias-translate): New function. Return translation for alias, + checking if in blind or passwd list. + (mh-alias-letter-expand-alias): Rewrite using + mail-abbrev-complete-alias from mailabbrev.el + (mh-alias-expand-alias-map): New variable. + (mh-alias-ali): New function. Return formatted string of + translated ALIAS from ali. + (mh-mhparam-component): New function. Return COMPONENT value from + mhparam, or nil if unset. + (mh-alias-filenames): New function. Provide list of alias + filenames from mhparam, or nil if none are set. + + * mh-customize.el (mh-alias-display-blind-name-on-completion-flag): + Obsoleted. + (mh-alias-timestamp): Renamed to mh-alias-system-aliases. + +2002-12-02 Bill Wohler <wohler@newt.com> + + * Makefile (mh-loaddefs.el): Suppress creation of backup file. + +2002-12-02 Mark D. Baushke <mdb@gnu.org> + + * Makefile (mh-loaddefs.el): Simplify rule. + + * Makefile (clean): Remove mh-loaddefs.el* for good measure. + ($(MH-E-OBJ)): Depend on mh-loaddefs.el to compile these. + (autoloads, mh-loaddefs.el): Revamp rules. + (mh-loaddefs.el-tail, autoloads-gen): Remove rules. + + * mh-e.el (recursive-load-depth-limit): Do not try to + bump the value unless the variable exists. + + * mh-e.el (recursive-load-depth-limit): Bump value of + recursive-load-depth-limit to 50 to allow emacs 21.1 which + normally has a default value of 10 to be able to compile MH-E. + +2002-12-02 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-funcs.el (mh-pack-folder, mh-sort-folder): Fix the functions + so that threading is preserved (needed for SF #646794). + + * mh-identity.el (mh-identity-signature-start) + (mh-identity-signature-end): Checkdoc fixes. + + * mh-e.el (mh-previous-unread-msg, mh-next-unread-msg): Checkdoc + fixes. + +2002-12-01 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-identity.el (compile): Make mh-identity.el compile without + warnings. + + * mh-e.el (mh-previous-unread-msg, mh-next-unread-msg): New + interactive functions that go to next and previous unread + messages (closes SF #630328). + (mh-folder-mode-map): Add key bindings for M-n and M-p to + mh-folder-mode-map. + + * mh-utils.el (mh-show-next-unread-msg) + (mh-show-previous-unread-msg): New interactive functions that go + to the next and previous unread messages respectively. These are + callable from the show buffer. + (mh-show-mode-map): Add key bindings for M-n and M-p to + mh-show-mode-map. + +2002-12-01 Bill Wohler <wohler@newt.com> + + * mh-mime.el (mh-defun-compat): Make it indent like a defun. + + * mh-index.el (mh-defun-index): Make it indent like a defun. + + * mh-customize.el: New file (closes SF #643722). + + * Makefile (MH-E-SRC): Added mh-customize.el (closes SF #643722). + + * mh-speed.el, mh-pick.el, mh-mime.el, mh-index.el, mh-e.el, + mh-comp.el: Moved all defgroups, defcustoms, and deffaces to + mh-customize.el (closes SF #643722). + + * mh-utils.el (mh-xemacs-flag): Moved here from below since + needed by mh-customize.el. + (mh-customize): Required. mh-invisible-headers) + (mh-bury-show-buffer-flag, mhl-formfile): + Moved all defgroups, defcustoms, and deffaces to mh-customize.el + (closes SF #643722) . + + * mh-identity.el (mh-comp-loaded): New variable in a desparate + attempt to prevent an infinite loop. + (eval-when-compile): Was able to remove these defvars as they are + now predefined in mh-loaddefs and mh-customize. + (mh-identity-list-set): Added ;;;###mh-autoload cookie. + Moved all defgroups, defcustoms, and deffaces to mh-customize.el + (closes SF #643722). + + * mh-alias.el (mh-e): Require this, as it needs defcustoms, which + is in mh-customize which is required by mh-utils which is required + by mh-e. + Moved all defgroups, defcustoms, and deffaces to mh-customize.el + (closes SF #643722). + +2002-11-30 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-thread-map): Add key bindings "Td" and "To" (closes + SF #630493). + (mh-help-messages): Update help message for prefix map. + (mh-help-messages): Doc fix. + (mh-help-messages): Really fix it. + + * mh-utils.el (mh-show-thread-delete, mh-show-thread-refile): New + interactive functions corresponding to mh-thread-delete and + mh-thread-refile callable from the show buffer. + (mh-show-thread-map): Add key bindings for "Td" "To". + + * mh-seq.el (mh-narrow-to-seq, mh-put-msg-in-seq, mh-rename-seq) + (mh-narrow-to-subject, mh-delete-subject, mh-toggle-threads): Add + mh-autoload cookies. + (mh-thread-find-children): New function which finds the region + containing all children of a message. + (mh-thread-delete): New interactive function that marks for + deletion the current message and its children. + (mh-thread-refile): New interactive function that marks for + refiling the current message and its children. + +2002-11-30 Bill Wohler <wohler@newt.com> + + * mh-funcs.el, mh-identity.el, mh-index.el, mh-pick.el, mh-seq.el: + Removed MH-E autoloads. These are now provided by mh-loaddefs.el. + Added ;;;###mh-autoload tag to selected functions so that + autoloads for those functions can be automatically created in + mh-loaddefs.el (closes half of SF #643722). + + * mh-mime.el (mh-buffer-data): Moved to mh-utils where it is used. + Added ;;;###mh-autoload tag to selected functions so that + autoloads for those functions can be automatically created in + mh-loaddefs.el (closes half of SF #643722).. + + * mh-utils.el (mh-loaddefs): Added require. + (mh-buffer-data): Moved here from mh-mime.el as it is used in + mh-display-msg. + (mh-set-cmd-note): Moved to mh-e.el. + Removed MH-E autoloads. These are now provided by mh-loaddefs.el. + Added ;;;###mh-autoload tag to selected functions so that + autoloads for those functions can be automatically created in + mh-loaddefs.el (closes half of SF #643722).. + + * mh-e.el (mh-set-cmd-note): Moved here from mh-utils.el since it + uses mh-scan-format-file which is defined here. + Removed MH-E autoloads. These are now provided by mh-loaddefs.el. + Added ;;;###mh-autoload tag to selected functions so that + autoloads for those functions can be automatically created in + mh-loaddefs.el (closes half of SF #643722).. + + * mh-comp.el, mh-speed.el (mh-utils): Removed require. mh-utils is + provided via mh-e.el. + Removed MH-E autoloads. These are now provided by mh-loaddefs.el. + Added ;;;###mh-autoload tag to selected functions so that + autoloads for those functions can be automatically created in + mh-loaddefs.el (closes half of SF #643722).. + + * Makefile (emacs): Add dependency on autoloads. + (clean): Remove mh-loaddefs.el too. + (autoloads): New target. Builds mh-loaddefs.el. + (mh-loaddefs.el): New target. Initializes mh-loaddefs.el. + (mh-loaddefs.el-tail): New target. Appends to mh-loaddefs.el. + (autoloads-gen): Runs batch-update-autoloads to populate + mh-loaddefs.el (closes half of SF #643722).. + (auto-autoloads.elc): Renamed from autoloads to be explicit about + file that's created. + (custom-load.elc): Ditto. + +2002-11-30 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-last-ancestor): New variable which keeps + track of oldest ancestor of last message. If due to narrowing the + common ancestor of two messages is lost then one of them is + promoted to be the parent of the other. This variable helps in + this process. + (mh-thread-generate-scan-lines): Group messages which belong to + the same thread tree, even if a common ancestor is no longer + present. + (mh-thread-folder, mh-copy-seq-to-eob, mh-thread-inc): Bind + mh-thread-last-ancestor to nil when calling + mh-thread-generate-scan-lines. + + * mh-mime.el (font-lock): Font-lock required at compile time to + avoid warning about font-lock-maximum-size + (mh-display-smileys, mh-display-emphasis): Show graphical smileys + and emphasis only if message isn't too large. + + * mh-e.el (mh-visit-folder): Revisiting a buried folder which has + been threaded or narrowed confuses MH-E. Even though the folder is + displayed as not threaded and not narrowed, MH-E still believes + the folder is in the previous state. This can cause problems when + trying to narrow/thread the folder. The change fixes this. + + * mh-mime.el (mh-mime-display-alternative): The setting of + mh-display-buttons-for-inline-parts-flag was not being used when + displaying one of the alternatives. This change fixes that. + + * mh-comp.el (mh-show-buffer-message-number): Replace subseq with + substring. + (mh-filter-out-non-text): When filtering out MIME buttons from + yanked text, the last line of the MIME part was getting lost. The + fix avoids that and removes only the last new line instead. + +2002-11-29 Peter S Galbraith <psg@debian.org> + + * Makefile (MH-E-SRC): Add mh-alias. + + * mh-alias.el: Assign copyright to FSF instead of myself. + (mh-read-address): Add support for emacs-21's + completing-read-multiple to prompt for multiple entries. + (mh-alias-PC-complete-address): Deleted. + (mh-alias-learn-aliases): Use mh-exec-cmd-quiet instead of old kludge. + (mh-alias-letter-mode-expand-alias-hook): Simplify. + (mh-alias-hostname): Deleted. + (mh-alias-substitute-aliases-flag): Change default to nil. + (mh-alias-display-blind-name-on-completion-flag) Change default to + nil. + (mh-alias-alist): Now holds alias values. + (mh-alias-lowercase-alist): Deleted. + (mh-alias-minibuffer-confirm-address, mh-alias-learn-aliases) + (mh-alias-learn-local-users, mh-alias-letter-expand-alias): Use + new mh-alias-alist instead of old mh-alias-lowercase-alist. + + * mh-alias.el: Moved from contrib/ directory. Now part of MH-E! + + * Makefile (MH-E-SRC): Add mh-identity. + + * mh-identity.el (mh-compose-and-send-mail, mh-insert-identity) + (mh-identity-make-menu, mh-identity-default, mh-identity-menu): + Moved to mh-comp.el. + + * mh-comp.el (mh-compose-and-send-mail): Add mh-identity support. + (mh-insert-identity, mh-identity-make-menu, mh-identity-default) + (mh-identity-menu): Added from mh-identity.el + +2002-11-29 Bill Wohler <wohler@newt.com> + + * mh-comp.el, mh-e.el, mh-funcs.el, mh-identity.el, mh-index.el, + mh-mime.el, mh-pick.el, mh-seq.el, mh-speed.el, mh-utils.el: + Ran indent-region, reformatted long lines, ran untabify. + (indent-tabs-mode): Set file local variable to nil. + +2002-11-29 Bill Wohler <wohler@newt.com> + + * Released MH-E version 7.0. + + * mh-e.el (Version, mh-version): Updated for release 7.0. + + * mh-comp.el (subseq, search): Require cl instead of autoloading + these due to compilation warnings in CVS Emacs. + +2002-11-23 Bill Wohler <wohler@newt.com> + + * MH-E-NEWS: Emphasize the renaming of the variables at the top of + the notes. + +2002-11-22 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-show-mode-map): Remove binding for RET since it + is not needed and the binding is more useful to toggle display of + MIME parts. + + * mh-mime.el (mh-mime-button-commands): Remove bindings for "i" + and "o" from MIME buttons. + (mh-insert-mime-button): Change comment to reflect change in + button key map. + +2002-11-21 Bill Wohler <wohler@newt.com> + + * Released MH-E version 6.1.91. + + * mh-e.el (Version, mh-version): Updated for release 6.1.91. + + * MH-E-NEWS: Inline HTML parts supported with Gnus 5.10, not 5.9. + +2002-11-21 Mark D. Baushke <mdb@gnu.org> + + * mh-comp.el (mh-letter-insert-signature-hook): This should be in + customize-group mh-compose. + +2002-11-21 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (load): Load mm-view.el here so that + mm-inline-text-html would be defined if available. + (mh-mm-inline-media-tests): If mm-inline-text-html is available + then use it, otherwise fall back on using mm-inline-text (closes + SF #641482). + + * mh-mime.el (load): Remove the load of mm-view here since it + happens in mh-utils.el now. + +2002-11-15 Bill Wohler <wohler@newt.com> + + * Released MH-E version 6.1.90. + + * README (Compile): New section. Users must now compile MH-E due + to the vagaries of the various versions of gnus. + + * Makefile (MH-E-IMG): Added reply-all.pbm, reply-all.xpm, + reply-from.pbm, reply-from.xpm, reply-to.pbm, reply-to.xpm. + (MH-E-ETC-ETC): Added Makefile and README. + (dist): Depend on all, so clean happens. Don't add .elc files to + tarball as they are built upon installation now. + +2002-11-15 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-process-commands): Fix a bug in mh-execute-commands. + If called in threaded mode, cur was always getting set to the last + message in the folder. + +2002-11-14 Bill Wohler <wohler@newt.com> + + * mh-e.el (Version, mh-version): Updated for release 6.1.90. + + * MH-E-NEWS, README: Updated for release 7.0. + + * mh-utils.el (mh-index-search): Added full docstring which new + users will need before they run a search! + (mh-swish++-execute-search, mh-swish-execute-search, + mh-namazu-execute-search mh-glimpse-execute-search): Added + autoloads with full docstrings for the same reason! + + * mh-e.el (mh-limit-map): Removed / / alias for + mh-narrow-to-subject. + + * mh-utils.el (mh-show-thread-map): Removed / / alias for + mh-show-narrow-to-subject. + + * mh-seq.el (mh-delete-subject): Checkdoc fix. + + * mh-e.el (mh-help-messages): Added / prefix character to help + string. Tweaked / helpstring a little. + +2002-11-14 Mark D. Baushke <mdb@gnu.org> + + * mh-utils.el (mh-set-cmd-note): Fix nitpick by adding one to the + width for cosmetic reasons. + +2002-11-14 Peter S Galbraith <psg@debian.org> + + * mh-identity.el (mh-insert-identity): Fix a few things undone by + Jeff's patch. + (mml-insert-tag): Add autoload. + +2002-11-13 Mark D. Baushke <mdb@gnu.org> + + * mh-identity.el (mh-insert-identity): A value of either nil or + "" should cause the field to be removed. + (mh-identity-list): Update the docstring. + +2002-11-13 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-limit-map): New key map for limits (subject for now). + * mh-utils.el (mh-show-limit-map): Same. + + * mh-seq.el (mh-delete-subject): Renamed from + mh-delete-subject-sequence. + (mh-narrow-to-subject): Renamed from mh-narrow-to-subject-sequence. + (mh-next-unseen-subject-sequence): Removed. :-( + * mh-e.el: Use 'em + * mh-seq.el: Use 'em. + +2002-11-13 Mark D. Baushke <mdb@gnu.org> + + * mh-e.el (mh-alt-show): New defalias for mh-show. + (mh-alt-refile-msg): New defalias for mh-refile-msg. + (mh-alt-send): New defalias for mh-send. + (mh-folder-mode-map): Use mh-alt-show, mh-alt-refile-msg and + mh-alt-send for the alias bindings. + (mh-alt-visit-folder): New defalias for mh-visit-folder. + (mh-folder-map): Use it. + (mh-folder-message-menu): Revert previous change. + +2002-11-13 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-folder-message-menu): Make key binding "o" appear in + menu for mh-refile-msg. + +2002-11-13 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-generate-scan-lines): In threaded view, + scan lines of duplicate messages were too long. The change fixes + that. + +2002-11-13 Bill Wohler <wohler@newt.com> + + * mh-utils.el (mh-adaptive-cmd-note-flag): Improved grammar in + docstring. + + * mh-speed.el (mh-speed-run-flists-flag): While documenting this + variable in the release notes, I was unsure what would happen if + set to nil. So, I clarified the docstring and indicated + implications of setting this variable to nil, and offered manual + workaround. + +2002-11-13 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-quit): Fix documentation and run + mh-before-quit-hook and mh-quit-hook. + +2002-11-13 Bill Wohler <wohler@newt.com> + + * mh-utils.el (with-mh-folder-updating): Renamed local variable + mh-save-modification-flag to save-modification-flag. + +2002-11-12 Bill Wohler <wohler@newt.com> + + * mh-index.el (mh-index-keymap): Renamed to + mh-index-folder-mode-keymap to be a closer to the usual keymap + naming convention. Since we want our own keymap and not inherit + the one in mh-folder-mode, we need to use a suffix other than + -map. + + * mh-e.el (mh-folder-sequence-menu): s/Msg/Message. + s/Seq/Sequence. + (mh-folder-message-menu): s/Msg/Message. Removed redundant refile + item. + (mh-folder-folder-menu): Aligned symbols. + + * mh-index.el (mh-index-folder-message-menu): s/Msg/Message. + + * mh-utils.el (mh-show-sequence-menu): s/Msg/Message. + s/Seq/Sequence. + (mh-show-message-menu): s/Msg/Message. Removed redundant refile + item. + (mh-show-folder-menu): Aligned symbols. + +2002-11-12 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-matches, mh-index-current-match): Remove + these variables since they were only used for glimpse and grep. + Now the functionality of all the indexing programs will be + uniform. + (mh-index-search, mh-index-insert-scan, mh-defun-index) + (mh-index-show): Simplify functions since matches are no longer + shown. + (mh-index-parse-match): Remove function. + + * mh-e.el (mh-scan-cmd-note-width, mh-scan-destination-width) + (mh-scan-date-width, mh-scan-date-flag-width) + (mh-scan-from-mbox-width, mh-scan-from-mbox-sep-width): New + variables to keep track of the widths of the different fields in + the scan lines. + (mh-scan-field-from-start-offset, mh-scan-field-from-end-offset) + (mh-scan-field-subject-start-offset): Offsets that are computed + from the scan line widths. + + * mh-seq.el (mh-copy-seq-to-eob, mh-thread-inc) + (mh-thread-parse-scan-line): Use new variables that remember the + various offsets in place of integer constants. + (mh-thread-generate-scan-lines): Space shouldn't be added here! + +2002-11-12 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-scan-format-mh, mh-scan-format-nmh): Noted that the + first column is column number 0 and changed "sixth column" to + "fifth column" accordingly. + + * mh-index.el (mh-index-folder-mode): Clarified method of replying + in mode documentation. + (mh-index-folder-tool-bar-map): s/mh-e/MH-E/. + + * mh-e.el (mh-generate-new-cmd-note): Try not to mention internal + variable mh-cmd-note in docstrings. + + * mh-utils.el (mh-adaptive-cmd-note-flag): Set default value to t. + Reworded docstring so it doesn't mention internal variable + mh-cmd-note. Added information about using fixed-width message + numbers. + (mh-cmd-note): Mention mh-set-cmd-note in docstring. Also suggest + that it is updated dynamically only if mh-scan-format-file is t. + (mh-set-cmd-note): Grammer fix in docstring. + (mh-cmd-note): Noted that the first column is column number 0. + + * mh-e.el (mh-scan-format-file): Added information about + mh-set-cmd-note and mh-adaptive-cmd-note-flag to docstring. + + * mh-index.el (mh-index-keymap): Added bindings for i + (mh-inc-folder), m (mh-send alias), and s (mh-send) since these + appear to be supported and are found in the toolbar. + (mh-index-folder-key-map): Ditto for f (mh-visit-folder alias), o + (mh-visit-folder) alias, and v (mh-visit-folder). + (mh-index-folder-mode-help-messages): Changes for above. + (mh-index-folder-message-menu, mh-index-folder-folder-menu): New + menus. I decided to delete the unavailable items since greying out + implies that the user can do something to access them. In this + case, that's not the case. Well, that's not entirely true--the + user could write code for those functions ;-). + (mh-index-folder-mode): Use new menus. + + * mh-utils.el (mh-prompt-for-folder): Added optional argument + default-string which can be used in case the string for default + isn't intuitive enough. + + * mh-index.el (mh-index-search): Made default prompt more + intuitive (I hope!). + +2002-11-11 Peter S Galbraith <psg@debian.org> + + * mh-identity.el (mh-header-field-delete): Remove save-excursion. + Strange that this worked for me before... Thanks to Jeff for the + patch. + (mh-insert-identity): Numerous tweaks and fixes from Jeff who also + adds a nicer-looking MIME header for signatures inserted after + MIME insertions. + +2002-11-11 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-parse-scan-line): Generalize this function + so that it can take a string containing the scan-line as argument + in addition to using the line at point. + (mh-thread-add-spaces): New function to pad each scan line to the + appropriate length. This is called when mh-cmd-note is increased. + + * mh-e.el (mh-generate-new-cmd-note): Make this work on a threaded + folder by using mh-thread-add-spaces to pad the pre-existing lines + in mh-thread-scan-line-map appropriately. + (mh-thread-add-spaces): Autoload from mh-seq. + +2002-11-11 Mark D. Baushke <mdb@gnu.org> + + * mh-index.el: Fix checkdoc nit. + + * mh-mime.el (mh-display-buttons-for-inline-parts-flag): Renamed + from mh-display-buttons-for-inline-parts. + (mh-mime-display-single): Use it. + This addresses part of SF #627015. + + * mh-e.el (mh-print-background-flag): Renamed from + mh-print-background. + * mh-funcs.el (mh-print-msg): Use it. + This addresses part of SF #627015. + + * mh-comp.el (mh-delete-yanked-msg-window-flag): Renamed from + mh-delete-yanked-msg-window. + (mh-yank-from-start-of-msg, mh-yank-cur-msg): Use it. + This addresses part of SF #627015. + + * mh-utils.el (mh-update-sequences-after-mh-show-flag): Renamed + from mh-update-sequences-after-mh-show. + (mh-show-msg): Use it. + This addresses part of SF #627015. + + * mh-utils.el (mh-decode-quoted-printable-flag): Renamed from + mh-decode-quoted-printable + (mh-display-msg, mh-decode-quoted-printable-have-mimedecode): + Use it. + This addresses part of SF #627015. + + * mh-utils.el (mh-recursive-folders-flag): Renamed from + mh-recursive-folders. + (mh-make-folder-list-background): Use it. + * mh-funcs.el (mh-list-folders): Ditto. + This addresses part of SF #627015. + + * mh-utils.el (mh-auto-folder-collect-flag): Renamed from + mh-auto-folder-collect. + (mh-find-path): Use it. + This addresses part of SF #627015. + + * mh-utils.el (mh-decode-mime-flag): Renamed from + mh-decode-mime. + * mh-utils.el (mh-show-mode, mh-show-xface) + (mh-decode-quoted-printable, mh-display-msg, mh-display-msg): Use it. + * mh-mime.el (mh-graphical-smileys-flag) + (mh-graphical-emphasis-flag): Ditto. + * mh-index.el (mh-index-search, mh-index-show): Ditto. + * mh-e.el (mh-header-display): Ditto. + This addresses part of SF #627015. + + * mh-e.el (mh-make-folder-mode-line): Use save-window-excursion + to get back to the current message. + +2002-11-10 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-keymap, mh-index-page-msg) + (mh-index-folder-tool-bar-map): Replace mh-index-scroll-up with + mh-index-page-msg. + (mh-index-keymap, mh-index-previous-page): Replace + mh-index-scroll-down with mh-index-previous-page. + +2002-11-09 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (autoload/require): Load mh-mime when mh-index.el is + loaded. This fixes the infinite load loop. I am not sure what the + actual problem is. Also removed the nop requires/autoloads. + (mh-defun-index): Use the right argument for mh-recenter. + Otherwise it misbehaves for the default value of + mh-summary-height. + + * mh-e.el (mh-goto-next-button): Fix infinite loop when S-Tab was + used on first line of index folder buffer. + +2002-11-09 Peter S Galbraith <psg@debian.org> + + * mh-index.el (mh-index-folder-tool-bar-map): Tool-bar for + mh-index-mode. + (mh-index-folder-mode): Use it. + (mh-index-keymap): Added mouse-2 binding, like in regular + folder-mode. + +2002-11-08 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-folder-mode): Fix doc string for major + mode. It was pointing to the wrong keymap. + (mh-index-show-mode): Fix doc string for mode. Also add mh-help + support. + + * mh-comp.el (mh-forward, mh-yank-cur-msg): Use new macro + mh-mark-active-p instead. This does the right thing for different + variants of Emacs. + (mh-yank-cur-msg): Add a space between sexprs. + + * mh-utils.el (mh-mark-active-p): New macro which papers over + diffences between GNU Emacs and XEmacs. The variables mark-active + and transient-mark-mode are used in GNU Emacs while zmacs-regions + and region-active-p are used in XEmacs. + + * mh-seq.el (mh-put-msg-in-seq, mh-thread-ancestor-p): Use + mh-mark-active-p as above. + + * mh-e.el (mh-delete-msg, mh-refile-msg, mh-undo): Use + mh-mark-active-p as above. + +2002-11-06 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-yank-cur-msg): Fix for XEmacs. It didn't work + with a selected region, and left the inserted text selected (in + reverse video). I didn't use SF patch #402315 to implement this. + +2002-11-05 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-show-tool-bar-map): Change call to + mh-tool-bar-search-command such that user can customize it for the + current session. + + * mh-e.el (mh-folder-tool-bar-map): Same. + +2002-11-05 Bill Wohler <wohler@newt.com> + + * mh-utils.el, mh-e.el (mh-tool-bar-search-function): Renamed from + mh-tool-bar-search-command. + + * mh-index.el (mh-index-search): Backed out previous change to + prompt. There ain't no folder named "all." + + * mh-utils.el (mh-tool-bar-search-command): Added mh-search-folder + and mh-index-search to the docstring so that user can easily click + on them for more information. + + * mh-pick.el (mh-search-folder): Mention that this function uses + the MH pick command to give the user more information when + choosing between mh-search-folder and mh-index-folder. + + * mh-index.el (mh-index-search): Edited the docstring. Direct the + user to mh-index-program if necessary. + (mh-index-program): Edited this docstring too. Viewing the help + in a *Help* buffer really exposes grammatical flaws. + +2002-11-05 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-tool-bar-search-command): New defcustom to set + what search function to use in tool-bar. + (mh-show-tool-bar-map): Use it. + + * mh-e.el (mh-folder-tool-bar-map): Use it. + +2002-11-05 Bill Wohler <wohler@newt.com> + + * mh-index.el (mh-index-search): Changed default prompt from "+" + to "all". mh-prompt-for-folder doesn't seem to mind. + + * mh-e.el (mh-folder-folder-menu): Added menu entry for + mh-index-search. + + * mh-utils.el (mh-show-folder-menu): Added menu entry for + mh-index-search. + + * mh-index.el: Added commentary on supported search engines and + for getting started (initializing database). + +2002-11-04 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-keymap, mh-index-folder-key-map): Move key + binding of "i" to "Fi". + (mh-index-folder-mode-help-messages): Change help message to + reflect above change. + +2002-11-04 Bill Wohler <wohler@newt.com> + + * mh-index.el (mh-index-program, mh-indexer): Swapped names since + the former seems like a better user variable name. If you've + customized mh-indexer, be sure to toss it out and customize + mh-index-program. + +2002-11-04 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-indexer-choices): Not having the quotes in the + binary names is a bit nicer since that maintains uniformity with + the other names. + (mh-index-choose): Use symbol-value instead of eval. Eval should + be avoided except when it can't be :-). + +2002-11-04 Bill Wohler <wohler@newt.com> + + * mh-index.el (mh-index-program): New variable to hold the name of + the indexer that was found; use this instead of clobbering + user-customizable variable mh-indexer. + (mh-index-search): Use it. Added comments to keep others from + doing what I had done (fortunately, I caught myself before + checking it in ;-). + (mh-index-choose): Set mh-index-program instead of mh-indexer. + Update docstring to describe side-effects. + + * mh-index.el (mh-indexer): Added swish++ to docstring. Chances + are good that if someone has both swish++ and swish, they want to + use the much faster, much smaller swish, so move it up in the + list. + (mh-indexer-choices): Ditto for rationale for moving swish++ up in + priority over swish. Also, use -binary symbols instead of + hard-coding binary names. This allows package installers to + customize the location of the binaries in site-lisp and still have + the auto-detection code work. It also allows one to have alternate + binary names (see mh-swish++-binary). + (mh-index-search): Ditto (moving swish++ up). + (mh-swish++-binary): Look for search++, then search. The rationale + is that a package maintainer may rename search to search++ if + search is already in use (e.g., Debian) so try it first. + (mh-swish++-execute-search): Replaced Satyaki's path with dummy + path in docstring. Also removed RecurseSubdirs since this is the + default. Added comment that index might be named index++ on some + systems (e.g., Debian). + (mh-index-choose): Updated to work with new mh-indexer-choices. + +2002-11-04 Peter S Galbraith <psg@debian.org> + + * mh-identity.el (mh-identity-list-set): Don't call easy-menu-add + here, since that adds the menu to the Customize buffer in XEmacs. + +2002-11-04 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-mhn-compose-insert-flag) + (mh-mml-compose-insert-flag): Removed eval-when-compile defvar. + + * mh-mime.el (mh-mhn-compose-insert-flag) + (mh-mml-compose-insert-flag): Move variables to mh-utils.el. + Fixes mh-letter-menu for XEmacs. + +2002-11-04 Eric Ding <eding@rational.com> + + * mh-comp.el (mh-rejected-letter-start): add another string + +2002-11-04 Eric Ding <ericding@alum.mit.edu> + + * mh-comp.el (mh-rejected-letter-start): regexp-opt doesn't take + regexps as args, only regular strings + +2002-11-04 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-insert-mail-followup-to): Don't modify a + pre-existing M-F-T field. If a nmh replgroupcomps propagates a + M-F-T field in a message reply, then we have to have it alone. + +2002-11-02 Bill Wohler <wohler@newt.com> + + * mh-comp.el, mh-e.el, mh-funcs.el, mh-identity.el, mh-index.el, + mh-mime.el, mh-pick.el, mh-seq.el, mh-speed.el, mh-utils.el, + mh-xemacs-compat.el: Added Local Variables section. Defined + sentence-end-double-space to be nil so that those who might not + buy my setting of this variable can at least run checkdoc without + a whole lot of noise. + +2002-11-02 Peter S Galbraith <psg@debian.org> + + * mh-identity.el: New file. Multiple Identify support for MH-E. + Used to easily set different fields such as From and Organization, + as well as diffrent signature files. This file won't be included + with V7.0. + +2002-11-02 Bill Wohler <wohler@newt.com> + + * mh-mime.el (mh-mm-save-part): New function to wrap mm-save-part + from Gnus 5.10 to make it explicit which code has been + commandeered. + (mh-mime-save-part): Call mh-mm-save-part instead of cut-n-pasted + code from Gnus 5.10. + +2002-11-02 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-yank-from-start-of-msg): Edit docstring to + mention related variables mh-reply-show-message-flag and + mh-delete-yanked-msg-window. + (mh-reply): Change the "Reply to whom" prompt. + +2002-11-01 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-show-hook): Moved to mh-utils.el where it is used. + (mh-folder-list-change-hook): Converted this from defvar in other + files to defcustom here. It is called, not documented as + obsolete, and might as well be documented. + (mh-inc-folder, mh-quit, mh-delete-a-msg, mh-refile-a-msg, + mh-process-commands, mh-update-unseen): Added missing + documentation about hook, or made verbiage about hook consistent + throughout, even if the function isn't interactive. + + * mh-utils.el (mh-folder-list-change-hook): Moved defvar to mh-e + and made it a defcustom. + (mh-show-mode-hook): Put it back in (actually, it was in mh-e.el, + but this is the place where it is called). + (mh-show-hook): Moved here from mh-e.el since it's called here. + (mh-show-mode): Call mh-show-mode-hook. + (mh-show-mode, mh-show-msg, mh-find-path, mh-prompt-for-folder, + mh-prompt-for-folder, mh-set-folder-list): Added missing + documentation about hook, or made verbiage about hook consistent + throughout, even if the function isn't interactive. + + * mh-comp.el (mh-send-letter): Made verbiage about hook consistent + throughout. + (mh-insert-prefix-string): Made docstring more descriptive of what + is going on. + + * mh-funcs.el (mh-kill-folder): Added missing documentation about + hook. + + * mh-index.el (mh-index-show-hook): Moved defvar to defcustom. + (mh-index-show): Made verbiage about hook consistent throughout. + + * mh-mime.el (mh-edit-mhn-hook): Moved defvar to defcustom. + (mh-edit-mhn): Added missing documentation about hook. + + * mh-pick.el (mh-pick-mode): Made verbiage about hook consistent + throughout. Call the damn hook. + +2002-11-01 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-comp.el (mh-insert-mail-followup-to-list): Fix typo so that + it will look right in info. + + * mh-index.el (mh-index-search): Change argument name from + new-buffer-p to new-buffer-flag. + (mh-index-search-again, mh-index-search): New index-buffers were + being named *mh-index*<2>, *m-index*<2><2> and so on. This problem + is fixed. + (mh-index-scroll-up, mh-index-scroll-down): Scrolling in index + show buffers (after the first one) was broken. + (mh-index-quit): Bury show buffer instead of killing it. Killing + it, without killing the corresponding folder buffer, can cause + confusion with two folder buffers trying to display in the same + show buffer. + + * mh-seq.el (mh-thread-prune-containers): Rewritten without + recursion. Also removed the top-level-p argument since it isn't + required anymore. + (mh-thread-sort-containers): New function factored out from + previous definition of mh-thread-prune-containers. It sorts + message containers in ascending order wrt their message indices. + (mh-thread-generate): Use new mh-thread-prune-containers. + + * mh-e.el (mh-remove-all-notation): Fix the test. It was testing + at the wrong place! + +2002-10-31 Bill Wohler <wohler@newt.com> + + * Makefile, README, import-emacs, mh-comp.el, mh-e.el, + mh-funcs.el, mh-index.el, mh-mime.el, mh-pick.el, mh-seq.el, + mh-speed.el, mh-utils.el: Replaced mh-e with MH-E. + +2002-10-31 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-parse-scan-line): Modified to remove user + sequence notation and leave notation for other things alone. This + ensures that threading doesn't lose notations for replied-to + messages. + + * mh-e.el (mh-inc-folder): Remove call to mh-widen here and + instead do it in mh-get-new-mail. This way the widening happens + only if new mail is incorporated. + (mh-generate-new-cmd-note): The function now returns the point + from which the new messages start. This will allow threading to do + the right thing. + (mh-get-new-mail): Always call mh-remove-cur-notation. Otherwise + adaptive scan mode leaves two messages marked as current in + certain cases. Fix indentation of if statement. If there are + messages to be incorporated, the folder is widened. If mh-cmd-note + changes set start-of-inc correctly. + (mh-remove-all-notation): Change this function to only remove user + sequence notation and leave notation for replied-to messages and + similar notation alone. This means operations like narrowing to + subject sequence and widening don't lose notations. + +2002-10-31 Bill Wohler <wohler@newt.com> + + * mh-comp.el (mh-insert-mail-followup-to-list): Fixed typo in + docstring and other minor edits. Checkdoc removed trailing spaces. + (mh-insert-signature): Checkdoc flagged docstring. Reverted to + previous value. Added specific name of hook that is run. + (mh-regexp-in-field-p, mh-insert-letter): Checkdoc removed + trailing spaces. + +2002-10-31 Jeffrey C Honig <jch@honig.net> + + * mh-e.el (mh-show-mode-hook): Remove the unused + mh-show-mode-hook, mh-show-hook is the one that is used. + + * mh-utils.el (mh-show-mode): Change the documentation to refer to + mh-show-hook instead of the unused mh-show-mode-hook. + +2002-10-31 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-insert-mail-followup-to-list): Set default to nil + and include example in doc string. + +2002-10-31 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-indexer): Add customization choice for swish++. + (mh-indexer-choices): Add swish++ choice. + (mh-index-search): Change doc to reflect addition of swish++ option. + (mh-swish++-binary, mh-swish++-directory): New variables for + swish++ interface. + (mh-swish++-execute-search): New function to execute swish++ + search. + (mh-swish++-next-result): Function aliased to mh-swish-next-result + since the result format of swish++ is the same as that of swish-e. + (mh-index-search): Always overwrite window-configuration with new + value. This is needed since we don't kill the index-buffer when + quitting which means the window configuration wasn't getting set + properly. + (mh-index-search-again): If index buffer is reused, reset the old + window config to its original value. + +2002-10-30 Bill Wohler <wohler@newt.com> + + * Makefile (emacs, xemacs): New targets. + (all): Use these targets instead of calling specific targets. + (.PHONY): Added emacs, xemacs, autoloads, custom-loads. Broke up + target and moved pieces into their own sections. + + +2002-10-30 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-show-font-lock-keywords): Wrap an + 'eval-and-compile around its defvar, otherwise byte-compilation + fails on `mh-show-font-lock-keywords-with-cite'. + +2002-10-29 Jeffrey C Honig <jch@honig.net> + + * mh-comp.el (mh-letter-insert-signature-hook) + (mh-insert-signature): Add a hook to be called before inserting + the signature. Do not attempt to insert the signature if + mh-insert-signature-file-name is nil. + +2002-10-29 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-inc-folder): Call mh-widen when mh-narrowed-to-seq + (Closes SF #629233: inc in narrowed folder suboptimal) + + * mh-comp.el (mh-insert-letter): Stop using mhl to include a + message before it mangles the header, and supercite fails + (Closes SF #629153: mh-insert-letter uses mhl?). + (mh-insert-prefix-string): Leave point at beginning instead of + end, since that's what sc-cite-original does. + (mh-yank-cur-msg): Adjust for mh-insert-prefix-string change. + +2002-10-30 Steve Youngs <youngs@xemacs.org> + + * mh-e.el (mh-folder-mode): Check for 'font-lock-auto-fontify' + when in XEmacs so we don't do font-locking unconditionally. + + * mh-utils.el (mh-show-mode): Ditto. + +2002-10-29 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-folder-refiled-face, mh-folder-cur-msg-number-face) + (mh-folder-to-face, mh-folder-body-face): Define faces instead of + copying them from font-lock faces. This mh-e will look the same + in XEmacs as it does in Emacs. + * mh-utils.el (mh-show-cc-face, mh-show-date-face) + (mh-show-header-face): Ditto. + +2002-10-29 Jeffrey C Honig <jch@honig.net> + + * mh-comp.el (mh-send-letter): I meant to use + mh-goto-header-field, not mh-get-header-field. The former returns + nil if the header is not found and doesn't need a conditional. + +2002-10-29 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-forward): Bug fix. Change 'kill-line for a + 'delete-region, because I don't want that text yanked with C-y. + + * mh-seq.el (mh-put-msg-in-seq): Add support for selected + region (Closes SF feature request #630324). + +2002-10-28 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-prune-subject): Make the regexp a little + general so that a subject of the form "Re[218]: howdy" would be + properly pruned. + + * mh-mime.el (mh-mime-save-part): Copy function definition of + mm-save-part from cvs gnus since that function is buggy in gnus + that comes with emacs21.2. + +2002-10-28 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-scan-subject-regexp): Add an expression to match an + optional bracketed number after "Re", such as in "Re[2]:" + (Patch by Satyaki; I checked it and applied). + (mh-folder-font-lock-subject): Adapt to new mh-scan-subject-regexp. + * mh-seq.el (mh-subject-to-sequence): Ditto. + + * mh-e.el (mh-folder-sequence-menu): Remove "Toggle Subject + Thread" from menu. mh-toggle-threads is in the Folder menu. + + * mh-e.el (mh-folder-sequence-menu): Minor menu text edits. + + * mh-utils.el (mh-show-update-sequences): Added to + mh-defun-show-buffer builds; needed for menu. + (mh-show-sequence-menu, mh-show-message-menu) + (mh-show-folder-menu): 3 new menus in mh-show-mode-map that mirror + the menus used in mh-folder-mode. + (mh-show-mode): easy-menu-add the 3 menus. + +2002-10-28 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-goto-msg): Fix the regexp to search so that we + go to the right message. In a threaded folder message 2 may be + present after 26 and the previous regexp would go to 26 when we + really wanted to go to 2! + + * mh-seq.el (mh-widen): Add call to mh-recenter to make it like + mh-narrow-to-seq. + +2002-10-28 Bill Wohler <wohler@newt.com> + + * mh-utils.el (mh-show-mime-save-parts): Deleted definition. + (mh-show-mime-map, tool-bar-map): Use mh-mime-save-parts instead + of mh-show-mime-save-parts. + +2002-10-28 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-letter-tool-bar-map): tool-bar-add-item key name + bug fix. + * mh-utils.el (mh-show-tool-bar-map): Same. + * mh-e.el (mh-folder-tool-bar-map, mh-folder-seq-tool-bar-map): Same + +2002-10-27 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-toggle-threads): Add call to mh-recenter to make + its behavior like that of mh-narrow-to-seq. + +2002-10-27 Bill Wohler <wohler@newt.com> + + * mh-mime.el (mh-mime-save-parts): Renamed from + mh-store-mime-parts for consistency with mh-mime-save-part. Fixed + bug whereby mh-mime-save-parts-directory was not getting + initialized properly from a string-valued + mh-mime-save-parts-default-directory. + (mh-mime-save-parts-default-directory): Ditto. Check your + customizations! + (mh-mime-save-parts-directory): Ditto. + + * mh-utils.el (mh-show-mime-save-parts): Renamed from + mh-store-mime-parts. + (mh-show-mime-map): Added keybinding "K a" for + mh-show-mime-save-parts. + + * mh-e.el (mh-mime-save-parts) Renamed from mh-store-mime-parts. + (mh-mime-map): Added keybinding "K a" for mh-mime-save-parts. + (mh-help-messages): Added help for "K a". + +2002-10-27 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-search-addr-regexp, mh-regexp-in-field-p): Rename + the first to the second (and recode a bit). + (mh-insert-mail-followup-to): Use it. + +2002-10-27 Bill Wohler <wohler@newt.com> + + * mh-utils.el (mh-invisible-headers): Backed out change. Removed + Mail-Followup-To due to objections from Peter and Mark. + +2002-10-27 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-msg-is-in-seq): Modified to show info about + whether the message being queried about has been marked to be + deleted or refiled. + + * mh-mime.el (mh-insert-mime-security-button): Make + pressed-details a local. + +2002-10-27 Steve Youngs <youngs@xemacs.org> + + * .cvsignore: New file. + +2002-10-26 Steve Youngs <youngs@xemacs.org> + + * mh-seq.el (mh-notate-deleted-and-refiled): Don't bind local + variable 'dest', it isn't used anywhere. + + * mh-pick.el (mh-do-pick-search): Don't bind local variable + 'finding-messages', it isn't used anywhere. + + * mh-utils.el: Byte-compiler warning suppression. + (mh-gnus-article-highlight-citation): Rather than redefining + 'gnus-cite-face-list', just re-order it. + (mh-show-mode): Force turning on font-lock in XEmacs. + + * mh-seq.el: Byte-compiler warning suppression. + + * mh-index.el: Byte-compiler warning suppression. + + * mh-comp.el: Byte-compiler warning suppression. + + * mh-xemacs-compat.el: Add defaliases for 'timerp' & + 'cancel-timer' to the equivalent 'itimer' functions. + (rfc822): Require it for 'rfc822-goto-eoh'. + Byte-compiler warning suppression. + + * mh-e.el (mh-folder-mode): Force turning on font-lock in XEmacs. + (mh-toggle-threads): Remove duplicate autoload. + Byte-compiler warning suppression. + (mh-folder-unseen-seq-list): Use 'with-temp-buffer' to fix a bug + in XEmacs when font-lock is on. + (mh-folder-unseen-seq-name): Ditto. + +2002-10-27 Mark D. Baushke <mdb@gnu.org> + + * Makefile: Reorganize to allow for building also compiling for + XEmacs too. Sanitize so that it will work using least-common + denominator versions of 'make'. Tested using GNU make, Solaris make, + and Berkely make. + (all): Use recursive invokation based on the emacs or xemacs + executable passed on the 'make EMACS=xemacs' command line. + (XEMACS_OPTIONS): The incantation to be passed to an xemacs editor + to compile things properly. + (AUTO_PRELOADS): Magic XEmacs glue. + (clean): Ditto. + (autoloads): Ditto. + (custom-loads): Ditto. + +2002-10-26 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-last-msg): Add call to mh-recenter. + +2002-10-26 Peter S Galbraith <psg@debia.org> + + * mh-comp.el (mh-search-addr-regexp, mh-re-search-to-cc): Remove + `mh-re-search-to-cc' in favour of more generalized new function + `mh-search-addr-regexp'. + (mh-insert-mail-followup-to): Use it. + +2002-10-26 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-copy-seq-to-eob): Avoid rethreading when the + folder is already threaded. This is more efficient and also avoids + problems when the folder is widened. + (mh-thread-inc): Don't try to restore the point to original + location since mh-inc-folder from where this is called changes + point location after calling this function. + + * mh-e.el (mh-make-folder-mode-line): Fix a small bug where the + test was wrong. + +2002-10-26 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-insert-mail-followup-to): Fix for new defcustom. + +2002-10-26 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-notate-deleted-and-refiled): Remove unused binding + of dest. The problem was pointed out by Steve as well. + + * mh-e.el (mh-toggle-threads): Remove duplicate autoload as + pointed out by Steve. + +2002-10-26 Bill Wohler <wohler@newt.com> + + * mh-utils.el (mh-invisible-headers): Added Mail-Followup-To. + +2002-10-26 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-insert-mail-followup-to-list): Change defvar to + defcustom. + +2002-10-25 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-remove-all-notation): New function that removes all + notation. + + * mh-seq.el (mh-narrow-to-seq): When hiding the original folder + remove all notation. This avoids stale notation hanging around. + Also changes in show buffer and position in folder buffer are + avoided if possible. + (mh-widen): When widening the scan-lines are notated based on the + current state of the folder. This means any changes made when the + folder was narrowed are shown consistently. + (mh-notate-deleted-and-refiled): Update the documentation. + (mh-thread-parse-scan-line): For some reason the ASCII value of + the space character was being used here. This is fixed. + (mh-thread-inc, mh-toggle-threads): Avoid change of point in + folder and message being displayed in shown buffer. + + * mh-utils.el (mh-recenter): Rewrite mh-recenter to show fewer + blank lines when point is towards the end of the folder buffer. + +2002-10-25 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-insert-mail-followup-to-flag): New boolean + defcustom to append a Mail-Followup-To field to the header. The + insertion is done if the To: or Cc: fields matches an entry in + `mh-insert-mail-followup-to-list'." + (mh-insert-mail-followup-to-list): New defvar. List of addresses + for which a Mail-Followup-To field is inserted. + (mh-re-search-to-cc): New function. Search for REGEXP in To: and + Cc: fields. + (mh-insert-mail-followup-to): New function. Insert + Mail-Followup-To: if To or Cc match `mh-insert-mail-followup-to-list'. + (mh-compose-and-send-mail): Call mh-insert-mail-followup-to if + mh-insert-mail-followup-to-flag is true. + +2002-10-25 Mark D. Baushke <mdb@gnu.org> + + * mh-utils.el (mh-show-maximum-size): New variable to control + the display of large messages. + (mh-display-msg): Use it (Closes SF #488696). + + * mh-seq.el (mh-toggle-threads): Checkdoc fix. + + * mh-e.el (mh-reset-threads-and-narrowing): Checkdoc fix. + + * mh-comp.el (mh-insert-x-mailer-flag): Renamed from + mh-insert-x-mailer-p. Update docstring. + (mh-send-letter): Use it. + (mh-reply-show-message-flag): Renamed from + mh-reply-show-message-p. Update docstring. + (mh-reply): Use it. + This addresses part of SF #627015. + + * mh-e.el (mh-recenter-summary-flag): Renamed from + mh-recenter-summary-p. Update docstring. + (mh-set-scan-mode): Use it. + This addresses part of SF #627015. + +2002-10-25 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-reset-threads-and-narrowing): New function which + resets all thread and narrowing state to completely unthreaded and + widened state. As a side effect, the folder buffer is erased. + (mh-rescan-folder): Reset threads and narrowing state. + + * mh-funcs.el (mh-pack-folder-1): Reset threads and narrowing state. + + * mh-seq.el (mh-copy-seq-to-eob): Change mh-view-ops after + threading is over so that if user aborts threading, it doesn't + leave mh-e in an inconsistent state. + (mh-toggle-threads): Use mh-scan-folder to populate the folder + buffer instead of mh-rescan-folder which resets threading and + narrowing state. + +2002-10-24 Bill Wohler <wohler@newt.com> + + * mh-e is completely checkdoc clean now. + + * mh-utils.el (mh-clean-message-header-flag): Renamed from + mh-clean-message-header. + (mh-bury-show-buffer-flag): Renamed from mh-bury-show-buffer. + (mh-show-use-goto-addr-flag): Renamed from mh-show-use-goto-addr. + This addresses part of SF #627015. + + * mh-mime.el (mh-clean-message-header-flag): Renamed from + mh-clean-message-header. + Checkdoc fixes. This addresses part of SF #627015. + + * mh-index.el (mh-clean-message-header-flag): Renamed from + mh-clean-message-header. This addresses part of SF #627015. + + * mh-funcs.el (mh-do-not-confirm-flag): Renamed from + mh-do-not-confirm. This addresses part of SF #627015. + + * mh-e.el (mh-do-not-confirm-flag): Renamed from + mh-do-not-confirm. + (mh-clean-message-header-flag): Renamed from + mh-clean-message-header. + This addresses part of SF #627015. + + * mh-comp.el: checkdoc fixes. + +2002-10-24 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-copy-seq-to-eob): Rewritten to scan the headers + fresh instead of yanking from buffer. This is needed to get + correct threading in copied sequence. + (mh-thread-inc, mh-thread-update-scan-line-map) + (mh-thread-parse-scan-line): Eliminate the use, and hence the + definition of, the kludgy mh-thread-update-scan-line-map. Instead + the functions mh-notate-deleted-and-refiled and + mh-notate-user-sequences are used to get the message marks right. + (mh-thread-generate-scan-lines): Updated to allow the thread tree + to be used in a narrowed folder buffer. + (mh-thread-folder, mh-toggle-threads): Remove + mh-folder-threaded-view-flag. + (mh-thread-old-scan-line-map): New buffer-local variable that + remembers the original scan-line map so that the sequence thread, + narrow, widen will work. + (mh-narrow-to-seq, mh-widen): Remember the scan-line map when + narrowing and restore it when widening. + + * mh-e.el (mh-folder-threaded-view-flag, mh-folder-folder-menu) + (mh-regenerate-headers, mh-get-new-mail) + (mh-make-folder-mode-line, mh-process-commands) + (mh-delete-scan-msgs): Remove mh-folder-threaded-view-flag. + Instead (memq 'unthread mh-view-ops) is used to test if the folder + is threaded. + + * mh-mime.el (mh-display-emphasis): Shadow article-goto-body here + since we want to do emphasis on the whole of the region and not + just after the first blank line. + (mh-mm-display-part): When displaying a text part show smilies and + emphasis. + + * mh-index.el (mh-index-insert-scan): Attempt to keep number of + args to scan small if there are lots of adjacent matches. + (mh-index-quit): Bury index-buffer on quit instead of killing it. + This behavior is more like that of mh-quit. + + * mh-seq.el (mh-widen): If folder was threaded after narrowing + then make mh-widen undo the threading instead of erroring out. + +2002-10-24 Peter S Galbraith <psg@debian.org> + + * mh-seq.el (mh-toggle-threads): Add a cond (as suggested by + Satyaki) to properly unthread a narrowed-to-sequence. + + * mh-seq.el (mh-thread-generate-scan-lines): Fix threading + breakage from partial switch to mh-container-real-child-flag and + to dupl-flag. + + * mh-comp.el (mh-yank-cur-msg): Bug fix: specify + (eq t mh-yank-from-start-of-msg) when that's what we want. + +2002-10-24 Mark D. Baushke <mdb@gnu.org> + + * mh-seq.el (mh-thread-prune-subject): Renamed subject-pruned-p as + subject-pruned-flag. + (mh-thread-inc): Renamed old-buffer-modified-p as + old-buffer-modified-flag. + (mh-thread-generate-scan-lines): Renamed dupl-p as dupl-flag. + This addresses part of SF #627015. + + * mh-index.el (mh-index-advance): Renamed backward-p + local variable as backward-flag. + (mh-index-next-button): Renamed backward-p + argument as backward-flag. + (mh-index-show): Renamed display-headers-p argument as + display-headers-flag. + This addresses part of SF #627015. + + * mh-e.el (mh-scan-format, mh-version): Use mh-nmh-flag. + (mh-folder-mime-action): Renamed include-security-p + argument as include-security-flag. + (mh-goto-next-button, mh-next-button): Renamed backward-p + argument as backward-flag. + (mh-get-new-mail): Renamed new-mail-p local variable as + new-mail-flag. + (mh-goto-cur-msg): Renamed minimal-changes-p argument as + minimal-changes-flag. + (redraw-needed-flag): Renamed redraw-needed-p local variable as + redraw-needed-flag. + (mh-seq-containing-msg): Renamed include-internal-p argument as + include-internal-flag. + (mh-page-msg): Use mh-page-to-next-msg-flag. + This addresses part of SF #627015. + + * mh-mime.el (mh-mhn-compose-insert-flag): Renamed from + mh-mhn-compose-insert-p. Make it buffer-local. + (mh-mhn-compose-type, mh-mhn-compose-external-type, + mh-mhn-compose-forw, mh-edit-mhn): Use mh-mhn-compose-insert-flag. + (mh-mml-to-mime, mh-mml-secure-message-encrypt-pgpmime, + mh-mime-display-part, mh-mime-display-single): Use + mh-gnus-pgp-support-flag renamed from mh-gnus-pgp-support-p. + (mh-mime-display-single): Renamed small-image-p local + variable as small-image-flag. + (mh-mime-inline-part): Renamed local variable inserted-p as + inserted-flag. + (mh-mime-inline-part): Renamed local variable displayed-p as + displayed-flag. + This addresses part of SF #627015. + + * mh-comp.el (mh-letter-menu, mh-letter-mode, mh-send-letter): + mh-mhn-compose-insert-flag. + (mh-repl-group-formfile, mh-forward): Use mh-nmh-flag + renamed from mh-nmh-p. + (mh-reply, mh-insert-x-mailer, mh-send-letter): Use mh-nmh-flag. + (mh-letter-mode-map): Use mh-gnus-pgp-support-flag renamed from + mh-gnus-pgp-support-p. + (mh-mml-secure-message-sign-pgpmime): Use + mh-gnus-pgp-support-flag. + This addresses part of SF #627015. + + * mh-utils.el (mh-page-to-next-msg-flag): Renamed from + mh-page-to-next-msg-p. + (mh-show-msg): Use mh-page-to-next-msg-flag. + (mh-gnus-pgp-support-flag): Renamed from + mh-gnus-pgp-support-p. + (mh-show-font-lock-fontify-region): Fix docstring per checkdoc. + (with-mh-folder-updating): Renamed argument + save-modification-flag-p as mh-save-modification-flag. + (mh-prompt-for-folder): Renamed new-file-p local + variable as new-file-flag. + This addresses part of SF #627015. + +2002-10-24 Mark D Baushke <mdb@gnu.org> + + * mh-comp.el (mh-forward): Fix mh-mml-compose-insert-p reference + in last commit to be mh-mml-compose-insert-flag. + (mh-mml-compose-insert-flag): Move defvar to fix compiler warning. + +2002-10-24 Jeffrey C Honig <jch@honig.net> + + * mh-comp.el (mh-forward): Add support for transient-mark mode. + When using nmh, always specify -mime so as to preserve the + original message(s). If mh-compose-insertion is 'gnus, convert + the mhbuild format forwarding directives into MML. + +2002-10-24 Eric Ding <ericding@alum.mit.edu> + + * mh-comp.el (mh-send-letter): Fix for earlier change that added + "-mime" for bcc'ed MIME mail; still doesn't work with nmh 1.0, but + at least no longer triggered for every outgoing message! + +2002-10-24 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-yank-cur-msg): Fix selected regions for supercite + (see text below). + + * mh-comp.el (mh-yank-cur-msg): Fix for supercite. Someone played + with the point and mark setting prior to the call to + 'mh-insert-prefix-string and that broke supercite. I put comments + to make it obvious to future coders why those settings exists. + Note that supercite is still broken when a region is selected in + the show buffer. Presumably it's been like that for a long time. + We need to insert the header as well as the selected region oin + that case. I'll submit an SF bug. + +2002-10-24 Jeffrey C Honig <jch@honig.net> + + * mh-comp.el (mh-yank-from-start-of-msg, mh-reply): Use -noformat + flag to reply when 'autosupercite or 'autoattrib are specified to + prevent duplicate cites of the body of a message. + +2002-10-23 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (font-lock-default-fontify-region): Add autoload to + avoid compiler warning. + +2002-10-23 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-letter-mode): set fill-paragraph-function to our + own 'mh-fill-paragraph-function instead of simply + 'mail-mode-fill-paragraph (because it doesn't handle a non-nil + fill-prefix correctly). + (mh-fill-paragraph-function): New function for mh-letter-mode + fill-paragraph-function in order to handle non-nil fill-prefix. + Call sendmail's mail-mode-fill-paragraph if in the mail header, + else call default fill-paragraph with fill-prefix set to nil. + (Closes SF #489927) + + * mh-comp.el (mh-letter-mode): Let's use font-lock even if gnus is + used in show-mode. The reason is that gnus uses static text + properties which are not appropriate for a buffer that will be + edited. So the choice here is either fontify the citations and + header or the header only. + + * mh-utils.el (mh-show-font-lock-fontify-region): Limit font-lock + in mh-show-mode to the header. Used when mh-highlight-citation-p + is set to gnus, leaving the body to be dealt with by gnus + highlighting. This fixes gnus text emphasis in mh-show-mode. + (mh-show-mode): In font-lock-defaults, set + font-lock-fontify-region-function to mh-show-font-lock-fontify-region. + +2002-10-23 Bill Wohler <wohler@newt.com> + + * mh-mime.el (mh-mml-attach-file): Prompt for disposition should + be Disposition, not Content-Type. The Content-Type has been + determined automatically. + +2002-10-23 Mark D. Baushke <mdb@gnu.org> + + * MH-E-NEWS: + s/mh-adaptive-cmd-note/mh-adaptive-cmd-note-flag/ + s/mh-show-use-xface/mh-show-use-xface-flag/ + s/mh-tool-bar-reply-3-buttons/mh-tool-bar-reply-3-buttons-flag/ + This addresses part of SF #627015. + + * mh-comp.el: + s/mh-mml-compose-insert-p/mh-mml-compose-insert-flag/ + s/mh-xemacs-p/mh-xemacs-flag/ + (mh-letter-menu): Use mh-mml-compose-insert-flag. + (mh-insert-x-mailer): Use mh-xemacs-flag. + (mh-mml-compose-insert-flag): Renamed from + mh-mml-compose-insert-p. + (mh-send-letter): Use mh-mml-compose-insert-flag. + This addresses part of SF #627015. + + * mh-e.el: + s/mh-folder-threaded-view-p/mh-folder-threaded-view-flag/ + s/mh-adaptive-cmd-note/mh-adaptive-cmd-note-flag/ + s/mh-xemacs-p/mh-xemacs-flag/ + (mh-folder-threaded-view-flag): Renamed from + mh-folder-threaded-view-p. Make it buffer local. + (mh-folder-tool-bar-map): Use mh-tool-bar-reply-3-buttons-flag. + (mh-remove-xemacs-horizontal-scrollbar): Use mh-xemacs-flag. + (mh-make-folder, mh-regenerate-headers, mh-get-new-mail): Use + mh-adaptive-cmd-note-flag. + (mh-folder-folder-menu, mh-regenerate-headers, mh-get-new-mail, + mh-make-folder-mode-line, mh-process-commands, + mh-delete-scan-msgs): Use mh-folder-threaded-view-flag. + This addresses part of SF #627015. + + * mh-index.el: + s/mh-adaptive-cmd-note/mh-adaptive-cmd-note-flag/ + (mh-index-search): Use mh-adaptive-cmd-note-flag. + This addresses part of SF #627015. + + * mh-mime.el: + s/mh-mml-compose-insert-p/mh-mml-compose-insert-flag/ + s/mh-xemacs-p/mh-xemacs-flag/ + (mh-mml-compose-insert-flag): Renamed from + mh-mml-compose-insert-p. Make it buffer local. + (mh-mml-attach-file, mh-mml-secure-message-sign-pgpmime, + mh-mml-secure-message-encrypt-pgpmime): Use it. + (gnus-local-map-property): Use mh-xemacs-flag. + This addresses part of SF #627015. + + * mh-seq.el: + s/mh-folder-threaded-view-p/mh-folder-threaded-view-flag/ + (mh-thread-generate, mh-thread-folder, mh-toggle-threads): Use + mh-folder-threaded-view-flag. + This addresses part of SF #627015. + + * mh-speed.el: + s/mh-speed-run-flists-p/mh-speed-run-flists-flag/ + s/mh-speed-refresh-p/mh-speed-refresh-flag/ + (mh-speed-run-flists-flag): Renamed from mh-speed-run-flists-p. + (mh-folder-speedbar-buttons): Use it. + (mh-speed-refresh-flag): Renamed from mh-speed-refresh-p. + (mh-speed-update-current-folder, mh-speed-invalidate-map, + mh-speed-add-folder): Use it. + This addresses part of SF #627015. + + * mh-utils.el: + s/mh-xemacs-p/mh-xemacs-flag/ + s/mh-tool-bar-reply-3-buttons/mh-tool-bar-reply-3-buttons-flag/ + s/mh-show-use-xface/mh-show-use-xface-flag/ + (mh-xemacs-flag): Renamed from mh-xemacs-p. + (mh-show-xface-function): Use it. + (mh-tool-bar-reply-3-buttons-flag): Renamed from + mh-tool-bar-reply-3-buttons. + (mh-show-tool-bar-map): Use it. + (mh-adaptive-cmd-note-flag): Renamed from mh-adaptive-cmd-note. + (mh-cmd-note): Use it in description. + (mh-show-use-xface-flag): Renamed from mh-show-use-xface. Use + mh-xemacs-flag. + (mh-show-xface): Use mh-show-use-xface-flag. + This addresses part of SF #627015. + +2002-10-23 Bill Wohler <wohler@newt.com> + + * Makefile (all): Rather than have to run "make clean all" all the + time, make the default target do a clean so all you have to say is + "make". + + * mh-e.el (mh-folder-map): Moved "t (mh-toggle-threads)" to T + prefix. + +2002-10-22 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-indexer-choices, mh-swish-binary): The + executable swish-e can be used to search (just like swish-search). + However the Makefile in swish-e-2.2.2 doesn't install + swish-search. So it is preferable to use swish-e. + +2002-10-22 Bill Wohler <wohler@newt.com> + + * mh-comp.el (mh-letter-mode-map): Added aliases for keybindings. + For example, you now have "C-c C-m C-i" in addition to "C-c C-m + i". + +2002-10-22 Mark D. Baushke <mdb@gnu.org> + + * mh-mime.el (mh-graphical-smileys-flag): Renamed from + mh-graphical-smileys-p. + (mh-display-smileys): Use it. + (mh-graphical-emphasis-flag): Renamed from + mh-graphical-emphasis-p. + (mh-display-emphasis): Use it. This addresses part of SF #627015. + +2002-10-22 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-mime.el (mh-insert-mime-security-button): A message is + produced if PGP decryption/verification fails. This addresses + SF# 627025. + +2002-10-21 Bill Wohler <wohler@newt.com> + + * mh-seq.el (mh-widen): Checkdoc removed the period in the error. + The info node (elisp) Coding Conventions says: "An error message + should start with a capital letter but should not end with a + period." + + * mh-e.el, mh-utils.el (mh-tool-bar-reply-3-buttons): Moved + defcustom to mh-utils because I got an error about a nil value for + mh-tool-bar-reply-3-buttons when I fired up mh-rmail. + + * mh-comp.el, mh-funcs,el, mh-mime.el, mh-pick.el: Moved (provide) + to the end of the file to be consistent with most other files (see + additional rationale in mh-e.el description below). + + * mh-e.el: Had to remove eval-when-compile from the (require 'cl) + here too (because the remove-if generated a warning in CVS Emacs). + Moved (provide) to the end of the file to be consistent with most + other files. My guess is that this is good to keep a feature from + being "provided" if the file craps out while being loaded. + +2002-10-21 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-reply, Info-goto-node): Add autoloads to avoid + compiler warnings. + (mh-tool-bar-reply-3-buttons): Add defvar to avoid compiler + warning. + + * mh-seq.el (mh-narrow-to-seq): Remember that a narrowing has + occurred. + (mh-valid-view-change-operation-p): New function that checks if + the widening or unthreading that we are about to perform is + allowed. + (mh-widen): Check if widening is applicable. + (mh-thread-inc, mh-thread-folder): Use delete-region instead of + erase-buffer. This means if the buffer is narrowed then the hidden + parts aren't removed. This allows widening of the folder later on. + (mh-toggle-threads): Maintain mh-view-ops. + + * mh-e.el (mh-view-ops, mh-folder-mode): New buffer-local variable + that keeps track of the sequence in which threading and narrowing + of the folder buffer has been carried out. This is needed so that + narrowing followed by threading (or vice versa) behaves in a + reasonable manner. + (mh-regenerate-headers): Use delete-region instead of + erase-buffer. + (mh-make-folder-mode-line): Change mh-first-msg-num and + mh-last-msg-num conservatively. This might show a larger range in + the mode-line but allows the unthreading to not miss messages + present initially. + +2002-10-21 Bill Wohler <wohler@newt.com> + + * mh-mime.el (mh-graphical-emphasis-p): Added _underline_ to the + docstring, as well as the source of the strings, + gnus-emphasis-alist. + (mh-graphical-emphasis-p, mh-graphical-smileys-p): Set the default + to t. + +2002-10-21 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-show-mode): Invoke new toolbar. + (mh-show-tool-bar-map): New tool-bar for mh-show-mode, similar to + mh-letter-mode. + +2002-10-21 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-display-msg): Call the smiley display function + after the call to mh-show-mode. This is needed since mh-show-mode + kills all buffer-local variables and resets the variable that + controls display of graphical smileys. + +2002-10-21 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-folder-mime-action): Change mime to MIME in message. + + * mh-comp.el (mh-mml-to-mime autoload): Ditto. + +2002-10-21 Mark D Baushke <mdb@gnu.org> + + * mh-mime.el (smiley-region): Use load for a non-fatal dependency + on the smiley library. + +2002-10-21 Jeffrey C Honig <jch@honig.net> + + * mh-comp.el (mh-forward): Search for a blank line as well as + mail-header-separator. + (mh-letter-mode): Search for a blank line as well as + mail-header-separator. + (mh-send-letter): The default BCC encapsulation will make a MIME + message unreadable. If we are running nmh and the letter contains + a Bcc: and a Content-Type: field, add the -mime switch to to the + arguments to send. + +2002-10-21 Peter S Galbraith <psg@debian.org> + + * mh-utils.el: Add a mh-defun-show-buffer call to define + mh-show-pack-folder. + +2002-10-21 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-store-mime-parts): Simplify code a bit. + + * mh-e.el (mh-help-messages): Update help message for changed + keybindings. + +2002-10-21 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-speed.el (mh-speed-invalidate-map): Invalidate + mh-speed-folders-cache before it is used by mh-speed-folders. Also + fix indentation of if statement. + (mh-speed-folder-size): The folder name should be extracted from + the speedbar buffer and not from the temp buffer has was happening + before. + (mh-speed-folder-size): Harden the function some more. It + shouldn't produce errors any more unless flist really didn't work. + +2002-10-21 Bill Wohler <wohler@newt.com> + + * mh-seq.el (mh-put-msg-in-seq): Formatting only. The reason I was + in there is because I was trying to use mh-put-msg-in-seq and + mh-msg-is-in-seq non-interactively and found that although the + docstring says it uses the current message by default, I got + errors if I passed in nil for the message. Is this expected, or is + this a bug? I suppose the fix would be to make the arguments + optional, right? This would cause the arguments in + mh-put-msg-in-seq to be reversed, however. Might be a backwards + compatibility problem. + + * mh-speed.el (mh-speed-view): Convert default size to string + before passing it to read-string. This was done because XEmacs + can't handle a numeric value for the default. + +2002-10-20 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-show-mode-map, mh-show-folder-map) + (mh-show-sequence-map, mh-show-thread-map, mh-show-extract-map) + (mh-show-digest-map, mh-show-mime-map): Interactive functions + callable in show buffer are now prefixed with mh-show. + + * mh-seq.el (mh-notate-deleted-and-refiled): Take into account the + changes to mh-refile-list and the removal of the 'deleted + sequence. + (mh-toggle-threads): Changing from threaded to normal view doesn't + try to push out message refiles and deletions to MH. + + * mh-e.el (mh-rescan-folder, mh-scan-folder): Add a new optional + argument to both functions that prevents them from carrying out + pending refiles and deletes. + (mh-undo): Remove dead code. + (mh-delete-a-msg, mh-undo-msg): Get rid of the 'deleted sequence. + The same information is present in mh-delete-list any way. + (mh-refile-a-msg, mh-undo-msg, mh-process-commands): Change the + semantics of mh-refile-list to make it self-contained. This + variable now contains a list of lists. The first element of each + sublist is the destination folder name. The remaining elements are + the messages that are to be refiled to the destination folder. + (mh-toggle-threads, mh-folder-folder-menu): Use mh-toggle-threads + instead of mh-thread-folder. + +2002-10-20 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-store-mime-parts): Bug fix? Make this command + work when in the show buffer, and not just in the folder buffer + pointing to a message. + +2002-10-20 Peter S Galbraith <psg@debian.org> + + * mh-seq.el (mh-narrow-to-subject-sequence): Renamed from + mh-narrow-to-subject-thread. + (mh-subject-to-sequence): Renamed from mh-subject-thread-to-sequence. + (mh-delete-subject-sequence): Renamed from mh-delete-subject-thread. + (mh-next-unseen-subject-sequence): Renamed from + mh-next-unseen-subject-thread. + (mh-toggle-subject-thread): Removed. :-( + + * mh-e.el: s/subject-thread/subject-sequence/ + (mh-thread-map): Bind mh-widen to "w". + + * mh-utils.el: s/subject-thread/subject-sequence/ + (mh-show-thread-map): Bind mh-widen to "w". + +2002-10-20 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-folder): This function is no longer + interactive. The mh-toggle-threads is the interactive function + that gets called by the user. Also the already computed values in + mh-first-msg-num and mh-last-msg-num are used instead of + recomputing the first and last message indices in the current + folder. + (mh-toggle-threads): New interactive function that toggles + threaded view of the folder. + + * mh-utils.el (mh-letter-toggle-threads): New interactive function + which toggles thread view from show buffer. This function replaces + mh-letter-thread-folder. + (mh-show-folder-map): Use mh-letter-toggle-threads instead of + mh-letter-thread-folder. + + * mh-e.el (mh-folder-map): Use mh-toggle-threads instead of + mh-thread-folder. + +2002-10-20 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-scan-folder): Formatting only. + (mh-goto-cur-msg): Removed call to mh-last-msg in those cases + where there isn't a current message. Since I've started using the + speedbar to read my mh-e mail, I've had to use M-< every time to + go to the beginning of the new messages. Very annoying! Thus, if + there isn't a current message, the cursor is left alone, which + sounds like the right thing to do anyway. + +2002-10-19 Peter S Galbraith <psg@debian.org> + + * mh-seq.el (mh-subject-thread-to-sequence): Bug fix. After + making the 'subject sequence real, I now have to delete it globally. + + * mh-seq.el (mh-toggle-subject-thread): Make toggle back to full + scan exactly mh-widen (removed moving to current message). + + * mh-seq.el (mh-subject-thread-to-sequence): Make 'subject + sequence a real one, exported to MH. This means you can, for + example, mh-forward it. But it also shows up with a mark in the + scan output. (Closes SF #489445). + +2002-10-19 Bill Wohler <wohler@newt.com> + + * mh-speed.el (mh-speed-view): If there weren't any unseen + messages, and you specified a string (a sequence like "last") when + prompted for the number of messages to display, you got an error. + This has been fixed. + +2002-10-19 Mark D Baushke <mdb@gnu.org> + + * mh-e.el (mh-last-destination-folder): Destination of last refile + command. + (mh-last-destination-write): Destination of last write command. + (mh-refile-msg): Use 'mh-last-destination-folder and update both it + and 'mh-last-destination. + (mh-write-msg-to-file): Use 'mh-last-destination-write and update + both it and 'mh-last-destination (Closes SF #580772). + +2002-10-19 Bill Wohler <wohler@newt.com> + + * mh-comp.el (mh-yank-from-start-of-msg): Changed default to + 'attribution. + (mh-letter-mode-map): Removed commented-out keybindings as well as + alias "C-c C-m a (mh-compose-insertion)." Prefer "C-c C-m i." + + * mh-utils.el: Removed autoload of help. It no longer appears to + be necessary in cvs Emacs (21.4). + +2002-10-18 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-execute-commands): Doc fix. + (mh-compat-write-file-hook): Renamed to + mh-write-file-functions-compat. + (mh-folder-mode): Add mh-write-file-functions-compat instead of + mh-compat-write-file-hook + +2002-10-18 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-invisible-headers-show-xface): Killed this + variable. + (mh-invisible-headers): Use 'mh-show-use-xface instead of + 'mh-invisible-headers-show-xface to determine whether to render + the X-Face header line visible or not. + +2002-10-18 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-compat-write-file-hook, mh-folder-mode): Use the new + macro mh-compat-write-file-hook to use write-file-functions for + Emacs 21.4 and local-write-file-hooks for older versions. + +2002-10-18 Mark D Baushke <mdb@gnu.org> + + * mh-utils.el (mh-invisible-headers): Add more anti-spam headers. + +2002-10-18 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-mml-forward-message): mml-attach-file constructs + a malformed composition if the description string is empty, so + test for that and call mml-attach-file without that argument if + it's an empty string (closes SF #625168). + +2002-10-17 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-keymap): Removed extra binding of " ". + (mh-index-folder-mode-help-messages): Made the cheat sheet entry + of quit like the others. + (mh-index-search): If space was pressed in the index buffer before + a search result has been shown with ".", the old show buffer would + be scrolled. This is confusing since the index and show buffer + contents are contradictory. Killing the show buffer here avoids + this problem. + (mh-index-configure-windows): Refine the window configuration + logic. Avoid the two window view unless there is a message being + displayed in the show buffer. + (mh-index-scroll-up): Rewrite this function. The old version had a + bizarre problem where the show buffer wouldn't be scrolled if the + speedbar was present. + (mh-index-scroll-down): Rewritten because of similar reason as + above. + +2002-10-17 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-reply): Add an undo boundary in the undo list + before calling 'mh-yank-cur-msg (closes SF #623693). + +2002-10-17 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-folder-mode): Use local-write-file-hooks instead of + write-file-hooks. This is required for XEmacs and also the right + thing according to GNU Emacs21 documentation. + +2002-10-16 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-generate): Get threading to work correctly + on partial folders. The fix here disregards messages that aren't + already present in the buffer. + (mh-thread-folder): When querying scan about thread info try to + avoid asking about messages that aren't present in the folder + buffer. A more efficient fix would be to ask scan about just the + messages that are present instead of a range of messages. However + that runs the risk of sending long command lines to scan. Another + change was to populate the mh-scan-line-map early so that the + change in mh-thread-generate would work. + (mh-thread-generate-scan-lines): In case duplicates are present + make one of them the pseudo parent of the rest. This makes it look + prettier if there are multiple duplicates at top level. + + * mh-comp.el (mh-edit-again): If a buffer in show-mode is being + reused then reinsert message file. This should fix SF #624283. + + * mh-mime.el (mh-mm-display-part): Make sure mh-display-part is + always called when we want to remove the displayed MIME part. + +2002-10-16 Bill Wohler <wohler@newt.com> + + * mh-speed.el (mh-speed-folder-size): checkdoc fix. + (mh-speed-view): Tweaked output to mirror gnus verbiage. Offer + to view number of messages in folder rather than mh-large-folder. + Replaced (intern mh-unseen-seq) with mh-unseen-seq since the + former was generating errors. + +2002-10-15 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-speed.el (mh-large-folder): New customizable variable to + control mh-e's perception of large folders. + (mh-speed-folder-size): New function which computes the size of + folder on current line. + (mh-speed-view): Modified to handle large folders. If the folder + being clicked has unseen messages then only those messages are + shown. Otherwise if number of messages in folder is larger than + mh-large-folders then the user is asked for the number of messages + to be shown. If the folder satisfies neither of the above cases + then it is displayed in its entirety + +2002-10-15 Bill Wohler <wohler@newt.com> + + * mh-index.el (mh-index-keymap): Use gnus-define-keys. Sorted. + Noticed that there were two key bindings for SPACE... + + * mh-speed.el (mh-folder-speedbar-key-map): Ditto (except for the + dup SPACE binding). + + Completed help in other modes: + + * mh-utils.el (mh-xemacs-p): Fixed doc. + (mh-show-mode-map, mh-show-folder-map, mh-show-sequence-map) + (mh-show-thread-map, mh-show-extract-map): Added binding for + mh-help. + + * mh-pick.el (mh-search-folder): Added startup help message. + (mh-pick-mode-help-messages): New variable that contains help + messages for pick buffer. + (mh-pick-mode): Set local buffer variable mh-help-messages to + mh-pick-mode-help-messages. + + * mh-index.el (mh-index-keymap): Added binding for mh-help + (mh-index-folder-mode-help-messages): New variable that contains + help messages for MH Index buffer. + (mh-index-folder-mode): Set local buffer variable mh-help-messages + to mh-index-mode-help-messages. + + * mh-funcs.el (mh-help, mh-prefix-help): Call + substitute-command-keys on the help messages. + + * mh-e.el (mh-help-messages): Added ,. Ran C-M-q. + (mh-help): This autoload doc is now used for more than just the + MH-Folder, so drop that specific text. + + * mh-comp.el (mh-edit-again, mh-extract-rejected-mail) + (mh-forward, mh-reply, mh-send-sub): Call mh-letter-mode-message + to display a help message at startup. + (mh-letter-mode): Set local buffer variable mh-help-messages to + mh-letter-mode-help-messages. + (mh-letter-mode-help-messages): New variable with help messages + for the MH-Letter buffer. + (mh-letter-mode-message): New function that displays a startup + help message. + (mh-letter-mode-map): Added binding for mh-help. Sorted. + +2002-10-15 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-speed.el (mh-speedbar-selected-folder-with-unseen-messages-face) + (mh-speedbar-folder-face, mh-speedbar-selected-folder-face) + (mh-speedbar-folder-with-unseen-messages-face): New faces for mh-e + speedbar. + (mh-folder-speedbar-buttons, mh-speed-update-current-folder) + (mh-speed-add-buttons): Use the new faces. + (mh-speed-normal-face, mh-speed-bold-face): Functions to convert + to bold face and back to normal face. + (mh-speed-set-face): Removed. + (mh-speed-highlight): Modified to allow it to be used instead of + mh-speed-set-face. Also changes were made to fontify folders with + unread messages. + (mh-speed-parse-flists-output, mh-speed-parse-flists-output) + (mh-speed-invalidate-map): Use mh-speed-highlight instead of + mh-speed-set-face. + +2002-10-15 Bill Wohler <wohler@newt.com> + + * mh-mime.el, mh-seq.el, mh-speed.el, mh-utils.el: It appears that + the cl package has been restructured in 21.4 in such a way that + the use of eval-when-compile no longer suppresses warnings when + compiling so that (require 'cl) must be called directly (maybe + this is a bug in 21.4 ;-). Thus the autoloads of cl are no longer + needed. Now compiles clean under 21.4. + + * mh-e.el (mh-folder-mode): The use of local-write-file-hooks is + deprecated in Emacs 21.4, so use add-hook write-file-functions (or + write-file-hook for older versions) with the LOCAL argument + instead. Now compiles clean under 21.4. + + * mh-comp.el (mh-yank-cur-msg): Push a mark at the opposite end of + the included text to make it easy to jump or delete to the other + end of the included text. + +2002-10-15 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-comp.el (mh-insert-prefix-string): Remove the erroneous use + of set-mark and other related functions. + +2002-10-14 Bill Wohler <wohler@newt.com> + + * mh-comp.el (mh-yank-from-start-of-msg): Fixed documentation. It + isn't ignored if there is a region. It is still used for the + attribution. + (mh-yank-cur-msg): Removed unnecessary push-mark when snarfing the + entire message. Move the cursor to the end of the snarfed message + if there is a region. In this case, push a mark so user can pop to + the beginning of the snarfed fragment. + (mh-insert-prefix-string): This calls set-mark which I find + suspect since I found that my last user mark was deleted after + yanking a message. Added a comment to this effect. Will probably + add a bug report... + + * README (Installed, Supported versions): To appear in GNU Emacs + 21.3; supported on Emacs 21, 20.7 and XEmacs 21. + + * mh-funcs.el (mh-concat-list): Deleted. Use mapconcat instead. + (mh-help, mh-prefix-help): Use mapconcat instead of mh-concat-list. + (mh-ephem-message): Use "%s" in message. + + * mh-funcs.el (mh-concat-list): New function to concatenate a list + of strings into a single string. I would have thought elisp + already contained a function like this, but I couldn't find it. + (mh-ephem-message): New function to display a message in the + minibuffer ephemerally. minibuffer-message seemed like the right + function, but it writes to the current buffer oddly enough. + (mh-help, mh-prefix-help): New functions to display command + cheat sheets in the minibuffer (closes SF #493740). It would be + nice to refactor these two into a single function if possible. + + * mh-e.el (mh-folder-mode-map, mh-folder-map, mh-sequence-map) + (mh-thread-map, mh-extract-map): Added ? keybinding for `mh-help' + and `mh-prefix-help' (closes SF #493740). + (mh-help-messages): New variable to hold various help messages. + (mh-help, mh-prefix-help): Autoload from mh-funcs.el. + +2002-10-13 Bill Wohler <wohler@newt.com> + + * mh-index.el (mh-glimpse-directory, mh-swish-directory, + mh-namazu-directory): New variables that hold the name of the + configuration and indexing directory. All are now hidden `.' + directories. + + * mh-e.el, mh-funcs.el, mh-index.el, mh-mime.el, mh-pick.el, + mh-seq.el, mh-xemacs-compat.el (Docstrings): Converted comments to + docstrings, reworded some docstrings to conform to Emacs + documentation conventions, and eliminated all checkdoc warnings + (except for -flag, which we'll fix after 6.2 is released). + +2002-10-13 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-swish-next-result): Fix a bug in a corner case + where the lack of a trailing "/" caused the function to wrongly + filter out correct hits. This should fix SF #622679. + +2002-10-12 Steve Youngs <youngs@xemacs.org> + + * mh-utils.el (mh-xemacs-p): Simplify it, don't test for + 'defvaralias' and don't use 'running-xemacs'. + +2002-10-11 Bill Wohler <wohler@newt.com> + + * mh-comp.el: (Docstrings): Eliminated all checkdoc warnings by + converting comments to docstrings and rewording some docstrings to + conform to Emacs documentation conventions. + +2002-10-11 Steve Youngs <youngs@xemacs.org> + + * mh-utils.el (mh-xemacs-p): New. + (mh-show-use-xface): Use it. + (mh-show-xface-function): Ditto. + + * mh-e.el (toplevel): Ditto. + (mh-remove-xemacs-horizontal-scrollbar): Ditto. + (mh-folder-mode-map): Ditto. + + * mh-comp.el (mh-insert-x-mailer): Ditto. + + * mh-mime.el (gnus-local-map-property): Ditto. + (mh-mml-to-mime): Move (require 'mh-utils) to toplevel. + (mh-prompt-for-folder): Autoloading this not needed because + mh-utils is now required at toplevel. + (mh-show-xface): Ditto. + (mh-show-addr): Ditto. + +2002-10-11 Bill Wohler <wohler@newt.com> + + * Makefile (EMACS_HOME): Set default to $(TOP)/../emacs so it + would be useful. + + * mh-utils.el (mh-invisible-headers): Added various spam header + fields. + (mh-path-search): Removed argument `func-p' and related code. It + was not documented and no one used it. + (Docstrings): Converted comments to docstrings, reworded some + docstrings to conform to Emacs documentation conventions, and + basically eliminated all checkdoc warnings (except for -flag + warnings). + +2002-10-11 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-generate): Kill dead code. + +2002-10-10 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-region-to-sequence): Don't include point-max in + region (closes SF #621632). + + * mh-utils.el (mh-defun-show-buffer): Fix call of + frame-first-window to work with XEmacs. Also avoid warning about + cur-buffe-name in XEmacs. + (mh-modify, mh-goto-msg): Remove dead code. + + * mh-speed.el (mh-speed-toggle, mh-speed-add-buttons): Remove dead + code. + + * mh-seq.el (mh-subject-thread-to-sequence, mh-thread-get-message, + mh-thread-generate, mh-thread-folder): Remove dead code. + + * mh-mime.el (mh-mm-inline-message): Remove dead code. + + * mh-index.el (mh-index-search): Remove dead code. + + * mh-comp.el (mh-open-line): Remove dead code. + + * mh-e.el (mh-folder-mode): Use the macro + mh-remove-xemacs-horizontal-scrollbar to avoid compiler-warning in + Emacs. + (mh-remove-xemacs-horizontal-scrollbar): New macro to avoid + compiler-warnings. + +2002-10-10 Mark D Baushke <mdb@gnu.org> + + * Makefile (EMACS_OPTIONS): New macro for command-line compile + options. + (EMACS): Allow the user to specify which emacs command to use for + the compile. + (COMPILE_COMMAND): Combine the compile command with its options. + (.el.elc): Use the new $(COMPILE_COMMAND). + +2002-10-10 Mark D Baushke <mdb@gnu.org> + + * mh-speed.el (mh-speed-select-attached-frame): Define a new + compatibility macro for getting to the attached-frame. + (mh-speed-update-current-folder): Use it. + +2002-10-10 Mark D Baushke <mdb@gnu.org> + + * mh-speed.el (mh-speed-update-current-folder): Use + 'dframe-select-attached-frame if we are in a newer speedbar + version that no longer supports the 'speedbar-attached-frame + variable. + +2002-10-10 Steve Youngs <youngs@xemacs.org> + + * mh-speed.el (mh-speed-update-current-folder): Use + 'dframe-select-attached-frame' if we're in XEmacs. + + * mh-e.el (mh-folder-mode): Remove the horizontal scrollbar from + the MH-Folder buffer if we're in XEmacs. + +2002-10-09 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-show-xface-function): New global that stores + what function needs to be called to display X-Face. + (mh-show-xface): Rewritten to avoid compiler warning. + +2002-10-09 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-exchange-point-and-mark-preserving-active-mark): + Simplify code for all emacsen to avoid byte-compilation warnings. + +2002-10-09 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-mime.el (mh-mm-display-part): If a sub-part of the current + part is an inline image then clicking the button keeps the image + around. The change fixes this bug. + +2002-10-09 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-exec-cmd-output): Use new function + 'mh-exchange-point-and-mark-preserving-active-mark instead of + 'exchange-point-and-mark. Fixes a bug in emacs20 and XEmacs21. + (mh-exchange-point-and-mark-preserving-active-mark): New function. + Does like 'exchange-point-and-mark but doesn't activate the mark. + + * mh-comp.el (mh-letter-menu): Allow access to "Pull in All + Compositions" menu entries when edits have really occurred. + Works with "forw: -mime" mh_profile entry, so this fixes a bug. + + * mh-mime.el (mh-mime-inline-part, mh-mm-display-part): Use + line-beginning-position and line-end-position instead of + point-at-bol and point-at-eol XEmacs functions. + * mh-xemacs-compat.el: Added line-end-position and + line-beginning-position compatibility aliases. + +2002-10-08 Mark D. Baushke <mdb@gnu.org> + + * mh-utils.el (mh-scan-msg-format-regexp): The regexp to find + %number(msg). + (mh-scan-msg-format-string): Format to be used with the current + maximum width of message number for the folder in the + `mh-upate-scan-format' function. + (mh-update-scan-format): Use `mh-scan-msg-format-regexp' for greater + flexibility. The message number is no longer anchored to the + beginning of the `mh-scan-format-nmh' or `mh-scan-format-mh' format + strings. The `mh-update-scan-format' allows for using zero-filled + message numbers. + +2002-10-08 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-folder-folder-menu): Add entry for "Thread Folder". + +2002-10-07 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-generate): Use mh-progs to get path to mh + executables. + + * mh-speed.el (mh-speed-flists): Use mh-progs to get path to mh + executables right. + (mh-speed-folders-actual): Same as above. + +2002-10-05 Steve Youngs <youngs@xemacs.org> + + * mh-comp.el (mh-yank-from-start-of-msg): Make default setting 't' + a const. + + * mh-xemacs-compat.el (match-string-no-properties): Rewrite as a + defsubst using 'buffer-substring-no-properties' so we don't grab + any extents. + (rfc822-goto-eoh): Removed. This exists in the XEmacs mail-lib + package. + (mail-header-end): Ditto. + (mail-mode-fill-paragraph): Ditto. + +2002-10-05 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-speed.el (mh-speed-invalidate-map): When called interactively + the function will clear mh-speed-folders-cache. + +2002-10-02 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-mime.el (mh-insert-mime-button): Rewrite without using + replace-match. + +2002-10-01 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-mime.el (mh-file-mime-type-substitutions): Reorder code to + avoid compiler warning. + +2002-10-01 Bill Wohler <wohler@newt.com> + + * Makefile (MH-E-ETC): Moved ChangeLog into MH-E-ETC-ETC since it + shouldn't get installed in Emacs. + (install-emacs): Install MH-E-IMG into Emacs' lisp/toolbar and + MH-E-IMG2 into Emacs' lisp/mail. + +2002-10-01 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-tool-bar-reply-3-buttons): New customization. + Non-nil means use three buttons for reply commands in tool-bar. + If you have room on your tool-bar because you are using a large + font, you may set this variable to expand the single reply + button into three buttons that won't lead to minibuffer prompt + about who to reply to. + (mh-folder-tool-bar-map): Use mh-tool-bar-reply-3-buttons to + decide how many buttons to use for replying. + + * mh-mime.el (mh-file-mime-type-substitutions) + (mh-file-mime-type-substitute): Fix typos and doc strings. + +2002-09-30 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-file-mime-type): Run Content-Type string returned + by file command through mh-file-mime-type-substitute (see below). + (mh-file-mime-type-substitute): Possibly change Content-Type + string using mh-file-mime-type-substitutions variable. This is + mostly because all MS-Office file are seen as application/msword + by the file command. + (mh-file-mime-type-substitutions): New variable. Defines + substitutions to make for Content-Type returned from file command. + +2002-09-27 Bill Wohler <wohler@newt.com> + + * README: Moved Id to end of file since it broke outline mode at + the beginning. + + * import-emacs (release): Renamed "mainline" tag to + "emacs-mainline" to correspond with existing CVS tag. + (EMACS_HOME): Fixed typo in docstring. + + * mh-utils.el (mh-folder-name-p, mh-defun-show-buffer): Lowercase + NIL and T in docstring. + (mh-update-scan-format): Fixed typo. + + * mh-comp.el, mh-e.el, mh-pick.el, mh-utils.el: Updated from CVS + Emacs. The only new thing appears to be to downcase NIL and T in + the documentation. + +2002-09-26 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-generate): The threading code will now be + more resistant to corruption of messages. Before the change any + corruption of message x would cause all messages with indices + higher than x to be neglected when threading! + +2002-09-23 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-store-mime-parts): Don't store value into + user-customizable variable mh-store-mime-parts-default-directory + and use mh-store-mime-parts-directory instead. + +2002-09-20 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-prune-subject): Use regular expressions to + make the subject pruning behave the way it is specified in the + imap-thread RFC. + + * mh-speed.el (mh-speed-folders-actual): Don't use pop when we + are not going to use the first element. This avoids a compilation + warning with cvs emacs. + +2002-09-19 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-display-msg): Put the call to + set-buffer-modified after mh-show-mode. This is needed for CVS + emacs since calling mh-show-mode marks the buffer as modified if + font-lock is on. + +2002-09-17 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-store-mime-parts-default-directory): Renamed from + mh-store-mime-parts-directory + (mh-store-mime-parts-directory): Renamed from + mh-store-mime-parts-directory-default. + +2002-09-16 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mail-citation-hook): Doc tweaks suggested by Bill. + +2002-09-08 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (autoloads): Reorder autoload of mh-reply to avoid + compiler warning. + +2002-09-03 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-store-mime-parts-directory): New defcustom. + Default directory to use for mh-store-mime-parts. + (mh-store-mime-parts): New Command. Store the MIME parts of the + current message. + (mh-store-mime-parts-directory-default): New internal working + variable. Default to use for mh-store-mime-parts-directory, set + from last use. + + * mh-e.el (mh-folder-seq-tool-bar-map): Add mh-store-mime-parts to + toolbar. + + +2002-08-22 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-generate-scan-lines): In threaded view, + complete scan lines are printed for all messages (not just the + ones at the top of a thread). + + * mh-index.el (mh-index-insert-scan): Replace use of kill-line + since that pollutes the kill-ring. + + * mh-comp.el (autoloads): Add autoloads for search and subseq to + get rid of compiler warnings. + +2002-08-19 Peter S Galbraith <psg@debian.org> + + * reply-to.xpm, reply-to.pbm, reply-from.xpm, reply-from.pbm, + reply-all.xpm, reply-all.bpm: New icons for various reply methods. + * mh-e.el (mh-folder-tool-bar-map): Split reply button into three + that won't prompt for "from", "to" and "all". + * mh-comp.el (mh-reply): Put variable reply-to in the interactive + list since it's specified on the command line for the new toolbar. + + * mh-comp.el (mail-citation-hook): Tweak docs concerning + historical usage for supercite. + (mh-yank-from-start-of-msg): Add settings 'supercite and + 'autosupercite. Rename 'automatic to 'autoattrib. + (mh-insert-prefix-string): Invoke sc-cite-original if + mh-yank-from-start-of-msg is et to 'supercite or 'autosupercite. + +2002-08-17 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-comp.el (compilation-fix): Reorder defvars to avoid warnings + during compilation. + +2002-08-17 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-yank-from-start-of-msg): Add 'automatic choice. + Do as for `attribution' automatically when show buffer matches the + message being replied-to. + (mh-reply): Call 'mh-yank-cur-msg when mh-yank-from-start-of-msg + is set to 'automatic and show buffer matches message number being + replied-to. + (mh-show-buffer-message-number): New helper function to get the + message number of the current show-buffer. + (mh-yank-cur-msg): Handle 'automatic choice the same as 'attribution. + (mh-yank-cur-msg): Bug fix. It would bail on error if + mh-show-buffer didn't exists. + +2002-08-16 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-insert-x-mailer): It wrongly assumed that Emacs + was used even when XEmacs was used. Fixed so X-Mailer header is + more exact about what we are using. + +2002-08-15 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-version): Change CVS version number to 6.1+cvs just + so X-Mailer header is more exact about what we are using. + + * mh-mime.el (mh-mhn-compose-insertion, mh-mhn-compose-anon-ftp, + mh-mml-attach-file): + "Jeffrey P. Morgenthaler" <jpmorgen@congee.gsfc.nasa.go> reported + that "require" in emacs 20.3 doesn't handle 3 arguments. We + use "load" at the top of file elsewhere anyway to handle such a + case of non-essential loading, so switch to that here. + +2002-08-06 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-funcs.el (autoload): Add autoload for mh-speed-invalidate-map. + + * mh-speed.el (mh-speed-add-folder): New function to make the + speedbar aware of new folders when they are created by mh-e. + + * mh-utils.el (mh-prompt-for-folder): Use mh-speed-add-folder to + tell speedbar that new folder is being created. Also use folder + instead of mkdir to create new folders. + +2002-08-01 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-decode-quoted-printable): Conditionalize the + limit of search for quoted-printable. If we're using mm-decode + for MIME decoding, it's possible that `mimedecode' could mess our + message, so we only run a full search for quoted-printable parts + when not using gnus' mm-decode. When using mm-decode, mimedecode + can still help by handling the case of the whole message being + quoted-printable as opposed to only a part. + +2002-07-31 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-compose-insertion): Moved from mh-mime.el because + the pulldown menu were broken in XEmacs21 from this variable being + undefined. + +2002-07-28 Mark D. Baushke <mdb@gnu.org> + + * mh-utils.el (mh-show-mode): Use the default paragraph-start + rather than the inherited text-mode value. + +2002-07-28 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-duplicates): New hash table to track + duplicate messages. + (mh-thread-get-message): Remove debug code. + (mh-thread-canonicalize-id): Modified to handle messages without + message-id header. Such messages are given distinct copies of the + empty string as message-id. + (mh-thread-generate): The function was inadvertently rebuilding + the thread tree when message refiles and message deletes are + processed. The change here fixes that. Also code has been added to + keep track of duplicate message-id's. + (mh-thread-generate-scan-lines): Modified to print scan lines for + duplicate messages (that is messages with the same message-id). + (mh-thread-forget-message): Modified to maintain + mh-thread-duplicates. + +2002-07-22 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-speed.el (mh-speed-parse-flists-output): Use delete-region + instead of kill-region. Otherwise the kill ring gets polluted. + +2002-07-16 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-thread-update-scan-line-map): New function to + refresh the stale scan lines. + (mh-thread-inc): Update old scan lines when mh-thread-inc is + called. Otherwise notations for deleted and refiled messages get + lost and the folder display gets out of sync with real mh-e state. + + * mh-mime.el (mh-mm-display-part): Call Gnus citation highlight + code when text part is displayed. Otherwise buttonized text parts + aren't correctly fontified when they are displayed. + +2002-07-15 Mark D. Baushke <mdb@gnu.org> + + * mh-utils.el (mm-decode): Use load for the Non-fatal depencency + on the mm-decode library. + * mh-mime.el (mm-decode, mm-uu, mm-view): Use load for the + Non-fatal depencencies on the mm-decode, mm-uu and mm-view + libraries. + +2002-07-15 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-require, mh-autoload): Remove these macros. + (mh-decode-mime): Initialized to t iff the mm-decode library is + present in the load-path. + * mh-mime.el (mh-require): Don't use it anymore. + +2002-07-15 Mark D Baushke <mdb@gnu.org> + + * mh-utils.el (mh-update-scan-format): Rewrite for compatibility + with Xemacs as replace-match appears not to have identical + functionality with FSF emacs. + (mh-scan-msg-format-regexp): Deleted. This regexp is now hardcoded + into the mh-update-scan-format function. + +2002-07-12 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el: Add message threading code. + + * mh-utils.el (mh-letter-thread-folder): New interactive function + that allows switching to threaded view from show buffer. + (mh-show-folder-map): Bound "F t" to call mh-letter-thread-folder. + (mh-goto-msg): Replace the function to not assume that messages + are sorted in the folder buffer. + + * mh-e.el (mh-folder-threaded-view-p): New buffer local variable + in the folder buffer that records whether threaded view is being + used currently. + (mh-scan-subject-regexp, mh-scan-format-regexp): Get font lock + working for threaded view as well. + (mh-regenerate-headers): Reset mh-folder-threaded-view-p to nil. + (mh-get-new-mail, mh-process-commands): Do incremental threading + if folder is in threaded view. + (mh-delete-scan-msgs): Update thread tables if folder is in + threaded view. + (mh-folder-map): Add "F t" as key binding for mh-thread-folder + + * mh-comp.el (mh-yank-cur-msg): Bug fix. mh-show-buffer is only + has a meaningful value in the folder buffer. + +2002-07-11 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-yank-cur-msg): Run only if mh-show-buffer + actually exists (otherwise a back-traceable error occurred). + + * mh-utils.el (mh-find-progs): Run PATH search only when mh-progs, + mh-lib and mh-lib-progs are not all already set. This allows the + user to set them using a simple setq prior to loading mh-e. This + is useful for implementation of mh-e on win32. Note that many + commands still call mh-find-path which also parses the mh_profile + file (that may still fail on win32), so this is still done often. + But it lets us change the mh_profile file and have mh-e see the + changed file without exiting emacs and starting over so I left + that in. + +2002-07-04 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-show): Fixed a bug in mh-index-show which + caused it to lose track of point when called from show buffer. + +2002-07-04 Mark D. Baushke <mdb@gnu.org> + + * Makefile: Add more information and common methods to allow both + GNU make and Berkeley make to properly build everything. + +2002-07-04 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-mime.el (mh-push-button): Bug fix for mime display with + mouse. Select show window before executing the mime display + functions. + +2002-07-01 Mark D. Baushke <mdb@gnu.org> + + * Makefile: Use a conditional variable assignment operator rather + than ifndef to let Makefile be used by both GNU make and Berkeley + make (or similar versions of make). This does not help Solaris + /usr/ccs/bin/make, but Solaris make has problems with the ifndef + syntax too. + +2002-07-01 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-search): Check for mh-decode-mime before + adding mh-mime-cleanup to kill-buffer-hook. + + * mh-mime.el (mm-destroy-parts): Add definition for old emacs. + +2002-06-30 Mark D Baushke <mdb@gnu.org> + + * mh-utils.el (mh-update-scan-format): Add documentation string. + (mh-scan-msg-format-regexp): Update the regexp to find %(msg). + (mh-set-cmd-note): When mh-scan-format-file is not t, dynamic + update of mh-cmd-note is wrong. Do not assume that + mh-scan-format-nmh and mh-scan-format-mh can be kept in lock-step + with mh-cmd-note via mh-set-cmd-note. The mh-scan-format function + is now where the updated mh-cmd-note value is put into the scan + format. + + * mh-e.el (mh-generate-new-cmd-note): Add documentation string. + (mh-scan-format): Use mh-update-scan-format to get updated copies + of mh-scan-format-nmh and mh-scan-format-mh to avoid format skew. + (mh-get-new-mail): Do not try to adapt mh-cmd-note unless + mh-scan-format-file is equal to t. + (mh-scan-format-nmh): No longer buffer local. + (mh-scan-format-mh): No longer buffer local. + +2002-06-30 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-max-msg-index): New variable to keep track + of max message index among search results. If mh-adaptive-cmd-note + is non-nil this is used to compute the width of the index field. + (mh-index-search): Keep track of max index seen while parsing the + search results and set it if mh-adaptive-cmd-note is non-nil. + (mh-index-find-max-width): New function to find the required width + of the message index field. + (mh-defun-index): Binding buffer local variables is bad, so don't + do that. + (mh-index-show): New argument display-headers-p decides whether + the message is displayed in raw form or not. + (mh-index-header-display): New interactive function bound to "," + which shows the message in raw form. + (mh-index-keymap): Add appropriate bindings for backtab and ",". + (read-from-string): Add ignore-errors around it so that the code + doesn't die when it gets unexpected input. + +2002-06-29 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-count-windows): This function works around the + lack of the window-list builtin function in emacs20. + +2002-06-29 Mark D Baushke <mdb@gnu.org> + + * mh-utils.el (mh-message-number-width): New function to scan + the last message of a folder and return its width. + (mh-adaptive-cmd-note): New variable, if Non-nil indicates that + mh-set-cmd-note should be called with the message width for the + folder. + (mh-cmd-note): Update documentation. + (mh-update-scan-format): Helper function for updating the + mh-scan-format-nmh and mh-scan-format-mh variables. + (mh-scan-msg-overflow-regexp): New variable to help find problem + messages after an inc. + (mh-scan-msg-format-regexp): New variable to find the old message + width in one of the mh-scan-format-nmh or mh-scan-format-mh + variables. + (mh-set-default-cmd-note): Replaced by mh-set-cmd-note. + (mh-set-cmd-note): New function to replace update mh-cmd-note + value. + + * mh-e.el (mh-regenerate-headers): If mh-adaptive-cmd-note is + non-nil, use mh-set-cmd-note on empty folder buffers. + (mh-make-folder): Ditto. + (mh-generate-new-cmd-note): New function to adapt the mh-cmd-note + to fit when mh-get-new-mail gets message number truncation. + (mh-get-new-mail): Maybe use mh-generate-new-cmd-note if + mh-adaptive-cmd-note is Non-nil. + +2002-06-29 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-speed.el (mh-speed-view): The display gets confused if the + cursor is in the show buffer when mh-speed-view is called. This is + a fix for that. + +2002-06-27 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-next-undeleted-msg): Get rid of optional arg + reverse-p. If there are no more undeleted messages the the point + remains at its original position and a message is produced (closes + SF #494304). + (mh-previous-undeleted-msg): Change similar to + mh-next-undeleted-msg. + (mh-next-msg, mh-refile-msg, mh-delete-msg): Backout previous + change. + (mh-folder-map): Bind "S-tab" and "K S-tab" to mh-prev-button. + + * mh-utils.el (mh-show-mode-map): Bind "S-tab" and "K S-tab" to + mh-letter-prev-button. + + * mh-mime.el (gnus-newsgroup-name): Initialize it to nil, so that + mm-uu-dissect doesn't cause error. + +2002-06-27 Mark D Baushke <mdb@gnu.org> + + * mh-utils.el (mh-cmd-note): Make buffer-local. Changes to this + variable should be made via the new mh-set-default-cmd-note + function. + (mh-set-default-cmd-note): New function to setq-default the + mh-cmd-note, mh-scan-format-mh and mh-scan-format-nmh values to + related values. + + * mh-e.el (mh-scan-format-mh): Make buffer-local. + (mh-scan-format-nmh): Ditto. + (mh-scan-good-msg-regexp): Use a more general regular expression + so that the width of message numbers, mh-cmd-note, may vary. + (mh-scan-deleted-msg-regexp): Ditto. + (mh-scan-refiled-msg-regexp): Ditto. + (mh-scan-cur-msg-number-regexp): Ditto. + (mh-scan-cur-msg-regexp): Ditto. + (mh-scan-subject-regexp): Ditto. + +2002-06-26 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-speed.el: Speedbar support code. + + * Makefile: Add mh-speed.el to MH-E-SRC. + + * mh-utils.el (mh-prompt-for-folder): Add speedbar hook if + speedbar is being used. + + * mh-funcs.el (mh-kill-folder): Add speedbar hook if speedbar is + being used. + + * mh-e.el (speedbar-autoloads): Autoload speedbar initialization + functions so that speedbar can find them. + +2002-06-25 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-grep-execute-search, mh-grep-next-result): Allow + grep to be used to search mail. + (mh-index-font-lock-keywords): Modified to avoid bug when using + lazy font-lock. + + * mh-e.el (mh-delete-msg, mh-refile-msg): Modify so that if no + undeleted (or unrefiled) message exists in the current movement + direction then try to find an undeleted (or unrefiled) message in + the opposite direction instead. + (mh-next-undeleted-msg): Added a new optional argument. If non-nil + search for undeleted message backwards if none exists in the + forward direction. + (mh-previous-undeleted-msg): Added an optional argument. If + non-nil search for undeleted message in the forward direction if + none exists in the backward direction. + (mh-next-msg): Optional argument to change direction if undeleted + messages are not found in the current direction. + + * mh-index.el (mh-cmd-note): Use mh-cmd-note instead of hardcoding + the index field size to 4. + + * mh-utils.el (mh-show-addr, mh-show-xface): New functions added + to do xface display and goto-addr interface to allow reuse by the + mime display code. + (mh-show-mode): Use mh-show-addr and mh-show-xface. Only add + mh-mime-cleanup to kill-buffer-hook if mime decoding is enabled. + (mh-modify): Use mh-letter-mode instead of mh-show-mode when + editing messages. + + * mh-mime.el (mh-mm-inline-message): Arrange for xface and + highlighting to work in forwarded messages. + +2002-06-23 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-yank-from-start-of-msg): Add 'attribution' option + to add an attribution line in mh-yank-cur-msg. + (mh-extract-from-attribution-verb): Verb to use for attribution + when a message is yanked by mh-yank-cur-msg. Provides a method + for setting a different language. + (mh-yank-cur-msg): Add support for 'attribution' option. + (mh-extract-from-attribution): Function to get the attribution + line, or the sender from the From: line in the current show buffer. + +2002-06-20 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-show): mh-display-msg was not being called + in the show buffer. This causes weird results on some mime messages. + + * mh-mime.el (gnus-newsgroup-charset): Defvar to avoid error in + pgp messages if gnus hasn't been used yet. + + * mh-comp.el (mh-letter-mode-map): Typo fix. + +2002-06-19 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-mime.el (mh-mml-secure-message-encrypt-pgpmime): Typo fix. + (compiler-warnings): Add autoloads to remove compiler warnings. + + * mh-index.el (autoload-fixes): Fix autoload forms. + +2002-06-18 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-comp.el (mh-letter-mode-map): Change binding of "\C-c\C-ma" + to mh-compose-insertion. Remove duplicate binding for "C-c\C-mf". + (compiler-warnings): Add defvar to remove compiler-warning. + +2002-06-18 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-letter-menu): Conditionalize GPG function on + mh-gnus-pgp-support-p. + + * mh-mime.el (mh-mml-forward-message): s/subseq/substring/. + (mh-compose-forward): cut&paste typo: s/messages/message/. + (mml-minibuffer-read-file): autoload added. + (mml-minibuffer-read-description): autoload added. + (mml-insert-empty-tag): autoload added. + (mh-mml-secure-message-sign-pgpmime): Check mh-gnus-pgp-support-p. + (mh-mml-secure-message-encrypt-pgpmime): Check mh-gnus-pgp-support-p. + +2002-06-17 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-show-use-xface): Check for availability of + `uncompface' executable on system. + + * mh-mime.el (mh-compose-forward): New front end for both + mh-mml-forward-message and mh-mhn-compose-forw. + (mh-compose-insertion): New front end for both mh-mml-attach-file + and mh-mhn-compose-insertion. + (mh-mml-to-mime): New function. Compose mime message from mml + directives. + (mh-mml-forward-message): New function. Forward a message as + attachment. + (mh-mml-attach-file): New function. Attach a file to the outgoing + MIME message. + (mh-mml-compose-insert-p): New variable. Buffer-local variable to + know whether MIME insertion was done. Triggers an automatic call + to `mh-mml-to-mime' in `mh-send-letter'. + (mh-mml-secure-message-sign-pgpmime): New function. + Front end to mml-secure-message-sign-pgpmime. + (mh-mml-secure-message-encrypt-pgpmime): New function. + Front end to mml-secure-message-encrypt-pgpmime. + + * mh-comp.el (mh-send-letter): automatic call to `mh-mml-to-mime' + if mh-mml-compose-insert-p is set. + (mh-letter-mode-map): Add keys for new mh-mime functions above. + * mh-comp.el: Added autoloads for new mh-mime functions above. + +2002-06-17 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-show-use-xface): new defcustom to determine + whether to call external package x-face to display the x-face. + (mh-invisible-headers-show-xface): variable now defaults to value + of mh-show-use-xface. + (mh-show-mode): When mh-show-use-xface is t, invoke + external package x-face to display the x-face. + +2002-06-15 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-prev-button): New interactive function which moves + point to the previous mime button in the show buffer. + (mh-folder-mode-map): Bind M-TAB and K M-TAB to mh-prev-button. + + * mh-utils.el (mh-show-mode-map): Bind M-TAB and K M-TAB to call + mh-letter-prev-button (which is analogous to mh-prev-button). + (mh-gnus-pgp-support-p): New global variable to replace the + variable mh-recent-gnus-p. The name better describes what it is + used for. + + * mh-mime.el (mh-mime-display-part, mh-mime-display-single): Use + mh-gnus-pgp-support-p instead of mh-recent-gnus-p. + +2002-06-12 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-mime.el (mh-display-buttons-for-inline-parts): New + customizable variable. When non-nil inline parts have are + displayed with a button (that is initially expanded). + (mh-maybe-insert-newline): The function has been removed. + (mh-mime-display-single): Add code to display buttons for inline + parts. Reduce the insertion of extra newlines between inline parts + and also for pgp signature parts. + (mh-mm-display-part): The function has been rewritten and cleaned + up. There was a bug which could change the show buffer if the user + pressed C-g while a mime part was being displayed has been fixed. + (mh-press-button, mh-push-button): Use unwind-protect to make sure + that set-buffer-modified-p is always called after mime display. + (mh-mime-inline-part): The behavior of the function has been + changed so that it toggles the display of the raw bytes. + (mh-mime-display-security): Remove the display of too many + newlines. + (documentation): Remove most check-doc warnings. + + * mh-comp.el (mh-filter-out-non-text): Updated since whitespace + added around mime buttons have changed. + +2002-06-10 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-index.el (mh-index-last-search, mh-index-search): The default + prompt in mh-index-search has been removed since currently there + is no good way of reading "+" with mh-prompt-for-folder. + (mh-index-folder-mode, mh-index-show-mode): New major modes + derived from mh-folder-mode and mh-show-mode respectively. They + use a restricted keymap compared to the parent modes. + (mh-index-folder-face): New customizable face to display folder + names in the index buffer. + (documentation): Change two spaces after period back to one. + +2002-06-08 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-folder-toggle-mime-part): New interactive function + to control mime display from folder buffer. + (mh-folder-inline-mime-part): New interactive function to inline + raw mime part from folder buffer. + (mh-folder-save-mime-part): New interactive function to save mime + part from folder buffer. + (mh-folder-mode-map): Add keybindings for "K v", "K o", "K i" and + "K \t" to mh-folder-mode-map. + (mh-goto-next-button): Modified to allow searching for next button + that satisfies some condition. + (mh-folder-mime-action): Support function for + mh-folder-save-mime-part, mh-folder-inline-mime-part and + mh-folder-toggle-mime-part. + + * mh-utils.el (mh-show-mode-map): Modify keymap to add appropriate + bindings for "K v", "K o", "K i" and "K \t". + + * mh-index.el (documentation): Fix docs according to checkdoc + format. + +2002-06-07 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el, mh-funcs.el (Compiler): Remove (require 'view) and + instead add defvar for view-exit-action. + +2002-06-06 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-comp.el (mh-insert-x-face): If transient-mark-mode is enabled + the call to mark returns error. So avoid using mark. + + * mh-index.el: Support for new interactive function + mh-index-search. + + * mh-e.el (mh-next-button, mh-goto-next-button): Refactor + mh-next-button so that the code may be reused by mh-index.el. + (mh-folder-map): Add key "F i" to call mh-index-search. + + * mh-utils.el (mh-recent-gnus-p): Fix documentation. + (mh-msg-folder, mh-display-msg): The new function mh-msg-folder + maps a MH folder name to the buffer displaying it. In normal + operation the two names are identical but they are different in a + folder buffer generated by index search. Minor modification to + mh-display-msg to use mh-msg-folder to enable mh-index-search to + reuse code. + (mh-show-mode-map): Add key "F i" to call mh-index-search. + + * Makefile: Add mh-index.el + +2002-06-05 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-folder-message-menu): Add an entry for mh-modify. + +2002-05-31 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-decode-quoted-printable): Only decode if the + whole message is encoded. So restrict the search for the + content-transfer-encoding header to the headers of the message + itself. + + * mh-mime.el (mh-mime-display-alternative): Make sure that point + is moved after mm-display-part is called. + +2002-05-29 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-mime.el (mh-mime-display-single): Fix the logic that + determines when an attachment is buttonized. For inline parts that + can't be displayed a button is now created. + +2002-05-29 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-regenerate-headers): Fix an error in which the + mh-mode-line-annotation was not being set properly. + + * mh-mime.el, mh-utils.el (compilation): Macros mh-require and + mh-autoload are used to make sure that emacs20 doesn't croak when + it tries to load non-existent mm-* files. + (mh-decode-mime): Make it default to nil for Emacs major version + below 21. + +2002-05-28 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-e.el (mh-regenerate-headers): Generalize the function to + handle multiple ranges. + +2002-05-25 Satyaki Das <satyaki@theforce.stanford.edu> + + * compilation: Reduce use of eval-when-compile so that load-path + is not changed if lisp files are loaded without compilation. Small + changes were made to Makefile, mh-comp.el mh-e.el, mh-funcs.el, + mh-seq.el, mh-utils.el + + * mh-e.el (mh-next-button, mh-folder-mode-map): New interactive + function to advance point to next MIME button. It is bound to TAB. + + * mh-utils.el (mh-letter-next-button, mh-show-mode-map): New + interactive function mh-letter-next-button has been added to + advance point to the next MIME button. It is bound to TAB. + + * mh-mime.el (comments): Added some comments. + +2002-05-24 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-mime.el (compilation): Replace (eval-when-compile ...) by + (eval-when (compile) ...) to remove a bug when mh-e is loaded + without compilation. + +2002-05-23 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-comp.el (compilation): Some code was rearranged to avoid + compiler warnings. + + * mh-e.el (compilation): Code rearrangement and extra autoloads to + remove compiler warnings + (mh-quit): Add call to mh-destroy-postponed-handles to remove + handles that are associated with external viewers. Also fixed a + bug that I accidentally introduced by adding an extra line when + cut and pasting my changes. + + * mh-func.el (compilation): Code rearrangement to remove compiler + warnings. + + * mh-mime.el (compilation): Code rearrangement to remove compiler + warnings. + (mh-defun-compat): New macro to define to useful functions that + aren't present present in old Gnus. + (mh-destroy-postponed-handles): New function to cleanup handles + that are associated with external viewers. + (mh-handle-set-external-undisplayer): New function to replace + mm-handle-set-external-undisplayer. It associates handles for + external viewers with the folder buffer. These are released when + the user quits the folder. + (mh-mime-display, mh-press-button, mh-push-button): Hook in + mh-handle-set-external-undisplayer. + (mh-maybe-insert-newline): New function to avoid inserting too + many newlines between mime parts. + (mh-mm-display-part): Workaround for Gnus bug which causes new + lines to be inserted when images are shown inline. + (mh-mime-display-security): Cut down on newlines inserted. + + * mh-pick.el (compilation): Code rearrangement to remove compiler + warnings. + + * mh-seq.el (compilation): Code rearrangement to remove compiler + warnings. + (comments): Remove @SD from comments. + + * mh-utils.el (compilation): Slight code rearrangement. + (mh-defun-show-buffer): Fix documentation so that the first line + is not too long as was the case earlier. Use + mh-previous-window-config to remember where the cursor should + return functions like mh-reply. + (mh-display-msg): Initialize handles data-structure for the folder + buffer so that postponed handles can be added to it. + (mh-add-msgs-to-seq): Always keep messages in the sequences + sorted. This removes some unexpected behavior when working with + sequences that go out of sync with the corresponding MH sequences. + (mh-canonicalize-sequence): New function to sort and remove + duplicates from mh-e sequence. + +2002-05-21 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (require): Load mm-decode.el here so that + mm-inline-media-tests is properly initialized. + + * mh-comp.el (mh-yank-cur-msg): Don't try to remove the displayed + mime parts when yanking the message. This also fixes the problem + of regions not being respected during the yank. + +2002-05-20 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (compiler-warnings): Some code was rearranged to + remove all compiler warnings. + (mh-decode-mime): New defcustom to control whether + mime attachments are shown using Gnus. + (mh-globals-hash): New global variable which maps a given buffer + to the corresponding mime data structures. + (mh-recent-gnus-p): New global variable which checks if Gnus is + recent enough so that PGP/GPG encrypted messages can be handled. + (mh-mm-inline-media-tests): Tests to determine whether a mime part + can be shown inline. + (mh-gnus-article-highlight-citation): Shadow the Gnus function, + gnus-article-add-button before gnus-article-highlight-citation is + called. This prevents the insertion of useless buttons in the + message. + (mh-show-mode): Don't set font-lock-support-mode to nil. Modify + kill-buffer-hook to call mh-mime-cleanup. + (mh-modify): Only the edit buffer is shown. + (mh-display-msg): Add call to mh-mime-display, mh-display-smileys, + mh-display-emphasis when mh-decode-mime is non-nil. + + * mh-mime.el (mh-buffer-data): New structure to keep track of + per-buffer mime information. + (compiler-warnings): Some code was rearranged to get rid of all + compiler warnings. + (mh-graphical-smileys-p): New defcustom which controls whether + graphical smileys are shown. + (mh-graphical-emphasis-p): New defcustom for graphical emphasis. + (mh-max-inline-image-width, mh-max-inline-image-height): New + defcustoms for inlining image. + (gnus-local-map-property, mm-merge-handles): Copy utility + functions for use with version of Gnus that ships with Emacs21.1. + (mh-mime-cleanup): New function to free mime data-structures. + (mh-add-missing-mime-version-header): New function to add missing + Mime-Version header if a Content-Type header exists. + (mh-display-smileys): New function to show graphical smileys. + (mh-display-emphasis): New function to show graphical emphasis. + (new-globals): New variables mh-mime-button-* and + mh-mime-security-* were added to control mime buttons. + (mh-mime-display): New function to display mime messages. The + functions mh-mime-display-part, mh-mime-display-alternative, + mh-mime-display-mixed, mh-mime-part-index, mh-small-image-p, + mh-mime-display-single, mh-insert-mime-button, mh-mm-display-part, + mh-press-button, mh-push-button, mh-mime-save-part, + mh-mime-inline-part, mh-widget-press-button, mh-mm-inline-message, + mh-mime-display-security, mh-mime-security-show-details, + mh-mime-security-press-button and mh-insert-mime-security-button + were added to support mh-mime-display. + + * mh-e.el (mh-header-display): Bind mh-decode-mime to nil when + mh-show-msg is called, so that mime isn't decoded when headers are + displayed. + (mh-quit): The show buffer is killed instead of invalidating and + burying it. + + * mh-comp.el (mh-yank-cur-msg): Filter out the mime buttons from + the yanked message. + (mh-filter-out-non-text): New function to filter out attachments + from message being yanked. + +2002-05-20 Bill Wohler <Bill.Wohler@openwave.com> + + * mh-utils.el (mh-invisible-headers-show-xface): First sentence of + docstring was not entirely on first line so was truncated in + customize and help buffers. Reworded so first sentence could fit + within 80 columns per checkdoc recommendation. + (mh-defun-show-buffer): Reworded per checkdoc recommendations. + Removed @SD while I was in there. + +2002-05-18 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-seq.el (mh-narrow-to-seq): This function now removes the + current message notation in the folder. Otherwise, two current + message notations may be present after mh-widen is called. Also + mh-copy-seq-to-eob is called instead of mh-copy-seq-to-point since + the latter has a bug. + (mh-copy-seq-to-point): This function has a tricky problem. It + calls mh-map-to-seq-msgs which uses mh-goto-msg. mh-goto-msg + assumes that the folder is sorted (since it uses binary + search). The assumption isn't true, so it may not copy all the + messages. Since this function is not used any more it has been + removed. + (mh-copy-seq-to-eob): This function is a specialized (and + hopefully correct) replacement for mh-copy-seq-to-point. + +2002-05-17 Satyaki Das <satyaki@theforce.stanford.edu> + + * mh-utils.el (mh-gnus-article-highlight-citation): Workaround for + problem caused by low value of recursive-load-depth-limit in + Emacs21.1 and CVS version of Gnus. + (mh-show-mode-map): New keymap variable to facilitate use of + summary commands from the show buffer. + (mh-show-folder-buffer): New local variable which keeps track of + the folder-buffer corresponding to the message being shown. + (mh-defun-show-buffer): New macro to convert interactive functions + callable in the summary buffer to interactive functions callable + in the show buffer. + (mh-show-mode): Make buffer read-only and use mh-show-mode-map as + keymap (closes SF #527946). + (mh-modify): New interactive function to edit a message in-place. + + * mh-e.el (mh-goto-cur-msg): Add an optional argument, + minimal-changes-p. If non-nil, the function will just change + the point to current message and do not change folder display. + (mh-folder-mode-map): Make "M" call mh-modify. + +2002-05-07 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-invisible-headers-show-xface): New defcustom + variable. If non-nil, the X-Face header line will be excluded from + the variable `mh-invisible-headers'. Set this when using a + package such as x-face-el to display X-Face icons in mh-show-mode. + This variable's setting will eventually be set automatically when + mh-e does its own X-Face decoding (or this variable will be replaced + by one telling mh-e to decode the X-Face). We may not ship the + next release with this variable. + +2002-05-07 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-x-face-file): New defcustom variable. File name + containing the encoded X-Face string to insert in outgoing mail. + (mh-insert-x-face): New function. Appends an X-Face field to the + header, but only if it doesn't already exist and if 'mh-x-face-file' + is non-nil and points to an existing file. + (mh-send-letter): Invoke mh-insert-x-face. + +2002-04-29 Mike Kupfer <m.kupfer@acm.org> + + * mh-e.el (mh-delete-msg, mh-refile-msg, mh-undo): Check + whether XEmacs region is actually active (needed at least for 21.1). + [Patch committed by psg] + +2002-04-29 Mike Kupfer <m.kupfer@acm.org> + + * mh-utils.el (mh-prompt-for-folder): Remove "default" argument + from completing-read as XEmacs-21.1 doesn't have it (21.4 does + however) and using the argument adds no functionality. + [Patch committed by psg] + +2002-04-11 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-delete-msg, mh-refile-msg, mh-undo): Add support for + XEmacs to act on selected region when active. + +2002-04-10 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-delete-msg, mh-refile-msg, mh-undo): XEmacs fix; Add + check to see if mark-active is bound, because Mandrake Linux include + XEmacs initialization code that binds transient-mark-mode. This + fix gets around a problem in Mandrake only. It wasn't a problem + on XEmacs generally. Fixes SF #541915. + +2002-04-08 Bill Wohler <wohler@newt.com> + + * Released mh-e version 6.1. + + * mh-e.el (mh-folder-unseen-seq-name): Use "mhparam -component + Unseen-Sequence" command and "Unseen-Sequence: \\(.*\\)$" regexp + to increase robustness. + (mh-folder-unseen-seq-list): Use `expand-file-name' as + `mh-expand-file-name' isn't needed and the former saves function + call. + (Version, mh-version): Updated for release 6.1. + +2002-04-08 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-folder-unseen-seq-list): Specify mh-progs path in + call to mark command. Fixes a bug in which unseen messages + weren't highlighted if "mark" wasn't in the path. + +2002-04-07 Bill Wohler <wohler@newt.com> + + * MH-E-NEWS: Updated for release 6.1. + + * README: Updated for release 6.1. Updated verbiage about reading + MH-E-NEWS. + + * mh-comp.el, mh-e.el, mh-funcs.el, mh-mime.el, mh-seq.el, + mh-utils.el, mh-xemacs-compat.el: Updated copyright in files + modified this year. + + * mh-xemacs-compat.el: Put Author field back in, but set to FSF. + + * mh-comp.el, mh-funcs.el, mh-mime.el, mh-seq.el, + mh-utils.el: Fixed all checkdoc errors, except for no + documentation, and documentation in comments. Also removed the- + prefix from certain local variables. + + * mh-e.el: Fixed all checkdoc errors, except for no documentation, + and documentation in comments. Also removed the- prefix from + certain local variables. + (mh-folder-unseen-seq-name): Refactored to make default sequence + name more explicit and to handle undefined Unseen-Sequence MH + profile entry better. + +2002-04-02 Peter S Galbraith <psg@debian.org> + + * mh-e.el: 'defvar mh-folder-unseen-seq-name' called a function to + set it's value, and this happens also on byte-compilation (where + it can fail if the user's MH environment is not setup correctly). + I now set the value of mh-folder-unseen-seq-name at runtime when I + first need it. This should fix Debian bugs + http://bugs.debian.org/140232 and http://bugs.debian.org/140817 + +2002-03-25 Peter S Galbraith <psg@debian.org> + + * mh-utils.el: remove "(require 'mh-e)" since mh-utils.el should + be at the bottom of the dependency tree. + * mh-e.el (mh-folder-unseen-seq-name): Make sure mh-progs is set + and use it as path to mhparam command in call-process. + +2002-01-23 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-folder-font-lock-keywords): Add call to + mh-folder-font-lock-unseen to fontify unseen messages in bold. + (mh-folder-unseen-seq-name): Provide name of unseen sequence from + mhparam. Used as default for variable of same name. + (mh-folder-unseen-seq-list): Returns a list of unseen messages + numbers for current folder. + (mh-folder-unseen-seq-cache): Cache variable to hold list of + unseen message numbers while font-lock iterates. This variable is + buffer-local. + (mh-folder-font-lock-unseen): Returns unseen message lines to + font-lock one by one. + +2002-01-15 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-insert-prefix-string): Wrap a + "(let ((zmacs-regions nil))" around (mark) so it works in XEmacs. + Bug reported and fix suggested by Will Partain <partain@dcs.gla.ac.uk> + Indeed, this is how it appears in XEmacs-21's mh-comp.el. + +2001-12-16 Jeffrey C Honig <jch@honig.net> + + * mh-comp.el (mh-forward): Move the assignment to `fwd-msg-file' + to before the assignment to `draft' as the later changes buffers + and invalidates `mh-seq-list' (which is used in a function called + by (mh-seq-to-msgs)). Resolves SF #489448. + + * mh-utils.el: Add defcustoms for `mh-temp-folders-buffer' and + `mh-temp-sequences-buffer'. + + * mh-e.el (mh-quit): If they exist, kill 'mh-temp-buffer, + 'mh-temp-folders-buffer and 'mh-temp-sequences-buffer when + quitting. + + * mh-funcs.el (mh-list-folders): Use `mh-temp-folders-buffer' + (a defcustom initialized to "*Folders*") for folder listing. Put + into view mode and set it up to kill the buffer when exiting view + mode. + + * mh-seq.el (mh-list-sequences): Use `mh-temp-sequences-buffer' + (a defcustom initialized to "*Sequences") for sequences listing. + Put into view mode and set it up to kill the buffer when exiting + view mode. + +2001-12-16 Bill Wohler <wohler@newt.com> + + * Released mh-e version 6.0. + + * MH-E-NEWS: Be a little more specific about incompatible changes. + Added info about outdated manual. + Removed variables in mh-scan regexp table that did not exist in + 5.0.2. + Added helpful documentation about finding relevant variables + containing regexps to mh-scan-format-file's description. + + * mh-e.el (mh-scan-format-file): Added information about getting a + list of regexp variables that you'll need to change if you + customize your scan's output. + (mh-folder-mode): Added documentation about `mh-scan-format-file' + for those users who modify their scan formats. + + * README: New file. Describes packages and provides simple + installation instructions. + + * Makefile (clean, dist, install-emacs): Replaced $(RM) with rm + -rf (closes SF #488661). + +2001-12-14 Bill Wohler <wohler@newt.com> + + * Released mh-e version 5.0.93. + + * Makefile (MH-E-SRC): Added mh-xemacs-compat.el. + (MH-E-IMG): Added .pbm images for all. Removed mail_ prefix from + all. + (MH-E-IMG2): New variable to hold images in mail sub-directory. + (dist): Updated target to make mail sub-directory and copy + MH-E-IMG2 images there. + + * mh-xemacs-compat.el: Modified docs per GNU coding conventions. + + * mh-e.el: Reorganized variables having to do with the scan line. + Moved some random variables that were interspersed out of the + middle. Moved `mh-scan-format-file' first and let the variables + flow from there. + + As the number of variables increases, it is becoming important to + organize the mh-e namespace. Several variables having to do with + the format of scan lines were renamed, as follows: + (mh-good-msg-regexp): Renamed to mh-scan-good-msg-regexp. + (mh-deleted-msg-regexp): Renamed to mh-scan-deleted-msg-regexp. + (mh-refiled-msg-regexp): Renamed to mh-scan-refiled-msg-regexp. + (mh-valid-scan-line): Renamed to mh-scan-valid-regexp. + (mh-cur-msg-number-regexp): Renamed to mh-scan-cur-msg-number-regexp. + (mh-cur-msg-line-regexp): Renamed to mh-scan-cur-msg-regexp. + (mh-scan-rcpt-addr-regexp): Renamed to mh-scan-rcpt-regexp. + (mh-scan.font-lock-regexp): Renamed to mh-scan-format-regexp. + (mh-folder-scan-font-lock-face): Renamed to + mh-folder-scan-format-face. + (mh-folder-cur-msg-line-face): Renamed to mh-folder-cur-msg-face). + +2001-12-13 Bill Wohler <wohler@newt.com> + + * mh-utils.el (mh-msg-number-regexp): Renamed to + mh-scan-msg-number-regexp. + (mh-msg-search-regexp): Renamed to mh-scan-msg-search-regexp. + + * Corrected typos, quoted variables in doc strings, and made minor + wording changes in docs. + +2001-12-13 Peter S Galbraith <psg@debian.org> + + * mh-xemacs-compat.el: defalias 'match-string-no-properties to + 'match-string for XEmacs. I've seen a better function for this + that actually removes text properties, but this will do for now. + + * mh-utils.el (mh-decode-quoted-printable): deactivate-mark not + bound in XEmacs. + + * mh-xemacs-compat.el: GNU Emacs Functions needed by XEmacs. + New file. + * mh-e.el: (require 'mh-xemacs-compat) when running XEmacs. + +2001-12-12 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-send-letter): function local-variable-p needs two + arguments in XEmacs. + (mh-send-letter): sendmail-coding-system not bound in XEmacs. + (mh-send-letter): default-buffer-file-coding-system not bound in + Xemacs. + + * mh-e.el (mh-delete-msg, mh-refile-msg, mh-undo): + transient-mark-mode not bound in XEmacs. The feature of + operations made on all messages in the selected range when + transient-mark-mode is on doesn't work in XEmacs. + + * mh-e.el, mh-utils: Conditionalize calls to + 'add-to-list 'facemenu-unlisted-faces for XEmacs. + +2001-12-11 Jeffrey C Honig <jch@honig.net> + + * mh-e.el (mh-scan-format): Add `mh-scan-format-file' variable to + specify the scan format string or file to use. Define formats for + MH and nmh that are compatible with the standard format, but + provide hints for font-lock. Define (mh-scan-format) for use by + (mh-regenerate-headers) and (mh-get-new-mail) to specify the args + necessary to inform the scan program which scan format string or + file to use. + +2001-12-07 Peter S Galbraith <psg@debian.org> + + * mh-e.el (scan.font-lock): New format file documented in comments. + (mh-scan.font-lock-regexp): Adapted to new format. + (mh-folder-font-lock-keywords): Use new format. + + * mh-e.el (page-down.xpm): Icon renamed from nextpage. + + * mh-utils.el (mh-decode-quoted-printable): Bug fix. Better check + on what actually is a quoted-printable attachment. + +2001-12-06 Eric Ding <ericding@alum.mit.edu> + + * mh-mime.el (mh-mhn-compose-insertion, mh-mhn-compose-anon-ftp): + require mailcap.el here rather than using autoload at top of + mh-mime. + (mh-file-mime-type): get rid of unused variables (why were they + there to begin with?) + +2001-12-06 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-cur-msg-number-regexp, mh-cur-msg-line-regexp): + mh-cur-scan-msg-regexp splits into these two variables. + The whole-line fontification is disabled, but easily restored by a + user (although it could be a defcustom with choices DISABLED or + the correct regexp?) + (mh-folder-cur-msg-line-face): mh-folder-current-msg-face renamed + to this. + (mh-folder-cur-msg-number-face): mh-folder-current-face renamed to + this. + + * cabinet.xpm: Revert to rescan icon name. + * mh-e.el (mh-folder-tool-bar-map): s/cabinet/rescan/ + + * mh-e.el (mh-folder-font-lock-keywords): Reorder and tweak such + that current message line highlight doesn't mess up other highlights. + +2001-12-05 Eric Ding <ericding@alum.mit.edu> + + * mh-utils.el (mh-show-from-face): Change mh-show-from-face to + cyan on dark backgrounds; through a series of changes, it had + become the same color as mh-show-subject-face! + +2001-12-05 Bill Wohler <Bill.Wohler@openwave.com> + + * mh-e.el, mh-utils.el: Fixed typos in face definitions, and made + a couple of small doc string tweaks while I was in there. Peter, + if you don't agree, let me know and I'll back them out. I thought + the "mh-e" in the text was redundant since the variables start + with "mh"; I was also thinking ahead to how the documentation may + read. + +2001-12-05 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-cur-scan-msg-regexp): Match 0 is the whole line. + (mh-folder-current-msg-face): New face with only a background + settings, used in font-lock for the current message. + (mh-folder-font-lock-keywords): Use mh-folder-current-msg-face for + mh-cur-scan-msg-regexp. + + * mh-utils.el (mh-show-from-face): Use red3 instead of red for + light backgrounds. It's not as bright on the eyes. + (mh-show-subject-face): copy from mh-folder-subject-face instead. + Makes the look consistent with folder-mode. + + * mh-e.el (mh-folder-subject-face): Moved to mh-utils since we + need it to copy to mh-show-subject-face. + +2001-12-05 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-folder-mode-map): Moved `mh-extract-rejected-mail' + from "a" to "E". Better mnemonic, nicer to folks used to using a + for `mh-reply'. + +2001-12-04 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-folder-map): Added "S" for `mh-sort-folder'. + +2001-12-04 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-folder-subject-face et al.): Yet another attempt at + colours for folder-mode. Still themed, but fewer and darker + colours (Blame Eric this time!). I'll get to underlining tomorrow + night. + + * mh-e.el (mh-folder-tool-bar-map): Renamed all icons so they + don't have the word mail in them. Also generated a pbm format of + each icon for users without XPM support conpiled into Emacs. + +2001-12-04 Eric Ding <ericding@alum.mit.edu> + + * mh-utils.el (mh-show-font-lock-keywords): Use + mh-header-subject-font-lock instead of regexp for subject headers, + which may go multiple lines. + (mh-header-subject-font-lock): New function. + Fix typos (hightlight -> highlight). + +2001-12-04 Eric Ding <ericding@alum.mit.edu> + + * mh-e.el: changes to face colors on dark backgrounds. + (mh-folder-followup-face): change to LightGoldenRod. + (mh-folder-date-face): change to snow3. + (mh-folder-msg-number-face): change to snow4. + +2001-12-04 Bill Wohler <wohler@newt.com> + + * Released mh-e version 5.0.92. + + * mh-utils.el (gnus-cite-face-list) + (mh-gnus-article-highlight-citation): Don't autoload. Revert to + requiring in `mh-gnus-article-highlight-citation' as before. With + the autoloads, if you ran mh-e before gnus, you'd get an undefined + gnus variable when viewing an article in gnus. Go figure. + +2001-12-03 Bill Wohler <wohler@newt.com> + + * Released mh-e version 5.0.91. + + * MH-E-NEWS: Removed info about bumping up `max-specpdl-size' now + that workaround has been implemented. + + * Makefile (MH-E-OBJ): New variable to hold .elc files. + (all): Just compile. + (clean): New target that blows away MH-E-OBJ. + (dist): Added $(MH-E-OBJ) to tarball. + + + Attempt to quiet compilation errors to a dull roar. + + * mh-e.el: Require easymenu, added autoload of info. + (mh-smail, mh-smail-other-window): Comment says these were needed + by Emacs 18. Out! + + * mh-utils.el: Don't require sendmail, but require mh-e. + Moved autoloads to top of file, and autoload gnus-cite and + sendmail too. + + * mh-pick.el: Require easymenu. Remove cond on + `easy-menu-define'--it exists. + + * mh-mime.el: Autoload mailcap. + + * mh-comp.el: Require mh-e and easymenu, moved autoloads to top of + file. + + + * Makefile: (EMACS): New constant to hold emacs calling sequence. + (install): Renamed to install-emacs. + (compile): New target to compile all files. + (dist): Make dependent on compile. + (import): Renamed to import-emacs. + (%.elc): New implicit rule to compile elisp files. + + * mh-e.el (mh-thread-map): Added "Td" for + mh-delete-subject-thread. + +2001-12-03 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-folder-tool-bar-map): Change tooltip for exec icon. + + * mh-e.el (mh-folder-subject-face): Change to IndianRed1. + (mh-folder-followup-face): Change to IndianRed. + (mh-folder-deleted-face): Use sedate face instead of bright one. + +2001-12-03 Bill Wohler <wohler@newt.com> + + * mh-utils.el (mh-invisible-headers): Increase size of + `max-specpdl-size' locally to work around insufficient default. + (mh-invisible-headers): Added X-Info and X-VSMLoop (NTMail). + +2001-12-03 Jeffrey C Honig <jch@honig.net> + + * mh-utils.el (mh-find-progs): Searches should not stop if the + strings are not found, there is error detection at the end of the + routine (closes SF #488231). + +2001-12-02 Bill Wohler <wohler@newt.com> + + * MH-E-NEWS: Added info about bumping up `max-specpdl-size'. + + * Makefile (MH-E-IMG): New variable that contains images used by + mh-e. Add these files to release. + + * MH-E-NEWS: Second draft of mh-e 6.0 (was 5.1) release notes. + + * mh-e.el (mh-folder-updated-hook): Reworded to avoid ambiguity. + Is the hook called when you type `d' or when you type `x'? + (mh-unseen-updated-hook): Reworded to be consistent with + `mh-folder-updated-hook.' + + * mh-utils.el (mh-recenter): Accepted Gerd's change which is + evaluated at compile time. + +2001-12-02 Bill Wohler <wohler@newt.com> + + * mh-e.el Major, major keymap changes. The specific changes are + listed below, but view the sources, or use "C-h m" in MH Folder + mode for the complete list. + + Use of sub-keymaps inspired by gnus. The changes tripped me up at + first too, but after about 5 minutes of shock (which is to be + expected, I've been using the old keybindings for 16 years), I + honestly found the new bindings to be nice indeed. It will also + provide flexibility to allow for future functionality. I hate to + do this on the eve of the beta release, but you asked for it! It's + likely I'll have to pull an Eric and back this change out, but if + we can live with pink subjects, this can't be so bad ;-). + Question: will the users revolt? If they do, I suppose we can + release 6.0.1 the next day ;-). + (mh-folder-map, mh-sequence-map, mh-extract-map, mh-digest-map): + New keymaps which start with F, S, X, and D, respectively. The + mhstore commands can go in the mh-extract-map eventually. + (mh-thread-map): Renamed from mh-folder-thread-map. + + Keymap changes and rationale. The sub-keymaps allowed some + consistency (e.g., esp. with l(ist) and k(ill). + + e Deleted. Already have x. Now used by mh-edit-again. + a Deleted. Already have r. Now used by mh-extract-rej.. + j Deleted. Already have g. + + M-a -> e Better mnemonic. Matches rmail. Frees movement cmd. + M-e -> a Try `a'gain! + + M-f -> Fv Frees movement command + M-f -> Ff Alias (keep?) + M-f -> Fo Alias (keep?) + M-k -> Fk No reason but to keep with folder commands + M-l -> Fl No reason but to keep with folder commands + M-p -> Fp No reason but to keep with folder commands + M-r -> Fr Frees movement command + M-s -> Fs No reason but to keep with folder commands + M-u -> Fu No reason but to keep with folder commands + + M-% -> Sd Better mnemonic + M-# -> Sk Better mnemonic + M-q -> Sl Better mnemonic + C-xn -> Sn Frees up standard key binding + % -> Sp Better mnemonic for putting a message in a sequence + ? -> Ss Shows sequences that message is in + C-xw -> Sw Frees up standard key binding + + M-n -> Xs Better mnemonic (shar) + M-n -> Xu Better mnemonic (uuencode) + + M-SPC -> DSPC Frees mark command + M-\177 -> D\177 No reason but to keep with digest commands + M-b -> Db Frees movement command + +2001-12-01 Bill Wohler <wohler@newt.com> + + * mh-e.el: Use gnus style of keymaps. Now requires gnus-util. + (mh-folder-thread-map): New map, created by gnus-define-keys. + Reached when typing T in mh-folder-mode-map. Moved threading + functions to this new keymap so we can use dired again. + (mh-folder-mode-map): Defined by gnus-define-keys. Otherwise than + the new threading functions, no changes to the UI were made at + this point--saving that for the next check-in. + + * mh-pick.el (mh-pick-mode-map): Use gnus-define-keys. Now + requires gnus-util. + + * mh-comp.el (mh-letter-mode-map): Use gnus-define-keys. Now + requires gnus-util. + +2001-12-01 Jeffrey C Honig <jch@honig.net> + + * mh-e.el: Update the documentation for the regexps used by + `mh-folder-font-lock-keywords' to specify how many parethesized + expressions they are expected to have and what those expressions + are expected to match. + +2001-12-01 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-folder-mode): Removed iteration of key bindings, + \\{mh-folder-mode-map} suffices. Removed variable documentation + also as this is already out of date and a maintenance hassle. + Reference new mh customization group instead. + + * mh-comp.el (mh-letter-mode): Ditto. Also added new information + about MIME directives getting processed automatically if inserted + via mh-e commands. + + * mh-pick.el (mh-pick-mode): Edited documentation so it reads like + the other modes. + + * mh-e.el (mh-compat-quit): Deleted obsolete and unused function. + Comment in this function said that `b' shouldn't be used for + burst-digest, as it is used for `back' in info, less, and rn. But + what does `back' mean in MH Folder? I suppose if you visit a + folder, you would go `back' to the original folder. Hmmm, I guess + we'll leave the `b' binding alone for now. + + * mh-utils.el: Moved some of the variable comments to the first + column so they wouldn't wrap in such an ugly fashion. + (mh-showing-mode): Renamed variable and function from mh-showing + to conform with minor mode conventions. Added optional arg to + function so it would behave like a normal minor mode: no or nil + arg toggles mode, 0 arg turns off, non-nil turns on. It also turns + out that desktop-create-buffer would barf when recreating mh-e + buffers because it was calling mh-show with an arg. + (mh-show-mode): Use define-derived-mode to simplify definition a + *lot*. + (mh-set-mode-name): Deprecated by use of define-derived-mode. + Removed. + + * mh-pick.el (mh-pick-mode): Use define-derived-mode to simplify + definition a *lot*. + + * mh-e.el (mh-scan-prog): Removed message about "Buffer local" as + this message will appear in a future version of Emacs. + (mh-inc-folder): mh-showing renamed to mh-show-mode and made a + real minor mode. + (mh-folder-mode): Use define-derived-mode to simplify definition a + *lot*. + + * import-emacs (release): Change `(none)' to `mainline' so import + doesn't choke after running `cvs up -A' on Emacs. + (COPYING): Moved from $EMACS_HOME/etc to $EMACS_HOME. + (cvs update): Whoops! Forgot the second join (-jemacs). + make import works fine again. + +2001-11-30 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-folder-font-lock-keywords): Change order of + font-lock patterns such that subject body text doesn't get date + fontification. + + * mh-e.el (mh-scan-subject-regexp): Bug fix. Remove a dot. + scan.font-lock users have to setq it separately. + +2001-11-30 Eric Ding <ericding@alum.mit.edu> + + * mh-utils.el (mh-clean-msg-header): Go back to using + mh-delete-line. Using invisible text property is nicer in some + ways, but winds up with somewhat mysterious behavior should user + kill/yank stuff from the header (i.e., text gets yanked invisibly + and won't be seen by user until file is reloaded). + +2001-11-29 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-page-msg): Use mh-next-direction to page in the + right direction. + +2001-11-29 Jeffrey C Honig <jch@honig.net> + + * mh-e.el (mh-scan-folder): Fix logic to not attempt to go to + the current message if there are no messages in the folder. + +2001-11-29 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-folder-font-lock-subject): New fontifier function + for subject lines in folder-mode + (mh-scan-followup-regexp): Deleted obsolete regexp. Use + mh-scan-subject-regexp instead. + (mh-folder-font-lock-keywords): Use mh-folder-font-lock-subject + instead of obsolete mh-scan-followup-regexp variable. + (mh-folder-date-face, mh-folder-msg-number-face): + (mh-folder-subject-face, mh-folder-followup-face): + Now defined as proper faces instead of copied from font-lock + faces. + + * mh-mime.el (mh-media-type-regexp): New variable. Regexp matching + valid media types used in MIME attachment compositions. + (mh-file-mime-type): Use mh-media-type-regexp instead of + hard-wiring its value. + + * mh-utils.el (mh-show-unquote-From): New function to unquote + "^>From" in mh-show-mode (not saved to disk). + (mh-show-mode): Call mh-show-unquote-From. + +2001-11-29 Eric Ding <ericding@alum.mit.edu> + + * mh-utils.el (mh-clean-msg-header): Use mh-make-line-invisible + rather than mh-delete-line. + (mh-make-line-invisible): New function to make line(s) invisible + rather than deleting line(s). Optional argument specifies number + of lines to delete. + (mh-show-msg): screen-height has been deprecated; use no more. + (mh-notate): screen-width has been deprecated; use no more. + +2001-11-29 Jeffrey C Honig <jch@honig.net> + + * mh-utils.el: (mh-find-progs): Change mh-find-progs to rely on + the existence of mhparam. The location of mhparam is used to find + `mh-progs'. It uses the libdir and etcdir to find the + `mh-lib-progs' and `mh-lib' directories. If etcdir doesn't return + anything we assume `mh-lib-progs' is the same as `mh-lib' and that + we are using MH instead of nmh. + +2001-11-29 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-scan.font-lock-regexp): Change docs to reflect that + second paren expression is the user match. + (mh-folder-font-lock-keywords): Change from 1st to 2nd parenthesized + expression to match user name, after Jeffrey's change to the regexps. + +2001-11-29 Bill Wohler <Bill.Wohler@openwave.com> + + * mh-utils.el (mh-clean-message-header): Default is now t. + (mh-invisible-headers): Padded out to contain all the headers that + the mh-e developers don't like to see (closes SF #415759). + +2001-11-28 Bill Wohler <Bill.Wohler@openwave.com> + + * mh-comp.el (mh-rejected-letter-start): Added MIME MDN. While + this allows mh-extract-rejected-mail to strip the start of the + MDN, there is still a closing MIME marker at the end. This should + be cleaned up eventually. + +2001-11-28 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-folder-seq-tool-bar-map): New tool-bar used for + folder-mode when narrowed to sequence. + * mh-seq.el (mh-narrow-to-seq): Set tool-bar to + mh-folder-seq-tool-bar-map. + (mh-widen): Set tool-bar to mh-folder-tool-bar-map. + * widen.xpm: New icon used in mh-folder-seq-tool-bar-map. + + * mh-mime.el (mh-file-mime-type): Much better check on validity of + 'file' output. + + * mh-e.el (mh-scan-subject-regexp): New regexp variable for + subject string in folder mode. Used to extract subject sequence, + and will be used for font-lock soon. + * mh-seq.el (mh-subject-thread-to-sequence): More robust code by + using mh-scan-subject-regexp, allows users with non-standard + scan format to use subject sequences. + + * mh-comp.el (mh-letter-fill-column): Fill column to use in + mh-letter-mode. (Yes, I'm doing this in spite of what Bill said; + Someone can always undo it later) + (mh-letter-mode): setq fill-column to mh-letter-fill-column. + +2001-11-28 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-page-msg): The first time the end of page is hit, + set mh-page-to-next-msg-p to t. The second time the end of page is + hit, go to the next message. + + * mh-utils.el: (mh-show-msg): Initialize mh-page-to-next-msg-p to + nil. + +2001-11-27 Bill Wohler <wohler@newt.com> + + * mh-mime.el (mh-mime-content-types): Updated list of types to + contain types used by mh-e developers, but not including types not + listed in + http://www.isi.edu/in-notes/iana/assignments/media-types/media-types. + +2001-11-27 Peter S Galbraith <psg@debian.org> + + * mh-seq.el (mh-subject-thread-to-sequence) New function placing + all messages with similar subject line into a sequence named + 'subject. + (mh-narrow-to-subject-thread): New command to narrow to all + messages with similar subject line into a sequence named 'subject. + (mh-toggle-subject-thread): New command to toggle between a new + 'subject sequence or the wide view of a folder. + (mh-delete-subject-thread): New command to delete all following + messages with similar subject lines (leaving preceeding ones + untouched). + (mh-next-unseen-subject-thread): New command to create and move to + a new subject thread created from the next unseen message as a + starting point. + * mh-e.el (mh-folder-message-menu): New menu entries for subject + threads. + (mh-folder-mode-map): New keybindings for subject threads. + (mh-lessp): New function to sort messages. + + * mh-utils.el (mh-show-font-lock-keywords): and various + faces... scoped within eval-after-load "font-lock" to avoid + requiring font-lock to use its faces. + * mh-e.el (mh-folder-font-lock-keywords): Same. + +2001-11-27 Jeffrey C Honig <jch@honig.net> + + * mh-mime.el (mh-file-mime-type): Use mh-temp-buffer instead of + " *mh-temp". + + * mh-comp.el (mh-insert-x-mailer): Kill mh-temp-buffer after use. + +2001-11-26 Eric Ding <ericding@alum.mit.edu> + + * mh-utils.el: revert to using external mimedecode to decode + MIME quoted-printable parts + +2001-11-26 Jeffrey C Honig <jch@honig.net> + + * mh-e.el (mh-process-commands): Added mh-folder-updated-hook. + * mh-e.el (mh-update-unseen): Added mh-unseen-updated-hook. + +2001-11-26 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-file-mime-type): Make sure output from file + command is known to mailcap file, otherwise prompt the user. + (mh-mime-content-types): Add "image/png" type. + + * mh-e.el (mh-folder-font-lock-keywords): Use a bunch of new + mh-folder-*-face faces. + * mh-utils.el (mh-show-font-lock-keywords): Use a bunch of new + mh-show-*-face faces. + + * mh-utils.el (mh-letter-header-font-lock): Bug fix. Fix infinite + loop in emacs20 font-locking. + (mh-header-field-font-lock): Preventive fix with similar change. + + * mh-comp.el (mh-reply-show-message-p): Typo. diplayed -> displayed. + * MH-E-NEWS: Same. + + * mh-e.el (mh-folder-tool-bar-map): Bug fix. I had + mh-repack-folder instead of mh-pack-folder. + +2001-11-26 Bill Wohler <wohler@phone.com> + + * mh-e.el: + Updated header for consistency and to conform with (elisp)Library + Headers. + (mh-do-not-confirm): Updated documentation string to reflect + reality (e.g., is no longer used by mh-kill-folder and is used by + more functions than just mh-undo-folder). + (mh-page-msg): Now shows the next undeleted message if looking at the + bottom of the current message. + (mh-process-or-undo-commands): Fixed indentation. + + * mh-mime.el: + (mh-mhn-compose-insertion, mh-mhn-compose-anon-ftp): If MIME type + cannot be determined with file command, use mailcap-mime-types (if + available) to provide list for completing read. + + * MH-E-NEWS: First draft of mh-e 5.1 release notes. + +2001-11-26 Eric Ding <ericding@alum.mit.edu> + + * mh-utils.el (mh-decode-quoted-printable): Implement + quoted-printable decoding in elisp (starting with code copied + from FLIM). + (mh-decode-quoted-printable-region): Move (require 'hexl) outside + while loop. + (mh-decode-quoted-printable): give user a choice between using + internal code or external program to decode quoted-printable + content. Resurrect code that calls external mimedecode program. + +2001-11-25 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-highlight-citation-p): New variable to determine + whether to hightlight citations in message body with gnus, + font-lock or not at all. + (mh-show-font-lock-keywords): removed citations from keywords. + (mh-show-font-lock-keywords-with-cite): New variable, equivalent + to prior mh-show-font-lock-keywords. + (mh-gnus-article-highlight-citation): hook into gnus for + multi-level citation highlighting. + (mh-show-mode): Use either mh-show-font-lock-keywords or + mh-show-font-lock-keywords-with-cite, depending on value of + mh-highlight-citation-p, and possibly call + mh-gnus-article-highlight-citation. + * mh-comp.el (mh-letter-mode): Same as for mh-show-mode above. + +2001-11-25 Jeffrey C Honig <jch@honig.net> + + * mh-comp.el (mh-redistribute): Added mh-redist-background + variable to cause mh-redistribute to run the redist command in the + background. This causes the transaction log to be visible, like + with send. + +2001-11-25 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-inc-folder): 'inc' finishes by displaying the first + new message if already showing messages. + +2001-11-22 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-prompt-for-folder): Exit with error if no folder + specified, otherwise mh-refile-msg may try to create a folder with + empty name, and this creates problems; even mh-undo can't handle + it (Closes SF #476824). + + * mh-comp.el (mh-letter-tool-bar-map): Info button needed to + require 'info. Also tweaked help texts. + (mh-letter-menu): Use headline capitalization (Closes SF #483203). + * mh-e.el (mh-folder-tool-bar-map): Same as above. + (mh-folder-folder-menu, mh-folder-message-menu): + (mh-folder-sequence-menu): Same as above. + * mh-pick.el (mh-pick-menu): Same as above. + +2001-11-21 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-reply-show-message-p): The setting of this + variable determines whether the MH show-buffer is diplayed with + the current message when using mh-reply without a prefix argument. + Set it to nil if you already include the message automatically in + your draft using "repl: -filter repl.filter" in your ~/.mh_profile + file. + (mh-reply): Don't show message in other window if + mh-reply-show-message-p is nil. + + * mh-e.el (mh-folder-tool-bar-map): Add mail_exec.xpm icon for + mh-execute-commands. + + * mh-utils.el (mh-show-mouse): New function to click on a message + in folder-mode and show that message. + * mh-e.el (mh-folder-mode-map): Bind mh-show-mouse to mouse-2. + + * mh-e.el (mh-page-msg): Show buffer first if not displayed, + instead of simply complaining there's no other window. + + * mh-e.el (mh-folder-tool-bar-map): New tool-bar for folder mode! + (mh-folder-mode): Setup tool-bar. + + * mh-mime.el (mh-have-file-command): try to non-fatally load + executable.el because emacs20 doesn't autoload it. + * mh-utils.el (load "executable" t t): Idem. + + * mh-utils.el (mh-clean-msg-header): Bug fix. locally bind + after-change-functions to nil, working around a strange font-lock + bug in emacs20 when (add-hook 'mh-show-mode-hook 'turn-on-font-lock) + was used. + + * mh-comp.el (require 'sendmail): Moved from mh-comp.el to + mh-utils.el because it is needed in reading mail too. + (mh-header-field-end, mh-in-header-p): Moved to mh-utils.el + because they are needed by mh-show-mode's font-lock code. + Unfortunately, this splits the field related code into two files. + Perhaps it should all go into mh-utils? + +2001-11-20 Eric Ding <ericding@alum.mit.edu> + + * mh-utils.el (mh-show-from-face): Fix typo in defface + +2001-11-20 Bill Wohler <wohler@newt.com> + + * mh-utils.el (mh-mail-header-separator): Set to -------- as + defined by MH (components, and replcomps files). This variable + cannot be a regexp since it is used as an argument to insert and + is passed through regexp-quote before being used. The previous + value broke a lot of code, including mailcrypt. + + * mh-comp.el (mh-letter-mode, mh-send-letter): Insert X-Mailer + header field from mh-send-letter. + (mh-edit-again, mh-extract-rejected-mail): Call + mh-insert-header-separator to ensure that there is a separator. + Packages such as mailcrypt depend on it. + (mh-insert-header-separator): New function to insert + mh-mail-header-separator if it doesn't exist. + +2001-11-20 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-letter-mode): Make font-lock-defaults a local variable + * mh-e.el (mh-folder-mode): Same. + * mh-utils.el (mh-show-mode): Same. + + * mh-e.el (mh-scan-msg-num-regexp): Delete variable and replace + with mh-good-msg-regexp. + + * mh-utils.el (mh-mail-header-separator): Bug fix. Moved from + mh-comp.el to mh-utils.el (which mh-comp.el loads). + + * mh-comp.el (mh-in-header-p): Recycle sendmail.el code (as + suggested by Bill). + * mh-utils.el (mh-letter-header-font-lock): Use mh-in-header-p. + + * mh-comp.el (mh-letter-tool-bar-map): tool-bar customize button goes + to customizing mh-compose group. + + * mh-utils.el (mh-show-mode): font-lock bug fix. Locally set + font-lock-support-mode to nil. + (mh-letter-header-font-lock, mh-header-field-font-lock): font-lock + bug fix. Don't return match beyond font-lock search limit. + + * mh-comp.el (mh-letter-mode): Emacs20 bug fix. tool-bar-mode is + not a bound variable. + +2001-11-19 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-letter-tool-bar-map): tool-bar help button goes + to 'Draft Editing' info node. + + * mh-utils.el (mh-show-from-face, mh-show-to-face): New faces used + for font-lock. + (mh-header-to-font-lock, mh-header-cc-font-lock) + (mh-header-field-font-lock): New helper function returning whole + header field arguments to font-lock. + (mh-show-font-lock-keywords): Heavily modified using the above. + + * mh-e.el (mh-scan-msg-num-regexp): Regexp matching the message + number in scan lines. + (mh-scan-date-regexp): Regexp matching a valid date in scan lines. + (mh-scan-rcpt-addr-regexp): Regexp specifying the recipient in + scan lines for messages we sent. + (mh-scan-followup-regexp): Regexp matching a followup subject + line, starting with Re: + (mh-scan-body-regexp): + Regexp matching the message body beginning displayed in scan lines. + (mh-scan.font-lock-regexp): Regexp matching output of the the + optional scan.font-lock format file. + (mh-folder-font-lock-keywords): New font-lock for folder-mode that + uses the above regexps. + +2001-11-19 chad <y@mit.edu> + + * mh-comp.el (mh-letter-tool-bar-map): made both references to + mh-letter-tool-bar-map conditional on tool-bar-mode, instead of + just one. + +2001-11-19 Bill Wohler <wohler@newt.com> + + * mh-comp.el (mh-position-on-field): Move to the end of the header + if the field is not present. This function was documented to do + this, but wasn't doing so. + (mh-insert-x-mailer): Simplified by using existing + mh-goto-header-field and mh-insert-fields functions. Now that + mh-insert-fields is used to insert X-Mailer header field, no + longer need to include X-Mailer in mh-x-mailer-string. + +2001-11-18 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-letter-tool-bar-map): New version of + mh-letter-mode tool-bar. Changed order of buttons; made customize + and info buttons specific to mh-e. + + * mh-e.el (mh-folder-font-lock-keywords): New font-lock regexp + uses variables mh-deleted-msg-regexp, mh-refiled-msg-regexp and + mh-cur-scan-msg-regexp, so will better adapt to non-default scan + formats. Also, lines marked for refiling are now fontified. + +2001-11-18 Bill Wohler <wohler@newt.com> + + * mh-utils.el (mh-show-mode): Added local variable + mail-header-separator which is initialized to + mh-mail-header-separator. + + * mh-comp.el (mh-mail-header-separator): Updated to include ^$. + Needed when running mh-edit-again, since by then the separator is + gone. Added documentation saying one should use + mail-header-separator and initialize it from + mh-mail-header-separator. + (mh-forward): Initialize mail-header-separator since + mh-letter-mode hasn't kicked in yet (which does initialize + mail-header-separator). + (mh-letter-mode): Initialize mail-header-separator from + mh-mail-header-separator, not hard-coded string. + + * mh-comp.el (mh-insert-x-mailer-p): New variable to control + whether X-Mailer string is inserted. Default: t. + (mh-x-mailer-string): New variable that caches actual X-Mailer + string. + (mh-letter-mode): Call mh-insert-x-mailer if mh-insert-x-mailer-p + is t. + (mh-insert-x-mailer): New function that inserts X-Mailer header + field. + +2001-11-17 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-letter-header-font-lock): New function to return + the entire mail header to font-lock for sedate font-locking. + (mh-show-font-lock-keywords): Modified to fontify whole lines and use + mh-letter-header-font-lock above to fontify whole header. + +2001-11-17 Bill Wohler <wohler@newt.com> + + * mh-comp.el (mail-header-separator): Added ^ and $ to make more + specific. + (mh-forward, mh-letter-mode): Replaced hard-coded string with + mail-header-separator. + +2001-11-16 Bill Wohler <wohler@newt.com> + + * mh-e.el (mh-e-RCS-id): Renamed to mh-version. + (mh-version): The variable: Set to a number instead of Id since + the Id didn't have the mh-e version number, and both Emacs and + gnus do it this way too. + (mh-version): The function: Fixed for nmh. Now displays mh-e + version correctly. Cleaned up output and display mh-progs, etc. + (Closes SF #405620.) + +2001-11-15 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-letter-tool-bar-map): New tool-bar support for + mh-letter-mode in emacs21. Uses icons from gnus/message.el. + * mh-comp.el (mh-letter-mode): Add buffer-local binding of + tool-bar-map to mh-letter-tool-bar-map. + +2001-11-15 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-have-file-command): Add check for existence of + executable-find command, which Jeffrey didn't exist in emacs-20.4. + * mh-utils.el (mh-decode-quoted-printable-have-mimedecode): same + as above. + * mh-mime.el (mh-file-mime-type): Bug Fix. Some versions of + 'file' output a string like "file: Using regular magic file..." + to stderr, so discard stderr when using call-process with 'file'. + +2001-11-14 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-have-file-command): Check if 'file' command on + system accepts arguments -i -b before accepting it for our use. + +2001-11-14 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-find-progs): Use expand-file-name instead of + concatenating together strings into a path. + +2001-11-14 Peter S Galbraith <psg@debian.org> + + * mh-e.el (mh-folder-sequence-menu): Enable mh-widen in sequence + menu only when mh-narrowed-to-seq is t. + +2001-11-14 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-have-file-command): Use 'executable-find' instead + of more complicated and error-prone call-process to which command. + * mh-utils.el (mh-decode-quoted-printable-have-mimedecode): Same + change as above. + +2001-11-14 Jeffrey C Honig <jch@honig.net> + + * mh-e.el (mh-make-folder-mode-line): Bug fix. Properly deal with + folders that do not have any lines in them. Print "no msgs" + instead of "0 msgs". Do not try to print a range when there are + no messages. + * mh-e.el (mh-regenerate-headers): Bug fix. Catch and remove the + "scan: band message list" message. + +2001-11-13 Jeffrey C Honig <jch@honig.net> + + * mh-utils.el (mh-find-progs): Bug fix. Add "mh/etc" to the + subdirectories to search for "components". On BSD/OS, nmh is in + "/usr/contrib/mh/*". + +2001-11-13 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-letter-mode): Bug fix. Load mh-mime before + setting mh-mhn-compose-insert-p (when looking at a "forw: -mime" + message containing a MIME composition) such that the variable is + properly declared as buffer-local. + +2001-11-12 Bill Wohler <wohler@newt.com> + + * mh-funcs.el (mh-print-msg): mhl is in the mh-lib-progs + directory, not mh-lib (closes SF #481128). + +2001-11-12 Peter S Galbraith <psg@debian.org> + + * mh-seq.el (mh-widen): Bug fix (closes SF #481036). + In a sequence with pending deletes and refiles, running mh-widen + would wipe out their notations, even though the sequences are still + defined. Fixed by calling a new function, + mh-notate-deleted-and-refiled. Also changed the coping of + mh-goto-msg-num since it didn't work consistently. + * mh-seq.el (mh-notate-deleted-and-refiled): New functions written + to fix above mh-widen bug. It's a first cut, we may want to clear + all notations first, and notate the current-message sequence and + user sequences. Time will tell. + +2001-11-12 Peter S Galbraith <psg@debian.org> + + * mh-seq.el (mh-widen): Make it attempt to stay on the same + message number (closes SF bug #480922). + +2001-11-11 Bill Wohler <wohler@newt.com> + + * import-emacs: New shell script to import Emacs changes to mh-e. + + * Makefile (import): New target to import Emacs changes. + +2001-11-09 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-file-mime-type): Bug fix. Change regexp to + extract mime type from 'file -i' command output. + +2001-11-08 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-update-sequences-after-mh-show): + New customizable variable telling whether to run + mh-update-sequences in mh-show-mode. Default is t. + * mh-utils.el (mh-show-msg): Run mh-update-sequences when + mh-update-sequences-after-mh-show is set. + +2001-11-08 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-decode-quoted-printable-have-mimedecode): + New variable telling whether command 'mimedecode' is on system. + (http://www.freesoft.org/CIE/FAQ/mimedeco.c) + * mh-utils.el (mh-decode-quoted-printable): + New customizable variable telling whether to run mimedecode on + MIME message containing quoted-printable parts. mimedecode will + only alter quoted-printable parts , leaving others intact, and the + resulting message is still fully MIME. + * mh-utils.el (mh-decode-quoted-printable): New function to run + mimedecode on the current buffer. + * mh-utils.el (mh-display-msg): Conditionnaly call + mh-decode-quoted-printable function if mh-decode-quoted-printable + variable is set, to view messages containing quoted-printable + characters into 8-bit. + +2001-11-08 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-letter-mode): Set mh-mhn-compose-insert-p if + looking at a "forw: -mime" message containing a MIME composition. + * mh-mime.el (mh-file-mime-type): Bug fix. Failed on files like + "~/.mh_profile" because of shell construct. Wrapped filename with + expand-file-name. + * mh-comp.el (mh-letter-mode-map): C-cC-o keybinding in + mh-letter-mode-map for mh-open-line. + +2001-11-07 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-open-line): New user function to split open a line + when editing a reply with included text. + * mh-comp.el (mh-current-fill-prefix): New function used by + mh-open-line to get the fill-prefix on the current line. + * mh-comp.el: Add mh-open-line to mh-letter-mode menubar. + +2001-11-06 Peter S Galbraith <psg@debian.org> + + * mh-seq.el (mh-region-to-sequence): New function, creating a + sequence named 'region containing the message list in the selected + region. + * mh-e.el (mh-delete-msg): Mark messages in region for deletion if + mark is active and in transient-mark-mode. + * mh-e.el (mh-refile-msg): Mark messages in region for refiling if + mark is active and in transient-mark-mode. + * mh-e.el (mh-undo): Undo message marks for refile or deletion if + region if mark is active and in transient-mark-mode. + +2001-11-06 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-letter-mode): Use sendmail.el's fill-paragraph. + Copy its settings for paragraph-start, paragraph-separate, + fill-paragraph-function, adaptive-fill-regexp and + adaptive-fill-first-line-regexp. This make M-q (fill-paragraph) + work correctly! + +2001-11-05 Peter S Galbraith <psg@debian.org> + + * mh-funcs.el (mh-kill-folder): Remove mh-do-not-confirm condition + and always prompt the user for such a drastic step. Also change + the prompt a bit to clarify it. + +2001-11-04 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-mhn-compose-insert-p): New buffer-local variable + to tell when a MIME insertion was done in a letter. + * mh-mime.el (mh-mhn-compose-type): Set mh-mhn-compose-insert-p. + * mh-mime.el (mh-mhn-compose-external-type): + Set mh-mhn-compose-insert-p. + * mh-mime.el (mh-mhn-compose-forw): Set mh-mhn-compose-insert-p. + * mh-mime.el (mh-edit-mhn): Clear mh-mhn-compose-insert-p. + * mh-comp.el (mh-send-letter): Run mh-edit-mhn when + mh-mhn-compose-insert-p is set. + +2001-11-03 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-have-file-command): new function testing whether + file command is on the system. + * mh-mime.el (mh-file-mime-type): new function returning MIME type + from file command. + * mh-mime.el (mh-mhn-compose-insertion): Make use of + mh-file-mime-type function instead of prompting. + +2001-10-30 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-show-use-goto-addr): defcustom this new + variable, determining whether to call goto-addr in mh-show-mode. + * mh-utils.el (mh-show-mode): Call goto-address when + mh-show-use-goto-addr is t. + +2001-10-25 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-recenter): Clarify docs and change '(t) to + (list 4) to match elisp doc on what C-u prefix argument actually is. + +2001-10-23 Peter S Galbraith <psg@debian.org> + + * mh-utils.el (mh-summary-height): In my quest to make mh-e more + useful out-of-the-box for new users, set mh-summary-height to a + minimum of 4 and a maximum of 10 depending on frame height. I + typically have 70 lines in my Emacs frame, so having a default of + 4 was silly for my case. + * mh-e.el (mh-update-sequences): Check for nil value of + mh-current-folder, which happens if mh-summary-height < 4 + although I haven't tracked doen why that happens. + +2001-10-22 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-insert-fields): Test for nil value when inserting + field. + +2001-10-20 Peter S Galbraith <psg@debian.org> + + * mh-comp.el (mh-user-agent-compose): Merged-in from XEmacs-21.4 source + * mh-comp.el (mh-letter-mode): Add easy-menu-add statement for XEmacs21 + * mh-pick.el (mh-pick-mode): Add easy-menu-add statement for XEmacs21. + * mh-e.el (mh-folder-mode): Add easy-menu-add statements for XEmacs21. + * mh-utils.el: defalias 'screen-height to 'frame-height for XEmacs21. + +2001-10-19 Peter S Galbraith <psg@debian.org> + + * mh-mime.el (mh-edit-mhn): Use mhbuild in nmh context. + * mh-utils.el (mh-find-progs): The variable mh-nmh-p (t when nmh + is in use rather than MH) was set assuming that the string "nmh" + will be in mh-lib-progs or mh-lib. This failed on Debian systems. + Better to check for the existence of mhbuild in directory mh-progs. + (closes SF bug #441776) + +2001-10-18 Peter S Galbraith <psg@debian.org> + + * mh-e.el: Add menubar entry from contrib/mh-menubar.el + * mh-comp.el: Add menubar entry from contrib/mh-menubar.el + * mh-pick.el: Add menubar entry from contrib/mh-menubar.el + +2001-07-30 Peter S Galbraith <psg@debian.org> + + * mh-e.el: Change font-lock patterns for folders. + Fontify scan.font-lock patterns (which will be documented) + and fontify subject lines prefixed with "Re:" differently. + * mh-comp.el (mh-letter-mode): Add font-lock support as in + mh-show-mode. + +2001-04-14 chad brown <y@mit.edu> + + * rearrange the font-lock keywords a bit + +2001-04-12 chad brown <y@mit.edu> + + * preliminary (somewhat boring) font-lock support for mh-e. More + interesting font-lock support probably wants to have better + support for multiple format files + +2001-02-24 chad brown <y@mit.edu> + + * add default nmh paths to mh-find-prog in mh-utils.el. + change to mh-kill-folder in mh-funcs.el to make it more general. + +2001-02-19 Bill Wohler <wohler@newt.com> + + * Makefile (EMACS): Renamed to EMACS_HOME. Also, don't define if + EMACS_HOME already exists to give developer a chance to set + environment variable. + (install): $MH-E-SRC is copied to $(EMACS_HOME)/lisp/mail, not + $(EMACS_HOME)/src. + (dist): Leave release in current directory. diff --git a/lisp/mh-e/mh-alias.el b/lisp/mh-e/mh-alias.el index b9f144fae02..0e45edf288a 100644 --- a/lisp/mh-e/mh-alias.el +++ b/lisp/mh-e/mh-alias.el @@ -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)) (t (split-string - (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)))))))) +;;;###mh-autoload (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 (function (lambda (alias) @@ -501,7 +505,7 @@ after it." ((string-match "^a" answer) (forward-line 1)) (t - error "Quitting.")))) + (error "Quitting"))))) ;; No, so sort-in at the right place ;; search for "^alias", then "^alia", etc. ((eq mh-alias-insertion-location 'sorted) diff --git a/lisp/mh-e/mh-comp.el b/lisp/mh-e/mh-comp.el index 36c314e6588..20e7ecf4ee9 100644 --- a/lisp/mh-e/mh-comp.el +++ b/lisp/mh-e/mh-comp.el @@ -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 buffer-file-name @@ -1038,12 +1038,18 @@ called, with no arguments, before the signature is actually inserted." (let ((file-name buffer-file-name)) (save-buffer) (message "Checking recipients...") - (mh-in-show-buffer ("*Recipients*") + (mh-in-show-buffer (mh-recipients-buffer) (bury-buffer (current-buffer)) (erase-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) (save-window-excursion - (mh-version) - (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 - "XEmacs" - "Emacs") - 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))) + (mh-version) + (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]+\)\\)?" + emacs-version) + (match-string 0 emacs-version)) + (t (format "%s.%s" + emacs-major-version + emacs-minor-version)))))) + (if (not info-buffer-exists-p) + (kill-buffer mh-info-buffer))))) ;; Insert X-Mailer, but only if it doesn't already exist. (save-excursion (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}")) + (mh-logo-display) + (add-hook 'kill-buffer-hook 'mh-tidy-draft-buffer nil t) (if (and (boundp 'mh-compose-letter-function) 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 (t - (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 diff --git a/lisp/mh-e/mh-customize.el b/lisp/mh-e/mh-customize.el index ccda1a8b192..9bc67afcfa3 100644 --- a/lisp/mh-e/mh-customize.el +++ b/lisp/mh-e/mh-customize.el @@ -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) ;;;###mh-autoload -(defun mh-customize () - "Customize MH-E variables." - (interactive) - (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 + (delete-other-windows))) ;;; 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 () (interactive) - (customize-group "mh")) + (mh-customize t)) 'mh-showtoolbar-customize :help mh-tool-bar-item-prefs)) (if (member mh-tool-bar-item-help mh-tool-bar-folder-buttons) (tool-bar-add-item "help" (lambda () (interactive) - (Info-goto-node "(mh-e)Top")) + (Info-goto-node "(mh-e)Top") + (delete-other-windows)) 'mh-showtoolbar-help :help mh-tool-bar-item-help)) tool-bar-map)))) @@ -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 () (interactive) - (customize-group "mh-compose")) + (mh-customize t)) 'mh-lettertoolbar-customize :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 () (interactive) - (Info-goto-node "(mh-e)Draft Editing")) + (Info-goto-node "(mh-e)Draft Editing") + (delete-other-windows)) 'mh-lettertoolbar-help :help mh-tool-bar-item-help)) tool-bar-map)))) @@ -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 () (interactive) - (customize-group "mh")) + (mh-customize t)) 'mh-foldertoolbar-customize :help mh-tool-bar-item-prefs)) (if (member mh-tool-bar-item-help mh-tool-bar-folder-buttons) (tool-bar-add-item "help" (lambda () (interactive) - (Info-goto-node "(mh-e)Top")) + (Info-goto-node "(mh-e)Top") + (delete-other-windows)) 'mh-foldertoolbar-help :help mh-tool-bar-item-help)) tool-bar-map)) @@ -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 -referenced." +(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 +information." + :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 +information." :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 +information." + :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 -http://www.freesoft.org/CIE/FAQ/mimedeco.c." +The `mimencode' program is part of the metamail package. The source can be +obtained from + ftp://thumper.bellcore.com/pub/nsb/" :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 (concat "^" - (let ((max-specpdl-size 1000)) ;workaround for insufficient default - (regexp-opt - (append - (if (not mh-show-use-xface-flag) - '("X-Face: ")) - mh-invisible-header-fields)))))) + (let ((max-specpdl-size 1000) ;workaround for insufficient default + (fields (append (if (not mh-show-use-xface-flag) + '("X-Face: ")) + mh-invisible-header-fields))) + (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-Message-Id" + "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 '(radio) - (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) + + ;;; Faces used in scan listing (:group mh-folder-faces) (defvar mh-folder-body-face 'mh-folder-body-face @@ -1656,6 +1705,8 @@ will be removed from the unseen sequence." "Face for highlighting the To: string in MH-Folder buffers." :group 'mh-folder-faces) + + ;;; Faces used in message display (:group mh-show-faces) (defvar mh-show-cc-face 'mh-show-cc-face @@ -1727,6 +1778,8 @@ will be removed from the unseen sequence." "Face for highlighting the Subject header field.") (copy-face 'mh-folder-subject-face 'mh-show-subject-face) + + ;;; Faces used in indexed searches (:group mh-index-faces) (defvar mh-index-folder-face 'mh-index-folder-face @@ -1741,8 +1794,6 @@ will be removed from the unseen sequence." "Face for highlighting folders in MH-Index buffers." :group 'mh-index-faces) -(provide 'mh-customize) - ;;; Local Variables: ;;; indent-tabs-mode: nil ;;; sentence-end-double-space: nil diff --git a/lisp/mh-e/mh-e.el b/lisp/mh-e/mh-e.el index 8b8d2e11531..c51d6aa4b8e 100644 --- a/lisp/mh-e/mh-e.el +++ b/lisp/mh-e/mh-e.el @@ -4,7 +4,7 @@ ;; Author: Bill Wohler <wohler@newt.com> ;; Maintainer: Bill Wohler <wohler@newt.com> -;; Version: 7.1 +;; Version: 7.2 ;; Keywords: mail ;; This file is part of GNU Emacs. @@ -79,7 +79,7 @@ ;; Maintenance picked up by Bill Wohler <wohler@newt.com> and the ;; SourceForge Crew <http://mh-e.sourceforge.net/>. 2001. -;; $Id: mh-e.el,v 1.34 2003/01/08 23:21:16 wohler Exp $ +;; $Id: mh-e.el,v 1.262 2003/02/03 19:11:43 wohler Exp $ ;;; Code: @@ -102,7 +102,7 @@ (defvar font-lock-auto-fontify) (defvar font-lock-defaults) -(defconst mh-version "7.1" "Version number of MH-E.") +(defconst mh-version "7.2" "Version number of MH-E.") ;;; Autoloads (autoload 'Info-goto-node "info") @@ -457,6 +457,8 @@ is done highlighting.") (defvar mh-folder-mode-map (make-keymap) "Keymap for MH folders.") +(defvar mh-arrow-marker nil) ;Marker for arrow display in fringe. + (defvar mh-delete-list nil) ;List of msg numbers to delete. (defvar mh-refile-list nil) ;List of folder names in mh-seq-list. @@ -512,6 +514,8 @@ the Emacs front end to the MH mail system." (mh-find-path) (if arg (call-interactively 'mh-visit-folder) + (unless (get-buffer mh-inbox) + (mh-visit-folder mh-inbox (symbol-name mh-unseen-seq))) (mh-inc-folder))) ;;;###autoload @@ -537,11 +541,11 @@ prompt for the message sequence. If variable `transient-mark-mode' is non-nil and the mark is active, then the selected region is marked for deletion." (interactive (list (cond ((mh-mark-active-p t) - (mh-region-to-msg-list (region-beginning) (region-end))) + (cons (region-beginning) (region-end))) (current-prefix-arg (mh-read-seq-default "Delete" t)) (t - (mh-get-msg-num t))))) + (cons (line-beginning-position) (line-end-position)))))) (mh-delete-msg-no-motion msg-or-seq) (mh-next-msg)) @@ -552,9 +556,13 @@ then prompt for the message sequence." (interactive (list (if current-prefix-arg (mh-read-seq-default "Delete" t) (mh-get-msg-num t)))) - (if (numberp msg-or-seq) - (mh-delete-a-msg msg-or-seq) - (mh-map-to-seq-msgs 'mh-delete-a-msg msg-or-seq))) + (cond ((numberp msg-or-seq) + (mh-delete-a-msg msg-or-seq)) + ((and (consp msg-or-seq) + (numberp (car msg-or-seq)) (numberp (cdr msg-or-seq))) + (mh-iterate-on-messages-in-region () (car msg-or-seq) (cdr msg-or-seq) + (mh-delete-a-msg nil))) + (t (mh-map-to-seq-msgs 'mh-delete-a-msg msg-or-seq)))) (defun mh-execute-commands () "Process outstanding delete and refile requests." @@ -585,6 +593,7 @@ Type \"\\[mh-show]\" to show the message normally again." (mh-invalidate-show-buffer)) (let ((mh-decode-mime-flag nil) (mhl-formfile nil) + (mh-decode-content-transfer-encoded-message-flag nil) (mh-clean-message-header-flag nil)) (mh-show-msg nil) (mh-in-show-buffer (mh-show-buffer) @@ -645,6 +654,62 @@ Do not call this function from outside MH-E; use \\[mh-rmail] instead." (t (forward-line -1) (message "No more undeleted messages")))) +(defun mh-folder-from-address () + "Determine folder name from address in From field. +Takes the address in the From: header field, and returns one of: + + a) The folder name associated with the address in the alist + `mh-default-folder-list'. + + b) The address' corresponding alias from the user's personal + aliases file prefixed by `mh-default-folder-prefix'. + +Returns nil if the address was not found in either place or if the variable +`mh-default-folder-must-exist-flag' is nil and the folder does not exist." + ;; Is address in mh-default-folder-list? + (let* ((address + (nth 1 (mail-extract-address-components + (mh-extract-from-header-value)))) + (folder-name + (nth 1 (assoc-ignore-case address mh-default-folder-list)))) + + ;; If not, is there an alias for the address? + (if (not folder-name) + (let* ((alias (mh-alias-address-to-alias address))) + (setq folder-name + (and alias (concat "+" mh-default-folder-prefix alias))))) + + ;; If mh-default-folder-must-exist-flag set, check that folder exists. + (if (and folder-name + (or (not mh-default-folder-must-exist-flag) + (file-exists-p (mh-expand-file-name folder-name)))) + folder-name))) + +(defun mh-prompt-for-refile-folder () + "Prompt the user for a folder in which the message should be filed. +The folder is returned as a string. + +If `mh-default-folder-for-message-function' is a function then the message +being refiled is yanked into a temporary buffer and the function is called to +intelligently guess where the message is to be refiled. + +Otherwise, a default folder name is generated by `mh-folder-from-address'." + (mh-prompt-for-folder + "Destination" + (let ((refile-file (mh-msg-filename (mh-get-msg-num t)))) + (save-excursion + (set-buffer (get-buffer-create mh-temp-buffer)) + (erase-buffer) + (insert-file-contents refile-file) + (or (and mh-default-folder-for-message-function + (let ((buffer-file-name refile-file)) + (funcall mh-default-folder-for-message-function))) + (mh-folder-from-address) + (and (eq 'refile (car mh-last-destination-folder)) + (symbol-name (cdr mh-last-destination-folder))) + ""))) + t)) + (defun mh-refile-msg (msg-or-seq folder) "Refile MSG-OR-SEQ (default: displayed message) into FOLDER. If optional prefix argument provided, then prompt for message sequence. @@ -653,31 +718,21 @@ selected region is marked for refiling." (interactive (list (cond ((mh-mark-active-p t) - (mh-region-to-msg-list (region-beginning) (region-end))) + (cons (region-beginning) (region-end))) (current-prefix-arg (mh-read-seq-default "Refile" t)) (t - (mh-get-msg-num t))) - (intern - (mh-prompt-for-folder - "Destination" - (or (and mh-default-folder-for-message-function - (let ((refile-file (mh-msg-filename (mh-get-msg-num t)))) - (save-excursion - (set-buffer (get-buffer-create mh-temp-buffer)) - (erase-buffer) - (insert-file-contents refile-file) - (let ((buffer-file-name refile-file)) - (funcall mh-default-folder-for-message-function))))) - (and (eq 'refile (car mh-last-destination-folder)) - (symbol-name (cdr mh-last-destination-folder))) - "") - t)))) + (cons (line-beginning-position) (line-end-position)))) + (intern (mh-prompt-for-refile-folder)))) (setq mh-last-destination (cons 'refile folder) mh-last-destination-folder mh-last-destination) - (if (numberp msg-or-seq) - (mh-refile-a-msg msg-or-seq folder) - (mh-map-to-seq-msgs 'mh-refile-a-msg msg-or-seq folder)) + (cond ((numberp msg-or-seq) + (mh-refile-a-msg msg-or-seq folder)) + ((and (consp msg-or-seq) + (numberp (car msg-or-seq)) (numberp (cdr msg-or-seq))) + (mh-iterate-on-messages-in-region () (car msg-or-seq) (cdr msg-or-seq) + (mh-refile-a-msg nil folder))) + (t (mh-map-to-seq-msgs 'mh-refile-a-msg msg-or-seq folder))) (mh-next-msg)) (defun mh-refile-or-write-again (message) @@ -701,7 +756,9 @@ Restore the previous window configuration, if one exists. The value of `mh-before-quit-hook' is a list of functions to be called, with no arguments, immediately upon entry to this function. The value of `mh-quit-hook' is a list of functions to be called, with no -arguments, upon exit of this function." +arguments, upon exit of this function. +MH-E working buffers (whose name begins with \" *mh-\" or \"*MH-E \") are +killed." (interactive) (run-hooks 'mh-before-quit-hook) (let ((show-buffer (get-buffer mh-show-buffer))) @@ -710,12 +767,13 @@ arguments, upon exit of this function." (mh-update-sequences) (mh-destroy-postponed-handles) (bury-buffer (current-buffer)) - (if (get-buffer mh-temp-buffer) - (kill-buffer mh-temp-buffer)) - (if (get-buffer mh-temp-folders-buffer) - (kill-buffer mh-temp-folders-buffer)) - (if (get-buffer mh-temp-sequences-buffer) - (kill-buffer mh-temp-sequences-buffer)) + + ;; Delete all MH-E temporary and working buffers. + (dolist (buffer (buffer-list)) + (when (or (string-match "^ \\*mh-" (buffer-name buffer)) + (string-match "^\\*MH-E " (buffer-name buffer))) + (kill-buffer buffer))) + (if mh-previous-window-config (set-window-configuration mh-previous-window-config)) (run-hooks 'mh-quit-hook)) @@ -985,7 +1043,7 @@ If variable `transient-mark-mode' is non-nil and the mark is active, then the selected region is unmarked." (interactive (list (cond ((mh-mark-active-p t) - (mh-region-to-msg-list (region-beginning) (region-end))) + (cons (region-beginning) (region-end))) (current-prefix-arg (mh-read-seq-default "Undo" t)) (t @@ -1006,6 +1064,10 @@ selected region is unmarked." (mh-maybe-show)) (goto-char original-position) (error "Nothing to undo")))) + ((and (consp msg-or-seq) + (numberp (car msg-or-seq)) (numberp (cdr msg-or-seq))) + (mh-iterate-on-messages-in-region () (car msg-or-seq) (cdr msg-or-seq) + (mh-undo-msg nil))) (t (mh-map-to-seq-msgs 'mh-undo-msg msg-or-seq))) (if (not (mh-outstanding-commands-p)) @@ -1045,7 +1107,7 @@ compiled then macro expansion happens at compile time." "Display version information about MH-E and the MH mail handling system." (interactive) (mh-find-progs) - (set-buffer (get-buffer-create mh-temp-buffer)) + (set-buffer (get-buffer-create mh-info-buffer)) (erase-buffer) ;; MH-E version. (insert "MH-E " mh-version "\n\n") @@ -1079,10 +1141,13 @@ compiled then macro expansion happens at compile time." (call-process "uname" nil t nil "-a") (file-error)) (goto-char (point-min)) - (display-buffer mh-temp-buffer)) + (display-buffer mh-info-buffer)) -(defun mh-parse-flist-output-line (line) - "Parse LINE to generate folder name, unseen messages and total messages." +(defun mh-parse-flist-output-line (line &optional current-folder) + "Parse LINE to generate folder name, unseen messages and total messages. +If CURRENT-FOLDER is non-nil then it contains the current folder name and it is +used to avoid problems in corner cases involving folders whose names end with a +'+' character." (with-temp-buffer (insert line) (goto-char (point-max)) @@ -1096,23 +1161,24 @@ compiled then macro expansion happens at compile time." (when (search-backward " has " (point-min) t) (setq unseen (read-from-string (buffer-substring-no-properties (match-end 0) p))) - (while (or (eq (char-after) ?+) (eq (char-after) ? )) + (while (eq (char-after) ? ) (backward-char)) (setq folder (buffer-substring-no-properties (point-min) (1+ (point)))) + (when (and (equal (aref folder (1- (length folder))) ?+) + (equal current-folder folder)) + (setq folder (substring folder 0 (1- (length folder))))) (values (format "+%s" folder) (car unseen) (car total)))))))) (defun mh-folder-size (folder) "Find size of FOLDER." (with-temp-buffer (call-process (expand-file-name "flist" mh-progs) nil t nil - "-norecurse" folder) + "-norecurse" folder "-sequence" (symbol-name mh-unseen-seq)) (goto-char (point-min)) (multiple-value-bind (folder1 unseen total) (mh-parse-flist-output-line (buffer-substring (point) (line-end-position))) - (unless (equal folder folder1) - (error "Call to flist failed on folder %s" folder)) (values total unseen)))) (defun mh-visit-folder (folder &optional range index-data) @@ -1123,9 +1189,13 @@ If RANGE is nil (the default if it is omitted when called non-interactively), then all messages in FOLDER are displayed. If an index buffer is being created then INDEX-DATA is used to initialize the -index buffer specific data structures." +index buffer specific data structures. + +A prefix argument will cause a prompt for the RANGE of messages +regardless of the size of the `mh-large-folder' variable." (interactive (let ((folder-name (mh-prompt-for-folder "Visit" mh-inbox t))) - (list folder-name (mh-read-msg-range folder-name)))) + (list folder-name + (mh-read-msg-range folder-name current-prefix-arg)))) (let ((config (current-window-configuration)) (threaded-view-flag mh-show-threads-flag)) (save-excursion @@ -1171,7 +1241,7 @@ Flush MH-E's state out to MH. The message at the cursor becomes current." (mh-define-sequence 'cur (list new-cur)) (beginning-of-line) (if (looking-at mh-scan-good-msg-regexp) - (mh-notate nil mh-note-cur mh-cmd-note))) + (mh-notate-cur))) (or folder-set (save-excursion ;; psg - mh-current-folder is nil if mh-summary-height < 4 ! @@ -1186,26 +1256,36 @@ Flush MH-E's state out to MH. The message at the cursor becomes current." (defun mh-delete-a-msg (msg) "Delete the MSG. +If MSG is nil then the message at point is deleted. + The value of `mh-delete-msg-hook' is a list of functions to be called, with no arguments, after the message has been deleted." (save-excursion - (mh-goto-msg msg nil t) + (if (numberp msg) + (mh-goto-msg msg nil t) + (beginning-of-line) + (setq msg (mh-get-msg-num t))) (if (looking-at mh-scan-refiled-msg-regexp) (error "Message %d is refiled. Undo refile before deleting" msg)) (if (looking-at mh-scan-deleted-msg-regexp) nil (mh-set-folder-modified-p t) (setq mh-delete-list (cons msg mh-delete-list)) - (mh-notate msg mh-note-deleted mh-cmd-note) + (mh-notate nil mh-note-deleted mh-cmd-note) (run-hooks 'mh-delete-msg-hook)))) (defun mh-refile-a-msg (msg folder) "Refile MSG in FOLDER. +If MSG is nil then the message at point is refiled. + Folder is a symbol, not a string. The value of `mh-refile-msg-hook' is a list of functions to be called, with no arguments, after the message has been refiled." (save-excursion - (mh-goto-msg msg nil t) + (if (numberp msg) + (mh-goto-msg msg nil t) + (beginning-of-line) + (setq msg (mh-get-msg-num t))) (cond ((looking-at mh-scan-deleted-msg-regexp) (error "Message %d is deleted. Undo delete before moving" msg)) ((looking-at mh-scan-refiled-msg-regexp) @@ -1222,7 +1302,7 @@ arguments, after the message has been refiled." (push (list folder msg) mh-refile-list)) ((not (member msg (cdr (assoc folder mh-refile-list)))) (push msg (cdr (assoc folder mh-refile-list))))) - (mh-notate msg mh-note-refiled mh-cmd-note) + (mh-notate nil mh-note-refiled mh-cmd-note) (run-hooks 'mh-refile-msg-hook))))) (defun mh-next-msg () @@ -1271,15 +1351,21 @@ With optional argument COUNT, COUNT-1 unread messages are skipped." (mh-recenter nil))) (defun mh-undo-msg (msg) - "Undo the deletion or refile of one MSG." - (cond ((memq msg mh-delete-list) - (setq mh-delete-list (delq msg mh-delete-list))) - (t - (dolist (folder-msg-list mh-refile-list) - (setf (cdr folder-msg-list) (remove msg (cdr folder-msg-list)))) - (setq mh-refile-list (loop for x in mh-refile-list - unless (null (cdr x)) collect x)))) - (mh-notate msg ? mh-cmd-note)) + "Undo the deletion or refile of one MSG. +If MSG is nil then act on the message at point" + (save-excursion + (if (numberp msg) + (mh-goto-msg msg t t) + (beginning-of-line) + (setq msg (mh-get-msg-num t))) + (cond ((memq msg mh-delete-list) + (setq mh-delete-list (delq msg mh-delete-list))) + (t + (dolist (folder-msg-list mh-refile-list) + (setf (cdr folder-msg-list) (remove msg (cdr folder-msg-list)))) + (setq mh-refile-list (loop for x in mh-refile-list + unless (null (cdr x)) collect x)))) + (mh-notate nil ? mh-cmd-note))) @@ -1423,6 +1509,9 @@ When a folder is visited, the hook `mh-folder-mode-hook' is run. 'mh-show-buffer (format "show-%s" (buffer-name)) ; Buffer that displays msgs 'mh-folder-filename ; e.g. "/usr/foobar/Mail/inbox/" (file-name-as-directory (mh-expand-file-name (buffer-name))) + 'mh-arrow-marker (make-marker) ; Marker where arrow is displayed + 'overlay-arrow-position nil ; Allow for simultaneous display in + 'overlay-arrow-string ">" ; different MH-E buffers. 'mh-showing-mode nil ; Show message also? 'mh-delete-list nil ; List of msgs nums to delete 'mh-refile-list nil ; List of folder names in mh-seq-list @@ -1489,15 +1578,8 @@ Return in the folder's buffer." (message "Folder %s is empty" folder) (message "No messages in %s, range %s" folder range)) (mh-goto-cur-msg)) - (save-excursion - (when dont-exec-pending - ;; Re-annotate messages to be refiled... - (dolist (folder-msg-list mh-refile-list) - (dolist (msg (cdr folder-msg-list)) - (mh-notate msg mh-note-refiled mh-cmd-note))) - ;; Re-annotate messages to be deleted... - (dolist (msg mh-delete-list) - (mh-notate msg mh-note-deleted mh-cmd-note))))) + (when dont-exec-pending + (mh-notate-deleted-and-refiled))) (defun mh-set-cmd-note (width) "Set `mh-cmd-note' to WIDTH characters (minimum of 2). @@ -1655,7 +1737,7 @@ Return in the current buffer." (keep-lines mh-scan-valid-regexp) ; Flush random scan lines (setq mh-seq-list (mh-read-folder-sequences folder t)) (when (equal (point-max) start-of-inc) - (mh-notate-seq 'cur mh-note-cur mh-cmd-note)) + (mh-notate-cur)) (mh-notate-user-sequences) (if new-mail-flag (progn @@ -1689,7 +1771,7 @@ in what is now stored in the buffer-local variable `mh-mode-line-annotation'." (count-lines (point-min) (point-max)) 0)) (setq mode-line-buffer-identification - (list (format "{%%b%s} %s msg%s" + (list (format " {%%b%s} %s msg%s" (if mh-mode-line-annotation (format "/%s" mh-mode-line-annotation) "") @@ -1703,7 +1785,8 @@ in what is now stored in the buffer-local variable `mh-mode-line-annotation'." mh-last-msg-num)) (mh-first-msg-num (format " (%d)" mh-first-msg-num)) - (""))))))))) + ("")))))) + (mh-logo-display)))) (defun mh-unmark-all-headers (remove-all-flags) "Remove all '+' flags from the folder listing. @@ -1737,14 +1820,16 @@ Optimized for speed (i.e., no regular expressions)." "Remove old cur notation." (let ((cur-msg (car (mh-seq-to-msgs 'cur)))) (save-excursion - (and cur-msg - (mh-goto-msg cur-msg t t) - (looking-at mh-scan-cur-msg-number-regexp) - (mh-notate nil ? mh-cmd-note))))) + (when (and cur-msg + (mh-goto-msg cur-msg t t) + (looking-at mh-scan-cur-msg-number-regexp)) + (mh-notate nil ? mh-cmd-note) + (setq overlay-arrow-position nil))))) (defun mh-remove-all-notation () "Remove all notations on all scan lines that MH-E introduces." (save-excursion + (setq overlay-arrow-position nil) (goto-char (point-min)) (while (not (eobp)) (unless (or (equal (char-after) ?+) (eolp)) @@ -1762,10 +1847,11 @@ recenter the folder buffer." (cond ((and cur-msg (mh-goto-msg cur-msg t t)) (unless minimal-changes-flag - (mh-notate nil mh-note-cur mh-cmd-note) + (mh-notate-cur) (mh-recenter 0) (mh-maybe-show cur-msg))) (t + (setq overlay-arrow-position nil) (message "No current message"))))) (defun mh-process-or-undo-commands (folder) @@ -1976,12 +2062,14 @@ Expands ranges into set of individual numbers." (defun mh-notate-user-sequences () "Mark the scan listing of all messages in user-defined sequences." (let ((seqs mh-seq-list) - name) - (while seqs - (setq name (mh-seq-name (car seqs))) - (if (not (mh-internal-seq name)) - (mh-notate-seq name mh-note-seq (1+ mh-cmd-note))) - (setq seqs (cdr seqs))))) + (msg-hash (make-hash-table))) + (dolist (seq seqs) + (unless (mh-internal-seq (mh-seq-name seq)) + (dolist (msg (mh-seq-msgs seq)) + (setf (gethash msg msg-hash) t)))) + (mh-iterate-on-messages-in-region msg (point-min) (point-max) + (when (gethash msg msg-hash) + (mh-notate nil mh-note-seq (1+ mh-cmd-note)))))) (defun mh-internal-seq (name) "Return non-nil if NAME is the name of an internal MH-E sequence." diff --git a/lisp/mh-e/mh-funcs.el b/lisp/mh-e/mh-funcs.el index f2ffeede002..1707793e114 100644 --- a/lisp/mh-e/mh-funcs.el +++ b/lisp/mh-e/mh-funcs.el @@ -32,7 +32,7 @@ ;;; Change Log: -;; $Id: mh-funcs.el,v 1.9 2003/01/08 23:21:16 wohler Exp $ +;; $Id: mh-funcs.el,v 1.43 2003/01/26 00:57:35 jchonig Exp $ ;;; Code: @@ -80,49 +80,66 @@ Default is the displayed message. If optional prefix argument is provided, then prompt for the message sequence." (interactive (list (cond ((mh-mark-active-p t) - (mh-region-to-msg-list (region-beginning) (region-end))) + (cons (region-beginning) (region-end))) (current-prefix-arg (mh-read-seq-default "Copy" t)) (t - (mh-get-msg-num t))) + (cons (line-beginning-position) (line-end-position)))) (mh-prompt-for-folder "Copy to" "" t))) - (mh-exec-cmd "refile" - (cond ((numberp msg-or-seq) msg-or-seq) - ((listp msg-or-seq) msg-or-seq) - (t (mh-coalesce-msg-list (mh-seq-to-msgs msg-or-seq)))) - "-link" "-src" mh-current-folder folder) - (if (numberp msg-or-seq) - (mh-notate msg-or-seq mh-note-copied mh-cmd-note) - (mh-notate-seq msg-or-seq mh-note-copied mh-cmd-note))) + (let ((msg-list (cond ((numberp msg-or-seq) (list msg-or-seq)) + ((symbolp msg-or-seq) (mh-seq-to-msgs msg-or-seq)) + ((and (consp msg-or-seq) (numberp (car msg-or-seq)) + (numberp (cdr msg-or-seq))) + (let ((result ())) + (mh-iterate-on-messages-in-region msg + (car msg-or-seq) (cdr msg-or-seq) + (mh-notate nil mh-note-copied mh-cmd-note) + (push msg result)) + result)) + (t msg-or-seq)))) + (mh-exec-cmd "refile" (mh-coalesce-msg-list msg-list) + "-link" "-src" mh-current-folder folder) + (cond ((numberp msg-or-seq) + (mh-notate msg-or-seq mh-note-copied mh-cmd-note)) + ((symbolp msg-or-seq) + (mh-notate-seq msg-or-seq mh-note-copied mh-cmd-note))))) ;;;###mh-autoload (defun mh-kill-folder () "Remove the current folder and all included messages. Removes all of the messages (files) within the specified current folder, -and then removes the folder (directory) itself. -The value of `mh-folder-list-change-hook' is a list of functions to be called, -with no arguments, after the folders has been removed." +and then removes the folder (directory) itself." (interactive) - (if (yes-or-no-p (format "Remove folder %s (and all included messages)?" - mh-current-folder)) - (let ((folder mh-current-folder)) - (if (null mh-folder-list) - (mh-set-folder-list)) + (if (or mh-index-data + (yes-or-no-p (format "Remove folder %s (and all included messages)?" + mh-current-folder))) + (let ((folder mh-current-folder) + (window-config mh-previous-window-config)) (mh-set-folder-modified-p t) ; lock folder to kill it - (mh-exec-cmd-daemon "rmf" folder) - (setq mh-folder-list - (delq (assoc folder mh-folder-list) mh-folder-list)) + (mh-exec-cmd-daemon "rmf" 'mh-rmf-daemon folder) (when (boundp 'mh-speed-folder-map) (mh-speed-invalidate-map folder)) - (run-hooks 'mh-folder-list-change-hook) - (message "Folder %s removed" folder) + (mh-remove-from-sub-folders-cache folder) (mh-set-folder-modified-p nil) ; so kill-buffer doesn't complain - (if (get-buffer mh-show-buffer) + (if (and mh-show-buffer (get-buffer mh-show-buffer)) (kill-buffer mh-show-buffer)) (if (get-buffer folder) - (kill-buffer folder))) + (kill-buffer folder)) + (when window-config + (set-window-configuration window-config)) + (message "Folder %s removed" folder)) (message "Folder not removed"))) +(defun mh-rmf-daemon (process output) + "The rmf PROCESS puts OUTPUT in temporary buffer. +Display the results only if something went wrong." + (set-buffer (get-buffer-create mh-temp-buffer)) + (insert-before-markers output) + (when (save-excursion + (beginning-of-buffer) + (re-search-forward "^rmf: " (point-max) t)) + (display-buffer mh-temp-buffer))) + ;; Avoid compiler warning... (defvar view-exit-action) @@ -130,7 +147,7 @@ with no arguments, after the folders has been removed." (defun mh-list-folders () "List mail folders." (interactive) - (let ((temp-buffer mh-temp-folders-buffer)) + (let ((temp-buffer mh-folders-buffer)) (with-output-to-temp-buffer temp-buffer (save-excursion (set-buffer temp-buffer) @@ -267,7 +284,7 @@ The messages are formatted by mhl. See the variable `mhl-formfile'." (format "Sequence from %s" mh-current-folder))))))) (if mh-print-background-flag - (mh-exec-cmd-daemon shell-file-name "-c" print-command) + (mh-exec-cmd-daemon shell-file-name nil "-c" print-command) (call-process shell-file-name nil nil nil "-c" print-command)) (if (numberp msg-or-seq) (mh-notate msg-or-seq mh-note-printed mh-cmd-note) diff --git a/lisp/mh-e/mh-identity.el b/lisp/mh-e/mh-identity.el index 494136801ae..1347225a2ed 100644 --- a/lisp/mh-e/mh-identity.el +++ b/lisp/mh-e/mh-identity.el @@ -37,7 +37,7 @@ ;;; Change Log: -;; $Id: mh-identity.el,v 1.1 2003/01/08 23:21:16 wohler Exp $ +;; $Id: mh-identity.el,v 1.17 2002/12/03 15:54:27 psg Exp $ ;;; Code: diff --git a/lisp/mh-e/mh-index.el b/lisp/mh-e/mh-index.el index 105c3a7113d..2a6cceb1389 100644 --- a/lisp/mh-e/mh-index.el +++ b/lisp/mh-e/mh-index.el @@ -40,13 +40,14 @@ ;;; Change Log: -;; $Id: mh-index.el,v 1.2 2003/01/08 23:21:16 wohler Exp $ +;; $Id: mh-index.el,v 1.83 2003/01/27 04:16:47 wohler Exp $ ;;; Code: (require 'cl) (require 'mh-e) (require 'mh-mime) +(require 'mh-pick) (autoload 'gnus-local-map-property "gnus-util") (autoload 'gnus-eval-format "gnus-spec") @@ -56,15 +57,22 @@ ;; Support different indexing programs (defvar mh-indexer-choices '((swish++ - mh-swish++-binary mh-swish++-execute-search mh-swish++-next-result) + mh-swish++-binary mh-swish++-execute-search mh-swish++-next-result + mh-swish++-regexp-builder) (swish - mh-swish-binary mh-swish-execute-search mh-swish-next-result) + mh-swish-binary mh-swish-execute-search mh-swish-next-result nil) + (mairix + mh-mairix-binary mh-mairix-execute-search mh-mairix-next-result + mh-mairix-regexp-builder) (namazu - mh-namazu-binary mh-namazu-execute-search mh-namazu-next-result) + mh-namazu-binary mh-namazu-execute-search mh-namazu-next-result nil) (glimpse - mh-glimpse-binary mh-glimpse-execute-search mh-glimpse-next-result) + mh-glimpse-binary mh-glimpse-execute-search mh-glimpse-next-result nil) + (pick + mh-pick-binary mh-pick-execute-search mh-pick-next-result + mh-pick-regexp-builder) (grep - mh-grep-binary mh-grep-execute-search mh-grep-next-result)) + mh-grep-binary mh-grep-execute-search mh-grep-next-result nil)) "List of possible indexer choices.") (defvar mh-indexer nil "Chosen index program.") @@ -72,6 +80,8 @@ "Function which executes the search program.") (defvar mh-index-next-result-function nil "Function to parse the next line of output.") +(defvar mh-index-regexp-builder nil + "Function used to construct search regexp.") ;; FIXME: This should be a defcustom... (defvar mh-index-folder "+mhe-index" @@ -254,16 +264,26 @@ checksum -> (origin-folder, origin-index) map is updated too." "Given STRING generate a name which is suitable for use as a folder name. White space from the beginning and end are removed. All spaces in the name are replaced with underscores and all / are replaced with $. If STRING is longer -than 20 it is truncated too." +than 20 it is truncated too. STRING could be a list of strings in which case +they are concatenated to construct the base name." (with-temp-buffer - (insert string) + (if (stringp string) + (insert string) + (when (car string) (insert (car string))) + (dolist (s (cdr string)) + (insert "_" s))) + (setq string (mh-replace-string "-lbrace" " ")) + (setq string (mh-replace-string "-rbrace" " ")) + (subst-char-in-region (point-min) (point-max) ?( ? t) + (subst-char-in-region (point-min) (point-max) ?) ? t) + (subst-char-in-region (point-min) (point-max) ?- ? t) (goto-char (point-min)) - (while (and (not (eobp)) (memq (char-after) '(? ?\t ?\n ?\r))) + (while (and (not (eobp)) (memq (char-after) '(? ?\t ?\n ?\r ?_))) (delete-char 1)) (goto-char (point-max)) - (while (and (not (bobp)) (memq (char-before) '(? ?\t ?\n ?\r))) + (while (and (not (bobp)) (memq (char-before) '(? ?\t ?\n ?\r ?_))) (delete-backward-char 1)) - (subst-char-in-region (point-min) (point-max) ? ?_ t) + (subst-char-in-region (point-min) (point-max) ? ?_ t) (subst-char-in-region (point-min) (point-max) ?\t ?_ t) (subst-char-in-region (point-min) (point-max) ?\n ?_ t) (subst-char-in-region (point-min) (point-max) ?\r ?_ t) @@ -271,13 +291,16 @@ than 20 it is truncated too." (truncate-string-to-width (buffer-substring (point-min) (point-max)) 20))) ;;;###mh-autoload -(defun mh-index-search (redo-search-flag folder search-regexp) +(defun* mh-index-search (redo-search-flag folder search-regexp + &optional window-config) "Perform an indexed search in an MH mail folder. If REDO-SEARCH-FLAG is non-nil and the current folder buffer was generated by a index search, then the search is repeated. Otherwise, FOLDER is searched with SEARCH-REGEXP and the results are presented in an MH-E folder. If FOLDER is -\"+\" then mail in all folders are searched. +\"+\" then mail in all folders are searched. Optional argument WINDOW-CONFIG +stores the window configuration that will be restored after the user quits the +folder containing the index search results. Four indexing programs are supported; if none of these are present, then grep is used. This function picks the first program that is available on your @@ -289,9 +312,16 @@ index for each program: - `mh-swish++-execute-search' - `mh-swish-execute-search' + - `mh-mairix-execute-search' - `mh-namazu-execute-search' - `mh-glimpse-execute-search' +If none of these programs are present then we use pick. If desired grep can be +used instead. Details about these methods can be found in: + + - `mh-pick-execute-search' + - `mh-grep-execute-search' + This and related functions use an X-MHE-Checksum header to cache the MD5 checksum of a message. This means that already present X-MHE-Checksum headers in the incoming email could result in messages not being found. The following @@ -306,18 +336,28 @@ This has the effect of renaming already present X-MHE-Checksum headers." (progn (unless mh-find-path-run (mh-find-path)) (or (and current-prefix-arg (car mh-index-previous-search)) - (mh-prompt-for-folder "Search" "+" nil "all"))) + (mh-prompt-for-folder "Search" "+" nil "all" t))) (progn ;; Yes, we do want to call mh-index-choose every time in case the ;; user has switched the indexer manually. (unless (mh-index-choose) (error "No indexing program found")) (or (and current-prefix-arg (cadr mh-index-previous-search)) + mh-index-regexp-builder (read-string (format "%s regexp: " (upcase-initials - (symbol-name mh-indexer)))))))) + (symbol-name mh-indexer)))))) + (if (and (not + (and current-prefix-arg (cadr mh-index-previous-search))) + mh-index-regexp-builder) + (current-window-configuration) + nil))) + (when (symbolp search-regexp) + (mh-search-folder folder window-config) + (setq mh-searching-function 'mh-index-do-search) + (return-from mh-index-search)) (mh-checksum-choose) (let ((result-count 0) - (old-window-config mh-previous-window-config) + (old-window-config (or window-config mh-previous-window-config)) (previous-search mh-index-previous-search) (index-folder (format "%s/%s" mh-index-folder (mh-index-generate-pretty-name search-regexp)))) @@ -373,7 +413,7 @@ This has the effect of renaming already present X-MHE-Checksum headers." (mh-recenter nil) ;; Maintain history - (when (and redo-search-flag previous-search) + (when (or (and redo-search-flag previous-search) window-config) (setq mh-previous-window-config old-window-config)) (setq mh-index-previous-search (list folder search-regexp)) @@ -385,6 +425,123 @@ This has the effect of renaming already present X-MHE-Checksum headers." count (> (hash-table-count msg-hash) 0)))))) ;;;###mh-autoload +(defun mh-index-do-search () + "Construct appropriate regexp and call `mh-index-search'." + (interactive) + (unless (mh-index-choose) (error "No indexing program found")) + (let* ((regexp-list (mh-pick-parse-search-buffer)) + (pattern (funcall mh-index-regexp-builder regexp-list))) + (if pattern + (mh-index-search nil mh-current-folder pattern + mh-previous-window-config) + (error "No search terms")))) + +(defun mh-replace-string (old new) + "Replace all occurrences of OLD with NEW in the current buffer." + (goto-char (point-min)) + (while (search-forward old nil t) + (replace-match new))) + +;;;###mh-autoload +(defun mh-index-parse-search-regexp (input-string) + "Construct parse tree for INPUT-STRING. +All occurrences of &, |, ! and ~ in INPUT-STRING are replaced by AND, OR and +NOT as appropriate. Then the resulting string is parsed." + (let (input) + (with-temp-buffer + (insert input-string) + (downcase-region (point-min) (point-max)) + ;; replace tabs + (mh-replace-string "\t" " ") + ;; synonyms of AND + (mh-replace-string "&" " and ") + (mh-replace-string " -and " " and ") + ;; synonyms of OR + (mh-replace-string "|" " or ") + (mh-replace-string " -or " " or ") + ;; synonyms of NOT + (mh-replace-string "!" " not ") + (mh-replace-string "~" " not ") + (mh-replace-string " -not " " not ") + ;; synonyms of left brace + (mh-replace-string "(" " ( ") + (mh-replace-string " -lbrace " " ( ") + ;; synonyms of right brace + (mh-replace-string ")" " ) ") + (mh-replace-string " -rbrace " " ) ") + ;; get the normalized input + (setq input (format "( %s )" (buffer-substring (point-min) (point-max))))) + + (let ((tokens (mh-index-add-implicit-ops (split-string input))) + (op-stack ()) + (operand-stack ()) + oper1) + (dolist (token tokens) + (cond ((equal token "(") (push 'paren op-stack)) + ((equal token "not") (push 'not op-stack)) + ((equal token "or") (push 'or op-stack)) + ((equal token "and") (push 'and op-stack)) + ((equal token ")") + (multiple-value-setq (op-stack operand-stack) + (mh-index-evaluate op-stack operand-stack)) + (when (eq (car op-stack) 'not) + (pop op-stack) + (push `(not ,(pop operand-stack)) operand-stack)) + (when (eq (car op-stack) 'and) + (pop op-stack) + (setq oper1 (pop operand-stack)) + (push `(and ,(pop operand-stack) ,oper1) operand-stack))) + ((eq (car op-stack) 'not) + (pop op-stack) + (push `(not ,token) operand-stack) + (when (eq (car op-stack) 'and) + (pop op-stack) + (setq oper1 (pop operand-stack)) + (push `(and ,(pop operand-stack) ,oper1) operand-stack))) + ((eq (car op-stack) 'and) + (pop op-stack) + (push `(and ,(pop operand-stack) ,token) operand-stack)) + (t (push token operand-stack)))) + (prog1 (pop operand-stack) + (when (or op-stack operand-stack) + (error "Invalid regexp: %s" input)))))) + +(defun mh-index-add-implicit-ops (tokens) + "Add implicit operators in the list TOKENS." + (let ((result ()) + (literal-seen nil) + current) + (while tokens + (setq current (pop tokens)) + (cond ((or (equal current ")") (equal current "and") (equal current "or")) + (setq literal-seen nil) + (push current result)) + ((and literal-seen + (push "and" result) + (setq literal-seen nil) + nil)) + (t + (push current result) + (unless (or (equal current "(") (equal current "not")) + (setq literal-seen t))))) + (nreverse result))) + +(defun mh-index-evaluate (op-stack operand-stack) + "Read expression till starting paren based on OP-STACK and OPERAND-STACK." + (block mh-index-evaluate + (let (op oper1) + (while op-stack + (setq op (pop op-stack)) + (cond ((eq op 'paren) + (return-from mh-index-evaluate (values op-stack operand-stack))) + ((eq op 'not) + (push `(not ,(pop operand-stack)) operand-stack)) + ((or (eq op 'and) (eq op 'or)) + (setq oper1 (pop operand-stack)) + (push `(,op ,(pop operand-stack) ,oper1) operand-stack)))) + (error "Ran out of tokens")))) + +;;;###mh-autoload (defun mh-index-next-folder (&optional backward-flag) "Jump to the next folder marker. The function is only applicable to folders displaying index search results. @@ -446,9 +603,9 @@ we find a new folder name." (setq chosen-name new-name) (return-from unique-name))))) (mh-exec-cmd-quiet nil "folder" "-create" "-fast" chosen-name) + (mh-remove-from-sub-folders-cache chosen-name) (when (boundp 'mh-speed-folder-map) (mh-speed-add-folder chosen-name)) - (push (list chosen-name) mh-folder-list) chosen-name)) ;;;###mh-autoload @@ -476,6 +633,9 @@ we find a new folder name." (let ((cur-msg (mh-get-msg-num nil)) (old-buffer-modified-flag (buffer-modified-p)) (buffer-read-only nil)) + (while (and (not cur-msg) (not (eobp))) + (forward-line) + (setq cur-msg (mh-get-msg-num nil))) (goto-char (point-min)) (while (not (eobp)) (if (or (char-equal (char-after) ?+) (char-equal (char-after) 10)) @@ -620,6 +780,43 @@ other matches left then return nil. If the current record is invalid return +;; Pick interface + +(defvar mh-index-pick-folder) +(defvar mh-pick-binary "pick") + +(defun mh-pick-execute-search (folder-path search-regexp) + "Execute pick. + +Unlike the other index search programs \"pick\" only searches messages present +in the folder itself and does not descend into any sub-folders that may be +present. + +FOLDER-PATH is the directory containing the mails to be searched and +SEARCH-REGEXP is the pattern that pick gets." + (set-buffer (get-buffer-create mh-index-temp-buffer)) + (erase-buffer) + (setq mh-index-pick-folder + (concat "+" (substring folder-path (length mh-user-path)))) + (apply #'call-process (expand-file-name "pick" mh-progs) nil '(t nil) nil + mh-index-pick-folder "-list" search-regexp) + (goto-char (point-min))) + +(defun mh-pick-next-result () + "Return the next pick search result." + (prog1 (block nil + (when (eobp) (return nil)) + (unless (re-search-forward "^[1-9][0-9]*$" (line-end-position) t) + (return 'error)) + (list mh-index-pick-folder + (car (read-from-string (buffer-substring-no-properties + (line-beginning-position) + (line-end-position)))) + nil)) + (forward-line))) + + + ;; Grep interface (defvar mh-grep-binary (executable-find "grep")) @@ -669,6 +866,140 @@ other matches left then return nil. If the current record is invalid return +;; Mairix interface + +(defvar mh-mairix-binary (executable-find "mairix")) +(defvar mh-mairix-directory ".mairix") +(defvar mh-mairix-folder nil) + +(defun mh-mairix-execute-search (folder-path search-regexp-list) + "Execute mairix and read the results. + +In the examples below replace /home/user/Mail with the path to your MH +directory. + +First create the directory /home/user/Mail/.mairix. Then create the file +/home/user/Mail/.mairix/config with the following contents: + + # This should contain the same thing as your `mh-user-path' + base=/home/user/Mail + + # List of folders that should be indexed. 3 dots at the end means there are + # subfolders within the folder + mh_folders=archive...:inbox:drafts:news:sent:trash + + vfolder_format=raw + database=/home/user/Mail/mairix/database + +Use the following command line to generate the mairix index. Run this daily +from cron: + + mairix -f /home/user/Mail/.mairix/config + +FOLDER-PATH is the directory in which SEARCH-REGEXP-LIST is used to search." + (set-buffer (get-buffer-create mh-index-temp-buffer)) + (erase-buffer) + (unless mh-mairix-binary + (error "Set mh-mairix-binary appropriately")) + (apply #'call-process mh-mairix-binary nil '(t nil) nil + "-f" (format "%s%s/config" mh-user-path mh-mairix-directory) + search-regexp-list) + (goto-char (point-min)) + (setq mh-mairix-folder + (let ((last-char (substring folder-path (1- (length folder-path))))) + (if (equal last-char "/") + folder-path + (format "%s/" folder-path))))) + +(defun mh-mairix-next-result () + "Return next result from mairix output." + (prog1 + (block nil + (when (or (eobp) (and (bolp) (eolp))) + (return nil)) + (unless (eq (char-after) ?/) + (return error)) + (let ((start (point)) + end msg-start) + (setq end (line-end-position)) + (unless (search-forward mh-mairix-folder end t) + (return 'error)) + (goto-char (match-beginning 0)) + (unless (equal (point) start) + (return 'error)) + (goto-char end) + (unless (search-backward "/" start t) + (return 'error)) + (setq msg-start (1+ (point))) + (goto-char start) + (unless (search-forward mh-user-path end t) + (return 'error)) + (list (format "+%s" (buffer-substring-no-properties + (point) (1- msg-start))) + (car (read-from-string + (buffer-substring-no-properties msg-start end))) + ()))) + (forward-line))) + +(defun mh-mairix-regexp-builder (regexp-list) + "Generate query for mairix. +REGEXP-LIST is an alist of fields and values." + (let ((result ())) + (dolist (pair regexp-list) + (when (cdr pair) + (push + (concat + (cond ((eq (car pair) 'to) "t:") + ((eq (car pair) 'from) "f:") + ((eq (car pair) 'cc) "c:") + ((eq (car pair) 'subject) "s:") + ((eq (car pair) 'date) "d:") + (t "")) + (let ((sop (cdr (mh-mairix-convert-to-sop* (cdr pair)))) + (final "")) + (dolist (conjunct sop) + (let ((expr-list (cdr conjunct)) + (expr-string "")) + (dolist (e expr-list) + (setq expr-string (concat expr-string "+" + (if (atom e) "" "~") + (if (atom e) e (cadr e))))) + (setq final (concat final "," (substring expr-string 1))))) + (substring final 1))) + result))) + result)) + +(defun mh-mairix-convert-to-sop* (expr) + "Convert EXPR to sum of product form." + (cond ((atom expr) `(or (and ,expr))) + ((eq (car expr) 'or) + (cons 'or + (loop for e in (mapcar #'mh-mairix-convert-to-sop* (cdr expr)) + append (cdr e)))) + ((eq (car expr) 'and) + (let ((conjuncts (mapcar #'mh-mairix-convert-to-sop* (cdr expr))) + result next-factor) + (setq result (pop conjuncts)) + (while conjuncts + (setq next-factor (pop conjuncts)) + (setq result (let ((res ())) + (dolist (t1 (cdr result)) + (dolist (t2 (cdr next-factor)) + (push `(and ,@(cdr t1) ,@(cdr t2)) res))) + (cons 'or res)))) + result)) + ((atom (cadr expr)) `(or (and ,expr))) + ((eq (caadr expr) 'not) (mh-mairix-convert-to-sop* (cadadr expr))) + ((eq (caadr expr) 'and) (mh-mairix-convert-to-sop* + `(or ,@(mapcar #'(lambda (x) `(not ,x)) + (cdadr expr))))) + ((eq (caadr expr) 'or) (mh-mairix-convert-to-sop* + `(and ,@(mapcar #'(lambda (x) `(not ,x)) + (cdadr expr))))) + (t (error "Unreachable: %s" expr)))) + + + ;; Swish interface (defvar mh-swish-binary (executable-find "swish-e")) @@ -704,7 +1035,7 @@ First create the directory /home/user/Mail/.swish. Then create the file FileRules pathname contains /home/user/Mail/.swish FileRules pathname contains /home/user/Mail/mhe-index FileRules filename is index - FileRules filename is \..* + FileRules filename is \\..* FileRules filename is #.* FileRules filename is ,.* FileRules filename is .*~ @@ -829,6 +1160,29 @@ FOLDER-PATH is the directory in which SEARCH-REGEXP is used to search." (defalias 'mh-swish++-next-result 'mh-swish-next-result) +(defun mh-swish++-regexp-builder (regexp-list) + "Generate query for swish++. +REGEXP-LIST is an alist of fields and values." + (let ((regexp "") meta) + (dolist (elem regexp-list) + (when (cdr elem) + (setq regexp (concat regexp " and " + (if (car elem) "(" "") + (if (car elem) (symbol-name (car elem)) "") + (if (car elem) " = " "") + (mh-swish++-print-regexp (cdr elem)) + (if (car elem) ")" ""))))) + (substring regexp 4))) + +(defun mh-swish++-print-regexp (expr) + "Return infix expression corresponding to EXPR." + (cond ((atom expr) (format "%s" expr)) + ((eq (car expr) 'not) + (format "(not %s)" (mh-swish++-print-regexp (cadr expr)))) + (t (format "(%s %s %s)" (mh-swish++-print-regexp (cadr expr)) + (symbol-name (car expr)) + (mh-swish++-print-regexp (caddr expr)))))) + ;; Namazu interface @@ -931,8 +1285,9 @@ system." (executable (symbol-value (cadr current)))) (when executable (setq mh-indexer (car current)) - (setq mh-index-execute-search-function (caddr current)) - (setq mh-index-next-result-function (cadddr current)) + (setq mh-index-execute-search-function (nth 2 current)) + (setq mh-index-next-result-function (nth 3 current)) + (setq mh-index-regexp-builder (nth 4 current)) (return mh-indexer)))) nil))) diff --git a/lisp/mh-e/mh-loaddefs.el b/lisp/mh-e/mh-loaddefs.el index 20cfb8571bd..9646df03ad1 100644 --- a/lisp/mh-e/mh-loaddefs.el +++ b/lisp/mh-e/mh-loaddefs.el @@ -1,6 +1,11 @@ ;;; mh-loaddefs.el --- automatically extracted autoloads ;; +;;; Copyright (C) 2003 Free Software Foundation, Inc. +;;; Author: Bill Wohler <wohler@newt.com> +;;; Keywords: mail ;;; Commentary: +;;; Change Log: +;; $Id: mh-loaddefs.el,v 1.36 2003/02/03 19:15:13 wohler Exp $ ;;; Code: ;;;### (autoloads (mh-letter-complete mh-open-line mh-fully-kill-draft @@ -8,7 +13,7 @@ ;;;;;; mh-insert-signature mh-to-fcc mh-to-field mh-fill-paragraph-function ;;;;;; mh-send-other-window mh-send mh-reply mh-redistribute mh-forward ;;;;;; mh-extract-rejected-mail mh-edit-again) "mh-comp" "mh-comp.el" -;;;;;; (15899 19356)) +;;;;;; (15924 43423)) ;;; Generated autoloads from mh-comp.el (autoload (quote mh-edit-again) "mh-comp" "\ @@ -145,11 +150,13 @@ passing the prefix ARG if any." t nil) ;;;*** ;;;### (autoloads (mh-tool-bar-folder-set mh-tool-bar-letter-set -;;;;;; mh-customize) "mh-customize" "mh-customize.el" (15899 29873)) +;;;;;; mh-customize) "mh-customize" "mh-customize.el" (15933 21842)) ;;; Generated autoloads from mh-customize.el (autoload (quote mh-customize) "mh-customize" "\ -Customize MH-E variables." t nil) +Customize MH-E variables. +With optional argument DELETE-OTHER-WINDOWS-FLAG, other windows in the frame +are removed." t nil) (autoload (quote mh-tool-bar-letter-set) "mh-customize" "\ Construct toolbar for `mh-letter-mode'." nil nil) @@ -160,7 +167,7 @@ Construct toolbar for `mh-folder-mode'." nil nil) ;;;*** ;;;### (autoloads (mh-goto-cur-msg mh-update-sequences mh-folder-line-matches-show-buffer-p) -;;;;;; "mh-e" "mh-e.el" (15899 29921)) +;;;;;; "mh-e" "mh-e.el" (15934 48879)) ;;; Generated autoloads from mh-e.el (autoload (quote mh-folder-line-matches-show-buffer-p) "mh-e" "\ @@ -183,7 +190,7 @@ recenter the folder buffer." nil nil) ;;;;;; mh-undo-folder mh-sort-folder mh-print-msg mh-page-digest-backwards ;;;;;; mh-page-digest mh-pipe-msg mh-pack-folder mh-list-folders ;;;;;; mh-kill-folder mh-copy-msg mh-burst-digest) "mh-funcs" "mh-funcs.el" -;;;;;; (15886 19303)) +;;;;;; (15923 15465)) ;;; Generated autoloads from mh-funcs.el (autoload (quote mh-burst-digest) "mh-funcs" "\ @@ -199,9 +206,7 @@ then prompt for the message sequence." t nil) (autoload (quote mh-kill-folder) "mh-funcs" "\ Remove the current folder and all included messages. Removes all of the messages (files) within the specified current folder, -and then removes the folder (directory) itself. -The value of `mh-folder-list-change-hook' is a list of functions to be called, -with no arguments, after the folders has been removed." t nil) +and then removes the folder (directory) itself." t nil) (autoload (quote mh-list-folders) "mh-funcs" "\ List mail folders." t nil) @@ -260,7 +265,7 @@ Display cheat sheet for the commands of the current prefix in minibuffer." t nil ;;;*** ;;;### (autoloads (mh-insert-identity mh-identity-list-set mh-identity-make-menu) -;;;;;; "mh-identity" "mh-identity.el" (15852 60439)) +;;;;;; "mh-identity" "mh-identity.el" (15900 46388)) ;;; Generated autoloads from mh-identity.el (autoload (quote mh-identity-make-menu) "mh-identity" "\ @@ -281,8 +286,9 @@ Edit the `mh-identity-list' variable to define identity." t nil) ;;;### (autoloads (mh-namazu-execute-search mh-swish++-execute-search ;;;;;; mh-swish-execute-search mh-glimpse-execute-search mh-index-execute-commands ;;;;;; mh-index-visit-folder mh-index-delete-folder-headers mh-index-insert-folder-headers -;;;;;; mh-index-previous-folder mh-index-next-folder mh-index-search -;;;;;; mh-index-update-maps) "mh-index" "mh-index.el" (15899 19358)) +;;;;;; mh-index-previous-folder mh-index-next-folder mh-index-parse-search-regexp +;;;;;; mh-index-do-search mh-index-search mh-index-update-maps) +;;;;;; "mh-index" "mh-index.el" (15924 45743)) ;;; Generated autoloads from mh-index.el (autoload (quote mh-index-update-maps) "mh-index" "\ @@ -298,7 +304,9 @@ Perform an indexed search in an MH mail folder. If REDO-SEARCH-FLAG is non-nil and the current folder buffer was generated by a index search, then the search is repeated. Otherwise, FOLDER is searched with SEARCH-REGEXP and the results are presented in an MH-E folder. If FOLDER is -\"+\" then mail in all folders are searched. +\"+\" then mail in all folders are searched. Optional argument WINDOW-CONFIG +stores the window configuration that will be restored after the user quits the +folder containing the index search results. Four indexing programs are supported; if none of these are present, then grep is used. This function picks the first program that is available on your @@ -310,9 +318,16 @@ index for each program: - `mh-swish++-execute-search' - `mh-swish-execute-search' + - `mh-mairix-execute-search' - `mh-namazu-execute-search' - `mh-glimpse-execute-search' +If none of these programs are present then we use pick. If desired grep can be +used instead. Details about these methods can be found in: + + - `mh-pick-execute-search' + - `mh-grep-execute-search' + This and related functions use an X-MHE-Checksum header to cache the MD5 checksum of a message. This means that already present X-MHE-Checksum headers in the incoming email could result in messages not being found. The following @@ -323,6 +338,14 @@ procmail recipe should avoid this: This has the effect of renaming already present X-MHE-Checksum headers." t nil) +(autoload (quote mh-index-do-search) "mh-index" "\ +Construct appropriate regexp and call `mh-index-search'." t nil) + +(autoload (quote mh-index-parse-search-regexp) "mh-index" "\ +Construct parse tree for INPUT-STRING. +All occurrences of &, |, ! and ~ in INPUT-STRING are replaced by AND, OR and +NOT as appropriate. Then the resulting string is parsed." nil nil) + (autoload (quote mh-index-next-folder) "mh-index" "\ Jump to the next folder marker. The function is only applicable to folders displaying index search results. @@ -408,7 +431,7 @@ First create the directory /home/user/Mail/.swish. Then create the file FileRules pathname contains /home/user/Mail/.swish FileRules pathname contains /home/user/Mail/mhe-index FileRules filename is index - FileRules filename is ..* + FileRules filename is \\..* FileRules filename is #.* FileRules filename is ,.* FileRules filename is .*~ @@ -501,7 +524,7 @@ FOLDER-PATH is the directory in which SEARCH-REGEXP is used to search." nil nil) ;;;;;; mh-mml-attach-file mh-mml-forward-message mh-mml-to-mime ;;;;;; mh-revert-mhn-edit mh-edit-mhn mh-mhn-compose-forw mh-mhn-compose-external-compressed-tar ;;;;;; mh-mhn-compose-anon-ftp mh-mhn-compose-insertion mh-compose-forward -;;;;;; mh-compose-insertion) "mh-mime" "mh-mime.el" (15858 6046)) +;;;;;; mh-compose-insertion) "mh-mime" "mh-mime.el" (15923 15465)) ;;; Generated autoloads from mh-mime.el (autoload (quote mh-compose-insertion) "mh-mime" "\ @@ -665,30 +688,45 @@ Toggle display of the raw MIME part." t nil) ;;;*** -;;;### (autoloads (mh-do-pick-search mh-search-folder) "mh-pick" -;;;;;; "mh-pick.el" (15854 20166)) +;;;### (autoloads (mh-do-search mh-pick-do-search mh-do-pick-search +;;;;;; mh-search-folder) "mh-pick" "mh-pick.el" (15924 45743)) ;;; Generated autoloads from mh-pick.el (autoload (quote mh-search-folder) "mh-pick" "\ Search FOLDER for messages matching a pattern. This function uses the MH command `pick' to do the work. -Add the messages found to the sequence named `search'." t nil) +Add the messages found to the sequence named `search'. +Argument WINDOW-CONFIG is the current window configuration and is used when +the search folder is dismissed." t nil) (autoload (quote mh-do-pick-search) "mh-pick" "\ Find messages that match the qualifications in the current pattern buffer. Messages are searched for in the folder named in `mh-searching-folder'. +Add the messages found to the sequence named `search'. + +This is a deprecated function and `mh-pick-do-search' should be used instead." t nil) + +(autoload (quote mh-pick-do-search) "mh-pick" "\ +Find messages that match the qualifications in the current pattern buffer. +Messages are searched for in the folder named in `mh-searching-folder'. Add the messages found to the sequence named `search'." t nil) +(autoload (quote mh-do-search) "mh-pick" "\ +Use the default searching function. +If \\[mh-search-folder] was used to create the search pattern then pick is used +to search the folder. Otherwise if \\[mh-index-search] was used then the +indexing program specified in `mh-index-program' is used." t nil) + ;;;*** ;;;### (autoloads (mh-thread-refile mh-thread-delete mh-thread-ancestor ;;;;;; mh-thread-previous-sibling mh-thread-next-sibling mh-thread-forget-message ;;;;;; mh-toggle-threads mh-thread-add-spaces mh-thread-inc mh-delete-subject-or-thread ;;;;;; mh-delete-subject mh-narrow-to-subject mh-region-to-msg-list -;;;;;; mh-add-to-sequence mh-notate-seq mh-map-to-seq-msgs mh-rename-seq -;;;;;; mh-widen mh-put-msg-in-seq mh-narrow-to-seq mh-msg-is-in-seq -;;;;;; mh-list-sequences mh-delete-seq) "mh-seq" "mh-seq.el" (15899 -;;;;;; 19358)) +;;;;;; mh-iterate-on-messages-in-region mh-add-to-sequence mh-notate-cur +;;;;;; mh-notate-seq mh-map-to-seq-msgs mh-rename-seq mh-widen mh-put-msg-in-seq +;;;;;; mh-narrow-to-seq mh-msg-is-in-seq mh-list-sequences mh-delete-seq) +;;;;;; "mh-seq" "mh-seq.el" (15923 15465)) ;;; Generated autoloads from mh-seq.el (autoload (quote mh-delete-seq) "mh-seq" "\ @@ -726,9 +764,21 @@ Mark the scan listing. All messages in SEQ are marked with NOTATION at OFFSET from the beginning of the line." nil nil) +(autoload (quote mh-notate-cur) "mh-seq" "\ +Mark the MH sequence cur. +In addition to notating the current message with `mh-note-cur' the function +uses `overlay-arrow-position' to put a marker in the fringe." nil nil) + (autoload (quote mh-add-to-sequence) "mh-seq" "\ The sequence SEQ is augmented with the messages in MSGS." nil nil) +(autoload (quote mh-iterate-on-messages-in-region) "mh-seq" "\ +Iterate over region. +VAR is bound to the message on the current line as we loop starting from BEGIN +till END. In each step BODY is executed. + +If VAR is nil then the loop is executed without any binding." nil (quote macro)) + (autoload (quote mh-region-to-msg-list) "mh-seq" "\ Return a list of messages within the region between BEGIN and END." nil nil) @@ -756,11 +806,7 @@ All messages after START-POINT are added to the thread tree." nil nil) Add COUNT spaces to each scan line in `mh-thread-scan-line-map'." nil nil) (autoload (quote mh-toggle-threads) "mh-seq" "\ -Toggle threaded view of folder. -The conversion of normal view to threaded view is exact, that is the same -messages are displayed in the folder buffer before and after threading. However -the conversion from threaded view to normal view is inexact. So more messages -than were originally present may be shown as a result." t nil) +Toggle threaded view of folder." t nil) (autoload (quote mh-thread-forget-message) "mh-seq" "\ Forget the message INDEX from the threading tables." nil nil) @@ -787,7 +833,7 @@ Mark current message and all its children for refiling to FOLDER." t nil) ;;;### (autoloads (mh-speed-add-folder mh-speed-invalidate-map mh-speed-flists ;;;;;; mh-speed-view mh-speed-toggle mh-folder-speedbar-buttons) -;;;;;; "mh-speed" "mh-speed.el" (15899 19358)) +;;;;;; "mh-speed" "mh-speed.el" (15933 21584)) ;;; Generated autoloads from mh-speed.el (autoload (quote mh-folder-speedbar-buttons) "mh-speed" "\ @@ -820,7 +866,7 @@ The function invalidates the latest ancestor that is present." nil nil) ;;;*** ;;;### (autoloads (mh-get-msg-num mh-goto-address-find-address-at-point) -;;;;;; "mh-utils" "mh-utils.el" (15899 28827)) +;;;;;; "mh-utils" "mh-utils.el" (15924 47279)) ;;; Generated autoloads from mh-utils.el (autoload (quote mh-goto-address-find-address-at-point) "mh-utils" "\ @@ -836,9 +882,10 @@ not pointing to a message." nil nil) ;;;*** ;;;### (autoloads (mh-alias-add-address-under-point mh-alias-grab-from-field -;;;;;; mh-alias-add-alias mh-alias-from-has-no-alias-p mh-alias-letter-expand-alias -;;;;;; mh-alias-minibuffer-confirm-address mh-read-address mh-alias-reload) -;;;;;; "mh-alias" "mh-alias.el" (15899 29102)) +;;;;;; mh-alias-add-alias mh-alias-from-has-no-alias-p mh-alias-address-to-alias +;;;;;; mh-alias-letter-expand-alias mh-alias-minibuffer-confirm-address +;;;;;; mh-read-address mh-alias-reload) "mh-alias" "mh-alias.el" +;;;;;; (15924 45743)) ;;; Generated autoloads from mh-alias.el (autoload (quote mh-alias-reload) "mh-alias" "\ @@ -853,6 +900,9 @@ Display the alias expansion if `mh-alias-flash-on-comma' is non-nil." t nil) (autoload (quote mh-alias-letter-expand-alias) "mh-alias" "\ Expand mail alias before point." nil nil) +(autoload (quote mh-alias-address-to-alias) "mh-alias" "\ +Return the ADDRESS alias if defined, or nil." nil nil) + (autoload (quote mh-alias-from-has-no-alias-p) "mh-alias" "\ Return t is From has no current alias set." nil nil) diff --git a/lisp/mh-e/mh-mime.el b/lisp/mh-e/mh-mime.el index 16347b3011a..a14a548e2c4 100644 --- a/lisp/mh-e/mh-mime.el +++ b/lisp/mh-e/mh-mime.el @@ -32,7 +32,7 @@ ;;; Change Log: -;; $Id: mh-mime.el,v 1.12 2003/01/08 23:21:16 wohler Exp $ +;; $Id: mh-mime.el,v 1.100 2003/01/25 19:18:51 satyaki Exp $ ;;; Code: @@ -787,7 +787,16 @@ displayed." (setq handles pre-dissected-handles) (setq handles (or (mm-dissect-buffer nil) (mm-uu-dissect))) (setf (mh-mime-handles (mh-buffer-data)) - (mm-merge-handles handles (mh-mime-handles (mh-buffer-data))))) + (mm-merge-handles handles (mh-mime-handles (mh-buffer-data)))) + + ;; Use charset to decode body... + (unless handles + (let* ((ct (ignore-errors + (mail-header-parse-content-type + (message-fetch-field "Content-Type" t)))) + (charset (mail-content-type-get ct 'charset))) + (when (stringp charset) + (mm-decode-body charset))))) (when (and handles (or (not (stringp (car handles))) (cdr handles))) ;; Goto start of message body @@ -1215,14 +1224,9 @@ Parameter EL is unused." The function decodes the message and displays it. It avoids decoding the same message multiple times." (let ((b (point)) - (charset (mail-content-type-get (mm-handle-type handle) 'charset)) (clean-message-header mh-clean-message-header-flag) (invisible-headers mh-invisible-headers) (visible-headers mh-visible-headers)) - (when (and charset (stringp charset)) - (setq charset (intern (downcase charset))) - (when (eq charset 'us-ascii) - (setq charset nil))) (save-excursion (save-restriction (narrow-to-region b b) diff --git a/lisp/mh-e/mh-pick.el b/lisp/mh-e/mh-pick.el index 373004fa342..3367392343b 100644 --- a/lisp/mh-e/mh-pick.el +++ b/lisp/mh-e/mh-pick.el @@ -30,7 +30,7 @@ ;;; Change Log: -;; $Id: mh-pick.el,v 1.10 2003/01/08 23:21:16 wohler Exp $ +;; $Id: mh-pick.el,v 1.30 2003/01/27 04:16:47 wohler Exp $ ;;; Code: @@ -44,28 +44,34 @@ "Keymap for searching folder.") (defvar mh-searching-folder nil) ;Folder this pick is searching. +(defvar mh-searching-function nil) ;;;###mh-autoload -(defun mh-search-folder (folder) +(defun mh-search-folder (folder window-config) "Search FOLDER for messages matching a pattern. This function uses the MH command `pick' to do the work. -Add the messages found to the sequence named `search'." - (interactive (list (mh-prompt-for-folder "Search" - mh-current-folder - t))) - (switch-to-buffer-other-window "pick-pattern") - (if (or (zerop (buffer-size)) - (not (y-or-n-p "Reuse pattern? "))) - (mh-make-pick-template) - (message "")) - (setq mh-searching-folder folder) - (message "%s" (substitute-command-keys - (concat "Type \\[mh-do-pick-search] to search messages, " - "\\[mh-help] for help.")))) +Add the messages found to the sequence named `search'. +Argument WINDOW-CONFIG is the current window configuration and is used when +the search folder is dismissed." + (interactive (list (mh-prompt-for-folder "Search" mh-current-folder nil nil t) + (current-window-configuration))) + (let ((pick-folder (if (equal folder "+") mh-current-folder folder))) + (switch-to-buffer-other-window "search-pattern") + (if (or (zerop (buffer-size)) + (not (y-or-n-p "Reuse pattern? "))) + (mh-make-pick-template) + (message "")) + (setq mh-searching-function 'mh-pick-do-search + mh-searching-folder pick-folder + mh-current-folder folder + mh-previous-window-config window-config) + (message "%s" (substitute-command-keys + (concat "Type \\[mh-do-search] to search messages, " + "\\[mh-help] for help."))))) (defun mh-make-pick-template () "Initialize the current buffer with a template for a pick pattern." - (erase-buffer) + (let ((inhibit-read-only t)) (erase-buffer)) (insert "From: \n" "To: \n" "Cc: \n" @@ -74,20 +80,29 @@ Add the messages found to the sequence named `search'." "---------\n") (mh-pick-mode) (goto-char (point-min)) - (end-of-line)) + (dotimes (i 5) + (add-text-properties (point) (1+ (point)) '(front-sticky t)) + (add-text-properties (- (line-end-position) 2) (1- (line-end-position)) + '(rear-nonsticky t)) + (add-text-properties (point) (1- (line-end-position)) '(read-only t)) + (forward-line)) + (add-text-properties (point) (1+ (point)) '(front-sticky t)) + (add-text-properties (point) (1- (line-end-position)) '(read-only t)) + (goto-char (point-max))) ;;; Menu extracted from mh-menubar.el V1.1 (31 July 2001) (easy-menu-define mh-pick-menu mh-pick-mode-map "Menu for MH-E pick-mode" '("Pick" - ["Execute the Search" mh-do-pick-search t])) + ["Execute the Search" mh-pick-do-search t])) ;;; Help Messages ;;; Group messages logically, more or less. (defvar mh-pick-mode-help-messages '((nil - "Search messages: \\[mh-do-pick-search]\n" + "Search messages using pick: \\[mh-pick-do-search]\n" + "Search messages using index: \\[mh-index-do-search]\n" "Move to a field by typing C-c C-f C-<field>\n" "where <field> is the first letter of the desired field.")) "Key binding cheat sheet. @@ -111,7 +126,7 @@ value does not matter for the search, leave it empty. To search the entire message, supply the pattern in the \"body\" of the template. Each non-empty field must be matched for a message to be selected. To effect a logical \"or\", use \\[mh-search-folder] multiple times. -When you have finished, type \\[mh-do-pick-search] to do the search. +When you have finished, type \\[mh-pick-do-search] to do the search. The value of `mh-pick-mode-hook' is a list of functions to be called, with no arguments, upon entry to this mode. @@ -119,8 +134,9 @@ with no arguments, upon entry to this mode. \\{mh-pick-mode-map}" (make-local-variable 'mh-searching-folder) - (easy-menu-add mh-pick-menu) + (make-local-variable 'mh-searching-function) (make-local-variable 'mh-help-messages) + (easy-menu-add mh-pick-menu) (setq mh-help-messages mh-pick-mode-help-messages) (run-hooks 'mh-pick-mode-hook)) @@ -128,41 +144,58 @@ with no arguments, upon entry to this mode. (defun mh-do-pick-search () "Find messages that match the qualifications in the current pattern buffer. Messages are searched for in the folder named in `mh-searching-folder'. +Add the messages found to the sequence named `search'. + +This is a deprecated function and `mh-pick-do-search' should be used instead." + (interactive) + (mh-pick-do-search)) + +;;;###mh-autoload +(defun mh-pick-do-search () + "Find messages that match the qualifications in the current pattern buffer. +Messages are searched for in the folder named in `mh-searching-folder'. Add the messages found to the sequence named `search'." (interactive) - (let ((pattern-buffer (buffer-name)) - (searching-buffer mh-searching-folder) - range - msgs - (pattern nil) - (new-buffer nil)) + (let ((pattern-list (mh-pick-parse-search-buffer)) + (folder mh-searching-folder) + (new-buffer-flag nil) + (window-config mh-previous-window-config) + range pick-args msgs) + (unless pattern-list + (error "No search pattern specified")) (save-excursion - (cond ((get-buffer searching-buffer) - (set-buffer searching-buffer) - (setq range (list (format "%d-%d" - mh-first-msg-num mh-last-msg-num)))) + (cond ((get-buffer folder) + (set-buffer folder) + (setq range (if (and mh-first-msg-num mh-last-msg-num) + (format "%d-%d" mh-first-msg-num mh-last-msg-num) + "all"))) (t - (mh-make-folder searching-buffer) - (setq range '("all")) - (setq new-buffer t)))) - (message "Searching...") - (goto-char (point-min)) - (while (and range - (setq pattern (mh-next-pick-field pattern-buffer))) - (setq msgs (mh-seq-from-command searching-buffer - 'search - (mh-list-to-string - (list "pick" pattern searching-buffer - "-list" - (mh-coalesce-msg-list range))))) - (setq range msgs)) ;restrict the pick range for next pass + (mh-make-folder folder) + (setq range "all") + (setq new-buffer-flag t)))) + (setq pick-args (mh-pick-regexp-builder pattern-list)) + (when pick-args + (setq msgs (mh-seq-from-command folder 'search + `("pick" ,folder ,range ,@pick-args)))) (message "Searching...done") - (if new-buffer - (mh-scan-folder searching-buffer msgs) - (switch-to-buffer searching-buffer)) + (if (not new-buffer-flag) + (switch-to-buffer folder) + (mh-scan-folder folder msgs) + (setq mh-previous-window-config window-config)) (mh-add-msgs-to-seq msgs 'search) (delete-other-windows))) +;;;###mh-autoload +(defun mh-do-search () + "Use the default searching function. +If \\[mh-search-folder] was used to create the search pattern then pick is used +to search the folder. Otherwise if \\[mh-index-search] was used then the +indexing program specified in `mh-index-program' is used." + (interactive) + (if (symbolp mh-searching-function) + (funcall mh-searching-function) + (error "No searching function defined"))) + (defun mh-seq-from-command (folder seq command) "In FOLDER, make a sequence named SEQ by executing COMMAND. COMMAND is a list. The first element is a program name @@ -181,31 +214,66 @@ and the subsequent elements are its arguments, all strings." (setq msgs (nreverse msgs)) ;put in ascending order msgs))) -(defun mh-next-pick-field (buffer) - "Return the next piece of a pick argument extracted from BUFFER. -Return a list like (\"--fieldname\" \"pattern\") or (\"-search\" \"bodypat\") -or nil if no pieces remain." - (set-buffer buffer) - (let ((case-fold-search t)) - (cond ((eobp) - nil) - ((re-search-forward "^\\([a-z][^: \t\n]*\\):[ \t]*\\([a-z0-9].*\\)$" - nil t) - (let* ((component - (format "--%s" - (downcase (buffer-substring (match-beginning 1) - (match-end 1))))) - (pat (buffer-substring (match-beginning 2) (match-end 2)))) - (forward-line 1) - (list component pat))) - ((re-search-forward "^-*$" nil t) - (forward-char 1) - (let ((body (buffer-substring (point) (point-max)))) - (if (and (> (length body) 0) (not (equal body "\n"))) - (list "-search" body) - nil))) - (t - nil)))) +(defun mh-pick-parse-search-buffer () + "Parse the search buffer contents. +The function returns a alist. The car of each element is either the header name +to search in or nil to search the whole message. The cdr of the element is the +pattern to search." + (save-excursion + (let ((pattern-list ()) + (in-body-flag nil) + start begin) + (goto-char (point-min)) + (while (not (eobp)) + (if (search-forward "--------" (line-end-position) t) + (setq in-body-flag t) + (beginning-of-line) + (setq begin (point)) + (setq start (if in-body-flag + (point) + (search-forward ":" (line-end-position) t) + (point))) + (push (cons (and (not in-body-flag) + (intern (downcase + (buffer-substring-no-properties + begin (1- start))))) + (mh-index-parse-search-regexp + (buffer-substring-no-properties + start (line-end-position)))) + pattern-list)) + (forward-line)) + pattern-list))) + + + +;; Functions specific to how pick works... +(defun mh-pick-construct-regexp (expr component) + "Construct pick compatible expression corresponding to EXPR. +COMPONENT is the component to search." + (cond ((atom expr) (list component expr)) + ((eq (car expr) 'and) + `("-lbrace" ,@(mh-pick-construct-regexp (cadr expr) component) "-and" + ,@(mh-pick-construct-regexp (caddr expr) component) "-rbrace")) + ((eq (car expr) 'or) + `("-lbrace" ,@(mh-pick-construct-regexp (cadr expr) component) "-or" + ,@(mh-pick-construct-regexp (caddr expr) component) "-rbrace")) + ((eq (car expr) 'not) + `("-lbrace" "-not" ,@(mh-pick-construct-regexp (cadr expr) component) + "-rbrace")) + (t (error "Unknown operator '%s' seen" (car expr))))) + +(defun mh-pick-regexp-builder (pattern-list) + "Generate pick search expression from PATTERN-LIST." + (let ((result ())) + (dolist (pattern pattern-list) + (when (cdr pattern) + (setq result `(,@result "-and" "-lbrace" + ,@(mh-pick-construct-regexp + (cdr pattern) (if (car pattern) + (format "-%s" (car pattern)) + "-search")) + "-rbrace")))) + (cdr result))) @@ -213,7 +281,9 @@ or nil if no pieces remain." ;;; If this changes, modify mh-pick-mode-help-messages accordingly, above. (gnus-define-keys mh-pick-mode-map "\C-c?" mh-help - "\C-c\C-c" mh-do-pick-search + "\C-c\C-i" mh-index-do-search + "\C-c\C-p" mh-pick-do-search + "\C-c\C-c" mh-do-search "\C-c\C-f\C-b" mh-to-field "\C-c\C-f\C-c" mh-to-field "\C-c\C-f\C-d" mh-to-field diff --git a/lisp/mh-e/mh-seq.el b/lisp/mh-e/mh-seq.el index d3859821ae1..f00afa84f86 100644 --- a/lisp/mh-e/mh-seq.el +++ b/lisp/mh-e/mh-seq.el @@ -48,26 +48,27 @@ ;; -format "%(msg)\n%{message-id}\n%{references}\n%{subject}\n" ;; I would really appreciate it if someone would help me with this. ;; -;; (2) Implement heuristics to recognize message-id's in In-Reply-To: -;; header. Right now it just assumes that the last text between angles -;; (< and >) is the message-id. There is the chance that this will -;; incorrectly use an email address like a message-id. +;; (2) Implement heuristics to recognize message identifiers in +;; In-Reply-To: header. Right now it just assumes that the last text +;; between angles (< and >) is the message identifier. There is the +;; chance that this will incorrectly use an email address like a +;; message identifier. ;; -;; (3) Error checking of found message-id's should be done. +;; (3) Error checking of found message identifiers should be done. ;; ;; (4) Since this breaks the assumption that message indices increase as ;; one goes down the buffer, the binary search based mh-goto-msg ;; doesn't work. I have a simpler replacement which may be less ;; efficient. ;; -;; (5) Better canonicalizing for message-id and subject strings. +;; (5) Better canonicalizing for message identifier and subject strings. ;; ;; Internal support for MH-E package. ;;; Change Log: -;; $Id: mh-seq.el,v 1.10 2003/01/08 23:21:16 wohler Exp $ +;; $Id: mh-seq.el,v 1.101 2003/01/26 00:57:35 jchonig Exp $ ;;; Code: @@ -100,15 +101,15 @@ ;;; Maps and hashes... (defvar mh-thread-id-hash nil - "Hashtable used to canonicalize message-id strings.") + "Hashtable used to canonicalize message identifiers.") (defvar mh-thread-subject-hash nil "Hashtable used to canonicalize subject strings.") (defvar mh-thread-id-table nil - "Thread ID table maps from message-id's to message containers.") + "Thread ID table maps from message identifiers to message containers.") (defvar mh-thread-id-index-map nil - "Table to lookup message index number from message-id.") + "Table to look up message index number from message identifier.") (defvar mh-thread-index-id-map nil - "Table to lookup message-id from message index.") + "Table to look up message identifier from message index.") (defvar mh-thread-scan-line-map nil "Map of message index to various parts of the scan line.") (defvar mh-thread-old-scan-line-map nil @@ -117,7 +118,7 @@ This is the original map that is stored when the folder is narrowed.") (defvar mh-thread-subject-container-hash nil "Hashtable used to group messages by subject.") (defvar mh-thread-duplicates nil - "Hashtable used to remember multiple messages with the same message-id.") + "Hashtable used to associate messages with the same message identifier.") (defvar mh-thread-history () "Variable to remember the transformations to the thread tree. When new messages are added, these transformations are rewound, then the @@ -141,10 +142,12 @@ redone to get the new thread tree. This makes incremental threading easier.") (defun mh-delete-seq (sequence) "Delete the SEQUENCE." (interactive (list (mh-read-seq-default "Delete" t))) - (mh-map-to-seq-msgs 'mh-notate-if-in-one-seq sequence ? (1+ mh-cmd-note) - sequence) - (mh-undefine-sequence sequence '("all")) - (mh-delete-seq-locally sequence)) + (let ((msg-list (mh-seq-to-msgs sequence))) + (mh-undefine-sequence sequence '("all")) + (mh-delete-seq-locally sequence) + (mh-iterate-on-messages-in-region msg (point-min) (point-max) + (when (and (member msg msg-list) (not (mh-seq-containing-msg msg nil))) + (mh-notate nil ? (1+ mh-cmd-note)))))) ;; Avoid compiler warnings (defvar view-exit-action) @@ -154,7 +157,7 @@ redone to get the new thread tree. This makes incremental threading easier.") "List the sequences defined in the folder being visited." (interactive) (let ((folder mh-current-folder) - (temp-buffer mh-temp-sequences-buffer) + (temp-buffer mh-sequences-buffer) (seq-list mh-seq-list) (max-len 0)) (with-output-to-temp-buffer temp-buffer @@ -223,7 +226,7 @@ Use \\<mh-folder-mode-map>\\[mh-widen] to undo this command." (narrow-to-region eob (point-max)) (mh-notate-user-sequences) (mh-notate-deleted-and-refiled) - (mh-notate-seq 'cur mh-note-cur mh-cmd-note) + (mh-notate-cur) (when msg-at-cursor (mh-goto-msg msg-at-cursor t t)) (make-variable-buffer-local 'mh-non-seq-mode-line-annotation) (setq mh-non-seq-mode-line-annotation mh-mode-line-annotation) @@ -246,18 +249,28 @@ If variable `transient-mark-mode' is non-nil and the mark is active, then the selected region is added to the sequence." (interactive (list (cond ((mh-mark-active-p t) - (mh-region-to-msg-list (region-beginning) (region-end))) + (cons (region-beginning) (region-end))) (current-prefix-arg (mh-read-seq-default "Add messages from" t)) (t - (mh-get-msg-num t))) + (cons (line-beginning-position) (line-end-position)))) (mh-read-seq-default "Add to" nil))) - (if (not (mh-internal-seq sequence)) - (setq mh-last-seq-used sequence)) - (mh-add-msgs-to-seq (cond ((numberp msg-or-seq) (list msg-or-seq)) - ((listp msg-or-seq) msg-or-seq) - (t (mh-seq-to-msgs msg-or-seq))) - sequence)) + (let ((internal-seq-flag (mh-internal-seq sequence)) + msg-list) + (cond ((and (consp msg-or-seq) + (numberp (car msg-or-seq)) (numberp (cdr msg-or-seq))) + (mh-iterate-on-messages-in-region m (car msg-or-seq) (cdr msg-or-seq) + (push m msg-list) + (unless internal-seq-flag + (mh-notate nil mh-note-seq (1+ mh-cmd-note)))) + (mh-add-msgs-to-seq msg-list sequence internal-seq-flag t)) + ((or (numberp msg-or-seq) (listp msg-or-seq)) + (when (numberp msg-or-seq) + (setq msg-or-seq (list msg-or-seq))) + (mh-add-msgs-to-seq msg-or-seq sequence internal-seq-flag)) + (t (mh-add-msgs-to-seq (mh-seq-to-msgs msg-or-seq) sequence))) + (if (not internal-seq-flag) + (setq mh-last-seq-used sequence)))) (defun mh-valid-view-change-operation-p (op) "Check if the view change operation can be performed. @@ -289,7 +302,7 @@ OP is one of 'widen and 'unthread." (mh-goto-msg msg t t)) (mh-notate-deleted-and-refiled) (mh-notate-user-sequences) - (mh-notate-seq 'cur mh-note-cur mh-cmd-note) + (mh-notate-cur) (mh-recenter nil))) (if (and (boundp 'tool-bar-mode) tool-bar-mode) (set (make-local-variable 'tool-bar-map) mh-folder-tool-bar-map)) @@ -301,15 +314,18 @@ OP is one of 'widen and 'unthread." "Notate messages marked for deletion or refiling. Messages to be deleted are given by `mh-delete-list' while messages to be refiled are present in `mh-refile-list'." - (mh-mapc #'(lambda (msg) (mh-notate msg mh-note-deleted mh-cmd-note)) - mh-delete-list) - (mh-mapc #'(lambda (dest-msg-list) - ;; foreach folder name, get the keyed sequence from mh-seq-list - (let ((msg-list (cdr dest-msg-list))) - (mh-mapc #'(lambda (msg) - (mh-notate msg mh-note-refiled mh-cmd-note)) - msg-list))) - mh-refile-list)) + (let ((refiled-hash (make-hash-table)) + (deleted-hash (make-hash-table))) + (dolist (msg mh-delete-list) + (setf (gethash msg deleted-hash) t)) + (dolist (dest-msg-list mh-refile-list) + (dolist (msg (cdr dest-msg-list)) + (setf (gethash msg refiled-hash) t))) + (mh-iterate-on-messages-in-region msg (point-min) (point-max) + (cond ((gethash msg refiled-hash) + (mh-notate nil mh-note-refiled mh-cmd-note)) + ((gethash msg deleted-hash) + (mh-notate nil mh-note-deleted mh-cmd-note)))))) @@ -380,7 +396,22 @@ passed as arguments to FUNC." "Mark the scan listing. All messages in SEQ are marked with NOTATION at OFFSET from the beginning of the line." - (mh-map-to-seq-msgs 'mh-notate seq notation offset)) + (let ((msg-list (mh-seq-to-msgs seq))) + (mh-iterate-on-messages-in-region msg (point-min) (point-max) + (when (member msg msg-list) + (mh-notate nil notation offset))))) + +;;;###mh-autoload +(defun mh-notate-cur () + "Mark the MH sequence cur. +In addition to notating the current message with `mh-note-cur' the function +uses `overlay-arrow-position' to put a marker in the fringe." + (let ((cur (car (mh-seq-to-msgs 'cur)))) + (when (and cur (mh-goto-msg cur t t)) + (mh-notate nil mh-note-cur mh-cmd-note) + (beginning-of-line) + (setq mh-arrow-marker (set-marker mh-arrow-marker (point))) + (setq overlay-arrow-position mh-arrow-marker)))) ;;;###mh-autoload (defun mh-add-to-sequence (seq msgs) @@ -449,18 +480,32 @@ LOCATION." (insert-buffer-substring (current-buffer) beginning-of-line end)))) ;;;###mh-autoload +(defmacro mh-iterate-on-messages-in-region (var begin end &rest body) + "Iterate over region. +VAR is bound to the message on the current line as we loop starting from BEGIN +till END. In each step BODY is executed. + +If VAR is nil then the loop is executed without any binding." + (unless (symbolp var) + (error "Can not bind the non-symbol %s" var)) + (let ((binding-needed-flag var)) + `(save-excursion + (goto-char ,begin) + (while (and (<= (point) ,end) (not (eobp))) + (when (looking-at mh-scan-valid-regexp) + (let ,(if binding-needed-flag `((,var (mh-get-msg-num t))) ()) + ,@body)) + (forward-line 1))))) + +;;;###mh-autoload (defun mh-region-to-msg-list (begin end) "Return a list of messages within the region between BEGIN and END." - (save-excursion - ;; If end is end of buffer back up one position - (setq end (if (equal end (point-max)) (1- end) end)) - (goto-char begin) - (let ((result ())) - (while (<= (point) end) - (let ((index (mh-get-msg-num nil))) - (when (numberp index) (push index result))) - (forward-line 1)) - result))) + ;; If end is end of buffer back up one position + (setq end (if (equal end (point-max)) (1- end) end)) + (let ((result)) + (mh-iterate-on-messages-in-region index begin end + (when (numberp index) (push index result))) + result)) @@ -877,13 +922,14 @@ table." ;;; Generate Threads... +(defvar mh-message-id-regexp "^<.*@.*>$" + "Regexp to recognize whether a string is a message identifier.") + (defun mh-thread-generate (folder msg-list) "Scan FOLDER to get info for threading. Only information about messages in MSG-LIST are added to the tree." - (save-excursion - (set-buffer (get-buffer-create "*mh-thread*")) + (with-temp-buffer (mh-thread-set-tables folder) - (erase-buffer) (when msg-list (apply #'call-process (expand-file-name mh-scan-prog mh-progs) nil '(t nil) nil @@ -917,7 +963,9 @@ Only information about messages in MSG-LIST are added to the tree." (multiple-value-setq (subject subject-re-p) (mh-thread-prune-subject subject)) (setq in-reply-to (mh-thread-process-in-reply-to in-reply-to)) - (setq refs (append (split-string refs) in-reply-to)) + (setq refs (loop for x in (append (split-string refs) in-reply-to) + when (string-match mh-message-id-regexp x) + collect x)) (setq id (mh-thread-canonicalize-id id)) (mh-thread-update-id-index-maps id index) (setq refs (mapcar #'mh-thread-canonicalize-id refs)) @@ -963,7 +1011,7 @@ All messages after START-POINT are added to the thread tree." (mh-thread-generate-scan-lines thread-tree -2)) (mh-notate-user-sequences) (mh-notate-deleted-and-refiled) - (mh-notate-seq 'cur mh-note-cur mh-cmd-note) + (mh-notate-cur) (set-buffer-modified-p old-buffer-modified-flag)))) (defvar mh-thread-last-ancestor) @@ -997,20 +1045,19 @@ the message." (while (mh-container-parent mh-thread-last-ancestor) (setq mh-thread-last-ancestor (mh-container-parent mh-thread-last-ancestor)))) - (insert (car scan-line) - (format (format "%%%ss" - (if dupl-flag level new-level)) "") - (if (and (mh-container-real-child-p tree) dupl-flag - (not force-angle-flag)) - "[" "<") - (cadr scan-line) - (if (and (mh-container-real-child-p tree) dupl-flag - (not force-angle-flag)) - "]" ">") - (truncate-string-to-width - (caddr scan-line) (- mh-thread-body-width - (if dupl-flag level new-level))) - "\n") + (let* ((lev (if dupl-flag level new-level)) + (square-flag (or (and (mh-container-real-child-p tree) + (not force-angle-flag) + dupl-flag) + (equal lev 0)))) + (insert (car scan-line) + (format (format "%%%ss" lev) "") + (if square-flag "[" "<") + (cadr scan-line) + (if square-flag "]" ">") + (truncate-string-to-width + (caddr scan-line) (- mh-thread-body-width lev)) + "\n")) (setq increment-level-flag t) (setq dupl-flag nil))) (unless increment-level-flag (setq new-level level)) @@ -1057,51 +1104,50 @@ Otherwise uses the line at point as the scan line to parse." (message "Threading %s..." (buffer-name)) (mh-thread-initialize) (goto-char (point-min)) - (while (not (eobp)) - (let ((index (mh-get-msg-num nil))) - (when (numberp index) - (setf (gethash index mh-thread-scan-line-map) - (mh-thread-parse-scan-line)))) - (forward-line)) - (let* ((range (format "%s-%s" mh-first-msg-num mh-last-msg-num)) - (thread-tree (mh-thread-generate (buffer-name) (list range)))) - (delete-region (point-min) (point-max)) - (let ((mh-thread-body-width (- (window-width) mh-cmd-note - (1- mh-scan-field-subject-start-offset))) - (mh-thread-last-ancestor nil)) - (mh-thread-generate-scan-lines thread-tree -2)) - (mh-notate-user-sequences) - (mh-notate-deleted-and-refiled) - (mh-notate-seq 'cur mh-note-cur mh-cmd-note) - (message "Threading %s...done" (buffer-name)))) + (let ((msg-list ())) + (while (not (eobp)) + (let ((index (mh-get-msg-num nil))) + (when (numberp index) + (push index msg-list) + (setf (gethash index mh-thread-scan-line-map) + (mh-thread-parse-scan-line)))) + (forward-line)) + (let* ((range (mh-coalesce-msg-list msg-list)) + (thread-tree (mh-thread-generate (buffer-name) range))) + (delete-region (point-min) (point-max)) + (let ((mh-thread-body-width (- (window-width) mh-cmd-note + (1- mh-scan-field-subject-start-offset))) + (mh-thread-last-ancestor nil)) + (mh-thread-generate-scan-lines thread-tree -2)) + (mh-notate-user-sequences) + (mh-notate-deleted-and-refiled) + (mh-notate-cur) + (message "Threading %s...done" (buffer-name))))) ;;;###mh-autoload (defun mh-toggle-threads () - "Toggle threaded view of folder. -The conversion of normal view to threaded view is exact, that is the same -messages are displayed in the folder buffer before and after threading. However -the conversion from threaded view to normal view is inexact. So more messages -than were originally present may be shown as a result." + "Toggle threaded view of folder." (interactive) (let ((msg-at-point (mh-get-msg-num nil)) (old-buffer-modified-flag (buffer-modified-p)) (buffer-read-only nil)) - (cond ((and (memq 'unthread mh-view-ops) mh-narrowed-to-seq) - (unless (mh-valid-view-change-operation-p 'unthread) - (error "Can't unthread folder")) - (mh-scan-folder mh-current-folder - (format "%s" mh-narrowed-to-seq) - t) - (when mh-index-data - (mh-index-insert-folder-headers))) - ((memq 'unthread mh-view-ops) + (cond ((memq 'unthread mh-view-ops) (unless (mh-valid-view-change-operation-p 'unthread) (error "Can't unthread folder")) - (mh-scan-folder mh-current-folder - (format "%s-%s" mh-first-msg-num mh-last-msg-num) - t) + (let ((msg-list ())) + (goto-char (point-min)) + (while (not (eobp)) + (let ((index (mh-get-msg-num t))) + (when index + (push index msg-list))) + (forward-line)) + (mh-scan-folder mh-current-folder + (mapcar #'(lambda (x) (format "%s" x)) + (mh-coalesce-msg-list msg-list)) + t)) (when mh-index-data - (mh-index-insert-folder-headers))) + (mh-index-insert-folder-headers) + (mh-notate-cur))) (t (mh-thread-folder) (push 'unthread mh-view-ops))) (when msg-at-point (mh-goto-msg msg-at-point t t)) @@ -1244,28 +1290,23 @@ start of the region and the second is the point at the end." (error "Folder isn't threaded")) ((eobp) (error "No message at point")) - (t (mh-delete-msg - (apply #'mh-region-to-msg-list (mh-thread-find-children)))))) + (t (let ((region (mh-thread-find-children))) + (mh-iterate-on-messages-in-region () (car region) (cadr region) + (mh-delete-a-msg nil)) + (mh-next-msg))))) -;; This doesn't handle mh-default-folder-for-message-function. We should -;; refactor that code so that we don't copy it. ;;;###mh-autoload (defun mh-thread-refile (folder) "Mark current message and all its children for refiling to FOLDER." - (interactive (list - (intern (mh-prompt-for-folder - "Destination" - (cond ((eq 'refile (car mh-last-destination-folder)) - (symbol-name (cdr mh-last-destination-folder))) - (t "")) - t)))) + (interactive (list (intern (mh-prompt-for-refile-folder)))) (cond ((not (memq 'unthread mh-view-ops)) (error "Folder isn't threaded")) ((eobp) (error "No message at point")) - (t (mh-refile-msg - (apply #'mh-region-to-msg-list (mh-thread-find-children)) - folder)))) + (t (let ((region (mh-thread-find-children))) + (mh-iterate-on-messages-in-region () (car region) (cadr region) + (mh-refile-a-msg nil folder)) + (mh-next-msg))))) (provide 'mh-seq) diff --git a/lisp/mh-e/mh-speed.el b/lisp/mh-e/mh-speed.el index e57660d051a..ca60b2f7840 100644 --- a/lisp/mh-e/mh-speed.el +++ b/lisp/mh-e/mh-speed.el @@ -31,7 +31,7 @@ ;;; Change Log: -;; $Id: mh-speed.el,v 1.2 2003/01/08 23:21:16 wohler Exp $ +;; $Id: mh-speed.el,v 1.37 2003/01/31 03:18:18 satyaki Exp $ ;;; Code: @@ -44,7 +44,6 @@ (defvar mh-speed-refresh-flag nil) (defvar mh-speed-last-selected-folder nil) (defvar mh-speed-folder-map (make-hash-table :test #'equal)) -(defvar mh-speed-folders-cache (make-hash-table :test #'equal)) (defvar mh-speed-flists-cache (make-hash-table :test #'equal)) (defvar mh-speed-flists-process nil) (defvar mh-speed-flists-timer nil) @@ -256,7 +255,7 @@ Do the right thing for the different kinds of buffers that MH-E uses." (defun mh-speed-add-buttons (folder level) "Add speedbar button for FOLDER which is at indented by LEVEL amount." - (let ((folder-list (mh-speed-folders folder))) + (let ((folder-list (mh-sub-folders folder))) (mapc (lambda (f) (let* ((folder-name (format "%s%s%s" (or folder "+") @@ -344,58 +343,7 @@ Optional ARGS are ignored." (mh-visit-folder folder range) (delete-other-windows))))) -(defun mh-speed-folders (folder) - "Find the subfolders of FOLDER. -The function avoids running folders unnecessarily by caching the results of -the actual folders call." - (let ((match (gethash folder mh-speed-folders-cache 'no-result))) - (cond ((eq match 'no-result) - (setf (gethash folder mh-speed-folders-cache) - (mh-speed-folders-actual folder))) - (t match)))) - -(defun mh-speed-folders-actual (folder) - "Execute the command folders to return the sub-folders of FOLDER. -Filters out the folder names that start with \".\" so that directories that -aren't usually mail folders are hidden." - (let* ((folder (cond ((and (stringp folder) - (equal (substring folder 0 1) "+")) - folder) - (t nil))) - (arg-list `(,(expand-file-name "folders" mh-progs) - nil (t nil) nil "-noheader" "-norecurse" - ,@(if (stringp folder) (list folder) ()))) - (results ())) - (with-temp-buffer - (apply #'call-process arg-list) - (goto-char (point-min)) - (while (not (and (eolp) (bolp))) - (goto-char (line-end-position)) - (let ((has-pos (search-backward " has " (line-beginning-position) t))) - (when (integerp has-pos) - (while (or (equal (char-after has-pos) ? ) - (equal (char-after has-pos) ?+)) - (decf has-pos)) - (incf has-pos) - (let ((name (buffer-substring (line-beginning-position) has-pos))) - (let ((first-char (substring name 0 1))) - (unless (or (string-equal first-char ".") - (string-equal first-char "#") - (string-equal first-char ",")) - (push - (cons name - (search-forward "(others)" (line-end-position) t)) - results))))) - (forward-line 1)))) - (setq results (nreverse results)) - (when (stringp folder) - (setq results (cdr results)) - (let ((folder-name-len (length (format "%s/" (substring folder 1))))) - (setq results (mapcar (lambda (f) - (cons (substring (car f) folder-name-len) - (cdr f))) - results)))) - results)) +(defvar mh-speed-current-folder nil) ;;;###mh-autoload (defun mh-speed-flists (force) @@ -418,9 +366,17 @@ If FORCE is non-nil the timer is reset." (unless (and (processp mh-speed-flists-process) (not (eq (process-status mh-speed-flists-process) 'exit))) + (setq mh-speed-current-folder + (concat + (with-temp-buffer + (call-process (expand-file-name "folder" mh-progs) + nil '(t nil) nil "-fast") + (buffer-substring (point-min) (1- (point-max)))) + "+")) (setq mh-speed-flists-process - (start-process (expand-file-name "flists" mh-progs) nil - "flists" "-recurse" + (start-process "*flists*" nil + (expand-file-name "flists" mh-progs) + "-recurse" "-sequence" (symbol-name mh-unseen-seq))) (set-process-filter mh-speed-flists-process 'mh-speed-parse-flists-output))))))) @@ -440,7 +396,7 @@ next." (substring output position line-end)) mh-speed-partial-line "") (multiple-value-setq (folder unseen total) - (mh-parse-flist-output-line line)) + (mh-parse-flist-output-line line mh-speed-current-folder)) (when (and folder unseen total) (setf (gethash folder mh-speed-flists-cache) (cons unseen total)) (save-excursion @@ -489,10 +445,8 @@ next." (parent (if last-slash (substring folder 0 last-slash) nil)) (parent-position (gethash parent mh-speed-folder-map)) (parent-change nil)) - (remhash parent mh-speed-folders-cache) - (remhash folder mh-speed-folders-cache) (when parent-position - (let ((parent-kids (mh-speed-folders parent))) + (let ((parent-kids (mh-sub-folders parent))) (cond ((null parent-kids) (setq parent-change ?+)) ((and (null (cdr parent-kids)) @@ -517,7 +471,7 @@ next." (setq mh-speed-last-selected-folder nil) (setq mh-speed-refresh-flag t))) (when (equal folder "") - (clrhash mh-speed-folders-cache))))) + (clrhash mh-sub-folders-cache))))) ;;;###mh-autoload (defun mh-speed-add-folder (folder) @@ -545,7 +499,6 @@ The function invalidates the latest ancestor that is present." `(mh-children-p t))) (when (get-text-property (line-beginning-position) 'mh-expanded) (mh-speed-toggle)) - (remhash ancestor mh-speed-folders-cache) (setq mh-speed-refresh-flag t)))) ;; Make it slightly more general to allow for [ ] buttons to be changed to diff --git a/lisp/mh-e/mh-utils.el b/lisp/mh-e/mh-utils.el index d4057d92ece..34332dc202a 100644 --- a/lisp/mh-e/mh-utils.el +++ b/lisp/mh-e/mh-utils.el @@ -30,7 +30,7 @@ ;;; Change Log: -;; $Id: mh-utils.el,v 1.34 2003/01/08 23:21:16 wohler Exp $ +;; $Id: mh-utils.el,v 1.214 2003/01/27 04:42:23 wohler Exp $ ;;; Code: @@ -121,7 +121,7 @@ variable `transient-mark-mode' is active." "Regexp to find the number of a message in a scan line. The message's number must be surrounded with \\( \\)") -(defvar mh-scan-msg-overflow-regexp "^\\?[0-9]" +(defvar mh-scan-msg-overflow-regexp "^[?0-9][0-9]" "Regexp to find a scan line in which the message number overflowed. The message's number is left truncated in this case.") @@ -149,7 +149,7 @@ default, or nil to calculate the default the usual way. NOTE: This variable is not an ordinary hook; It may not be a list of functions.") -(defvar mh-show-buffer-mode-line-buffer-id "{show-%s} %d" +(defvar mh-show-buffer-mode-line-buffer-id " {show-%s} %d" "Format string to produce `mode-line-buffer-identification' for show buffers. First argument is folder name. Second is message number.") @@ -464,11 +464,6 @@ message about the fontification operation." ;;; Internal bookkeeping variables: -;; The value of `mh-folder-list-change-hook' is called whenever -;; mh-folder-list variable is set. -;; List of folder names for completion. -(defvar mh-folder-list nil) - ;; Cached value of the `Path:' component in the user's MH profile. ;; User's mail folder directory. (defvar mh-user-path nil) @@ -492,14 +487,20 @@ message about the fontification operation." ;; Name of the Inbox folder. (defvar mh-inbox nil) -;; Name of MH-E scratch buffer. -(defconst mh-temp-buffer " *mh-temp*") - -;; Name of the MH-E folder list buffer. -(defconst mh-temp-folders-buffer "*Folders*") - -;; Name of the MH-E sequences list buffer. -(defconst mh-temp-sequences-buffer "*Sequences*") +;; The names of ephemeral buffers have a " *mh-" prefix (so that they are +;; hidden and can be programmatically removed in mh-quit), and the variable +;; names have the form mh-temp-.*-buffer. +(defconst mh-temp-buffer " *mh-temp*") ;scratch + +;; The names of MH-E buffers that are not ephemeral and can be used by the +;; user (and deleted by the user when no longer needed) have a "*MH-E " prefix +;; (so they can be programmatically removed in mh-quit), and the variable +;; names have the form mh-.*-buffer. +(defconst mh-folders-buffer "*MH-E Folders*") ;folder list +(defconst mh-info-buffer "*MH-E Info*") ;version information buffer +(defconst mh-log-buffer "*MH-E Log*") ;output of MH commands and so on +(defconst mh-recipients-buffer "*MH-E Recipients*") ;killed when draft sent +(defconst mh-sequences-buffer "*MH-E Sequences*") ;sequences list ;; Window configuration before MH-E command. (defvar mh-previous-window-config nil) @@ -530,6 +531,19 @@ message about the fontification operation." (defvar mh-show-folder-buffer nil "Keeps track of folder whose message is being displayed.") +(defvar mh-logo-cache nil) + +(defun mh-logo-display () + "Modify mode line to display MH-E logo." + (when (fboundp 'find-image) + (add-text-properties + 0 2 + `(display ,(or mh-logo-cache + (setq mh-logo-cache + (find-image '((:type xpm :ascent center + :file "mh-logo.xpm")))))) + (car mode-line-buffer-identification)))) + ;;; This holds a documentation string used by describe-mode. (defun mh-showing-mode (&optional arg) "Change whether messages should be displayed. @@ -1133,22 +1147,25 @@ The message is displayed in raw form." (delete-other-windows) (switch-to-buffer edit-buffer))) -(defun mh-decode-quoted-printable () - "Run mimedecode on current buffer, replacing its contents." - (let ((case-fold-search t)) +(defun mh-decode-content-transfer-encoded-message () + "Run mimencode on message body, if needed." + (let ((case-fold-search t) + (header-end (mail-header-end))) (goto-char (point-min)) - (when (and (re-search-forward - "^content-transfer-encoding:[ \t]*quoted-printable" - (if mh-decode-mime-flag (mail-header-end) nil) t) - (search-forward "\n\n" nil t)) - (message "Converting quoted-printable characters...") - (let ((modified (buffer-modified-p)) - (command "mimedecode")) - (shell-command-on-region (point-min) (point-max) command t t) - (if (fboundp 'deactivate-mark) - (deactivate-mark)) - (set-buffer-modified-p modified)) - (message "Converting quoted-printable characters... done.")))) + (when (re-search-forward "^content-transfer-encoding: " header-end t) + (let ((enc (buffer-substring-no-properties (point) (line-end-position))) + cmdline) + (setq cmdline + (cond ((string-match "base64" enc) (list "-u" "-b" "-p")) + ((string-match "quoted-printable" enc) (list "-u" "-q")) + (t nil))) + (when cmdline + (beginning-of-line) + (insert "Removed-") + (setq header-end (mail-header-end)) + (goto-char (1+ header-end)) + (apply #'call-process-region (1+ header-end) (point-max) "mimencode" + t t nil cmdline)))))) (defun mh-show-unquote-From () "Decode >From at beginning of lines for `mh-show-mode'." @@ -1208,9 +1225,9 @@ Sets the current buffer to the show buffer." (if (stringp formfile) (list "-form" formfile)) msg-filename) - (insert-file-contents msg-filename)) - (if mh-decode-quoted-printable-flag - (mh-decode-quoted-printable)) + (insert-file-contents-literally msg-filename)) + (if mh-decode-content-transfer-encoded-message-flag + (mh-decode-content-transfer-encoded-message)) ;; Cleanup old mime handles (mh-mime-cleanup) ;; Use mm to display buffer @@ -1248,6 +1265,7 @@ Sets the current buffer to the show buffer." (setq mode-line-buffer-identification (list (format mh-show-buffer-mode-line-buffer-id folder-name msg-num))) + (mh-logo-display) (set-buffer folder) (setq mh-showing-with-headers nil)))))) @@ -1407,12 +1425,7 @@ arguments, after these variable have been set." (setq mh-previous-seq (mh-get-profile-field "Previous-Sequence:")) (if mh-previous-seq (setq mh-previous-seq (intern mh-previous-seq))) - (run-hooks 'mh-find-path-hook))) - (and mh-auto-folder-collect-flag - (let ((mh-no-install t)) ;only get folders if MH installed - (condition-case err - (mh-make-folder-list-background) - (file-error))))) ;so don't complain if not installed + (run-hooks 'mh-find-path-hook)))) (defun mh-file-command-p (file) "Return t if file FILE is the name of a executable regular file." @@ -1537,11 +1550,14 @@ The message number width portion of the format is discovered using (match-beginning 1) (match-end 1)))))) width)) -(defun mh-add-msgs-to-seq (msgs seq &optional internal-flag) +(defun mh-add-msgs-to-seq (msgs seq &optional internal-flag dont-annotate-flag) "Add MSGS to SEQ. Remove duplicates and keep sequence sorted. If optional INTERNAL-FLAG is non-nil, do not mark the message in the scan listing or inform MH of the -addition." +addition. + +If DONT-ANNOTATE-FLAG is non-nil then the annotations in the folder buffer are +not updated." (let ((entry (mh-find-seq seq))) (if (and msgs (atom msgs)) (setq msgs (list msgs))) (if (null entry) @@ -1552,7 +1568,8 @@ addition." (append msgs (mh-seq-msgs entry)))))) (cond ((not internal-flag) (mh-add-to-sequence seq msgs) - (mh-notate-seq seq mh-note-seq (1+ mh-cmd-note)))))) + (unless dont-annotate-flag + (mh-notate-seq seq mh-note-seq (1+ mh-cmd-note))))))) (defun mh-canonicalize-sequence (msgs) "Sort MSGS in decreasing order and remove duplicates." @@ -1564,19 +1581,193 @@ addition." (setq head (cdr head)))) sorted-msgs)) +(defvar mh-sub-folders-cache (make-hash-table :test #'equal)) + +(defun mh-normalize-folder-name (folder &optional empty-string-okay + dont-remove-trailing-slash) + "Normalizes FOLDER name. +Makes sure that two '/' characters never occur next to each other. Also all +occurrences of \"..\" and \".\" are suitably processed. So \"+inbox/../news\" +will be normalized to \"+news\". + +If optional argument EMPTY-STRING-OKAY is nil then a '+' is added at the +front if FOLDER lacks one. If non-nil and FOLDER is the empty string then +nothing is added. + +If optional argument DONT-REMOVE-TRAILING-SLASH is non-nil then a trailing '/' +if present is retained (if present), otherwise it is removed." + (when (stringp folder) + ;; Replace two or more consecutive '/' characters with a single '/' + (while (string-match "//" folder) + (setq folder (replace-match "/" nil t folder))) + (let* ((length (length folder)) + (trailing-slash-present (and (> length 0) + (equal (aref folder (1- length)) ?/)))) + (let ((components (split-string folder "/")) + (result ())) + ;; Remove .. and . from the pathname. + (dolist (component components) + (cond ((and (equal component "..") result) + (pop result)) + ((equal component "..")) + ((equal component ".")) + (t (push component result)))) + (setq folder "") + (dolist (component result) + (setq folder (concat component "/" folder))) + ;; Remove trailing '/' if needed. + (unless (and trailing-slash-present dont-remove-trailing-slash) + (when (not (equal folder "")) + (setq folder (substring folder 0 (1- (length folder)))))))) + (cond ((and empty-string-okay (equal folder ""))) + ((equal folder "") (setq folder "+")) + ((not (equal (aref folder 0) ?+)) (setq folder (concat "+" folder))))) + folder) + +(defun mh-sub-folders (folder &optional add-trailing-slash-flag) + "Find the subfolders of FOLDER. +The function avoids running folders unnecessarily by caching the results of +the actual folders call. + +If optional argument ADD-TRAILING-SLASH-FLAG is non-nil then a slash is added +to each of the sub-folder names that may have nested folders within them." + (let* ((folder (mh-normalize-folder-name folder)) + (match (gethash folder mh-sub-folders-cache 'no-result)) + (sub-folders (cond ((eq match 'no-result) + (setf (gethash folder mh-sub-folders-cache) + (mh-sub-folders-actual folder))) + (t match)))) + (if add-trailing-slash-flag + (mapcar #'(lambda (x) + (if (cdr x) (cons (concat (car x) "/") (cdr x)) x)) + sub-folders) + sub-folders))) + +(defun mh-sub-folders-actual (folder) + "Execute the command folders to return the sub-folders of FOLDER. +Filters out the folder names that start with \".\" so that directories that +aren't usually mail folders are hidden." + (let ((arg-list `(,(expand-file-name "folders" mh-progs) + nil (t nil) nil "-noheader" "-norecurse" "-nototal" + ,@(if (stringp folder) (list folder) ()))) + (results ()) + (current-folder (concat + (with-temp-buffer + (call-process (expand-file-name "folder" mh-progs) + nil '(t nil) nil "-fast") + (buffer-substring (point-min) (1- (point-max)))) + "+"))) + (with-temp-buffer + (apply #'call-process arg-list) + (goto-char (point-min)) + (while (not (and (eolp) (bolp))) + (goto-char (line-end-position)) + (let ((has-pos (search-backward " has " (line-beginning-position) t))) + (when (integerp has-pos) + (while (equal (char-after has-pos) ? ) + (decf has-pos)) + (incf has-pos) + (let* ((name (buffer-substring (line-beginning-position) has-pos)) + (first-char (aref name 0)) + (last-char (aref name (1- (length name))))) + (unless (member first-char '(?. ?# ?,)) + (when (and (equal last-char ?+) (equal name current-folder)) + (setq name (substring name 0 (1- (length name))))) + (push + (cons name + (search-forward "(others)" (line-end-position) t)) + results)))) + (forward-line 1)))) + (setq results (nreverse results)) + (when (stringp folder) + (setq results (cdr results)) + (let ((folder-name-len (length (format "%s/" (substring folder 1))))) + (setq results (mapcar (lambda (f) + (cons (substring (car f) folder-name-len) + (cdr f))) + results)))) + results)) + +(defun mh-remove-from-sub-folders-cache (folder) + "Remove FOLDER and its parent from `mh-sub-folders-cache'. +FOLDER should be unconditionally removed from the cache. Also the last ancestor +of FOLDER present in the cache must be removed as well. + +To see why this is needed assume we have a folder +foo which has a single +sub-folder qux. Now we create the folder +foo/bar/baz. Here we will need to +invalidate the cached sub-folders of +foo, otherwise completion on +foo won't +tell us about the option +foo/bar!" + (remhash folder mh-sub-folders-cache) + (block ancestor-found + (let ((parent folder) + (one-ancestor-found nil) + last-slash) + (while (setq last-slash (mh-search-from-end ?/ parent)) + (setq parent (substring parent 0 last-slash)) + (unless (eq (gethash parent mh-sub-folders-cache 'none) 'none) + (remhash parent mh-sub-folders-cache) + (if one-ancestor-found + (return-from ancestor-found) + (setq one-ancestor-found t)))) + (remhash nil mh-sub-folders-cache)))) + (defvar mh-folder-hist nil) (defvar mh-speed-folder-map) +(defvar mh-folder-completion-map (copy-keymap minibuffer-local-completion-map)) +(define-key mh-folder-completion-map " " 'minibuffer-complete) + +(defun mh-folder-completion-function (name predicate flag) + "Programmable completion for folder names. +NAME is the partial folder name that has been input. PREDICATE if non-nil is a +function that is used to filter the possible choices and FLAG determines +whether the completion is over." + (let* ((orig-name name) + (name (mh-normalize-folder-name name nil t)) + (last-slash (mh-search-from-end ?/ name)) + (last-complete (if last-slash (substring name 0 last-slash) nil)) + (remainder (cond (last-complete (substring name (1+ last-slash))) + ((and (> (length name) 0) (equal (aref name 0) ?+)) + (substring name 1)) + (t "")))) + (cond ((eq flag nil) + (let ((try-res (try-completion + name + (mapcar (lambda (x) + (cons (if (not last-complete) + (concat "+" (car x)) + (concat last-complete "/" (car x))) + (cdr x))) + (mh-sub-folders last-complete t)) + predicate))) + (cond ((eq try-res nil) nil) + ((and (eq try-res t) (equal name orig-name)) t) + ((eq try-res t) name) + (t try-res)))) + ((eq flag t) + (all-completions + remainder (mh-sub-folders last-complete t) predicate)) + ((eq flag 'lambda) + (file-exists-p + (concat mh-user-path + (substring (mh-normalize-folder-name name) 1))))))) + +(defun mh-folder-completing-read (prompt default) + "Read folder name with PROMPT and default result DEFAULT." + (mh-normalize-folder-name + (let ((minibuffer-local-completion-map mh-folder-completion-map)) + (completing-read prompt 'mh-folder-completion-function nil nil nil + 'mh-folder-hist default)) + t)) (defun mh-prompt-for-folder (prompt default can-create - &optional default-string) + &optional default-string allow-root-folder-flag) "Prompt for a folder name with PROMPT. Returns the folder's name as a string. DEFAULT is used if the folder exists and the user types return. If the CAN-CREATE flag is t, then a folder is created if it doesn't already exist. If optional argument DEFAULT-STRING is -non-nil, use it in the prompt instead of DEFAULT. -The value of `mh-folder-list-change-hook' is a list of functions to be called, -with no arguments, whenever the cached folder list `mh-folder-list' is -changed." +non-nil, use it in the prompt instead of DEFAULT. If ALLOW-ROOT-FOLDER-FLAG is +non-nil then the function will accept the folder +, which means all folders +when used in searching." (if (null default) (setq default "")) (let* ((default-string (cond (default-string (format " [%s]? " @@ -1585,13 +1776,11 @@ changed." (t (format " [%s]? " default)))) (prompt (format "%s folder%s" prompt default-string)) read-name folder-name) - (if (null mh-folder-list) - (mh-set-folder-list)) - (while (and (setq read-name (completing-read prompt mh-folder-list nil nil - "+" 'mh-folder-hist)) + (while (and (setq read-name (mh-folder-completing-read prompt default)) (equal read-name "") (equal default ""))) - (cond ((or (equal read-name "") (equal read-name "+")) + (cond ((or (equal read-name "") + (and (equal read-name "+") (not allow-root-folder-flag))) (setq read-name default)) ((not (mh-folder-name-p read-name)) (setq read-name (format "+%s" read-name)))) @@ -1609,101 +1798,17 @@ changed." folder-name))) (message "Creating %s" folder-name) (mh-exec-cmd-error nil "folder" folder-name) + (mh-remove-from-sub-folders-cache folder-name) (when (boundp 'mh-speed-folder-map) (mh-speed-add-folder folder-name)) - (message "Creating %s...done" folder-name) - (setq mh-folder-list (cons (list read-name) mh-folder-list)) - (run-hooks 'mh-folder-list-change-hook)) + (message "Creating %s...done" folder-name)) (new-file-flag (error "Folder %s is not created" folder-name)) ((not (file-directory-p (mh-expand-file-name folder-name))) (error "\"%s\" is not a directory" - (mh-expand-file-name folder-name))) - ((and (null (assoc read-name mh-folder-list)) - (null (assoc (concat read-name "/") mh-folder-list))) - (setq mh-folder-list (cons (list read-name) mh-folder-list)) - (run-hooks 'mh-folder-list-change-hook)))) + (mh-expand-file-name folder-name))))) folder-name)) -(defvar mh-make-folder-list-process nil) ;The background process collecting - ;the folder list. - -(defvar mh-folder-list-temp nil) ;mh-folder-list as it is being built. - -(defvar mh-folder-list-partial-line "") ;Start of last incomplete line from - ;folder process. - -(defun mh-set-folder-list () - "Set `mh-folder-list' correctly. -A useful function for the command line or for when you need to -sync by hand. Format is in a form suitable for completing read. -The value of `mh-folder-list-change-hook' is a list of functions to be called, -with no arguments, once the list of folders has been created." - (message "Collecting folder names...") - (if (not mh-make-folder-list-process) - (mh-make-folder-list-background)) - (while (eq (process-status mh-make-folder-list-process) 'run) - (accept-process-output mh-make-folder-list-process)) - (setq mh-folder-list mh-folder-list-temp) - (run-hooks 'mh-folder-list-change-hook) - (setq mh-folder-list-temp nil) - (delete-process mh-make-folder-list-process) - (setq mh-make-folder-list-process nil) - (message "Collecting folder names...done")) - -(defun mh-make-folder-list-background () - "Start a background process to compute a list of the user's folders. -Call `mh-set-folder-list' to wait for the result." - (cond - ((not mh-make-folder-list-process) - (unless mh-inbox - (mh-find-path)) - (let ((process-connection-type nil)) - (setq mh-make-folder-list-process - (start-process "folders" nil (expand-file-name "folders" mh-progs) - "-fast" - (if mh-recursive-folders-flag - "-recurse" - "-norecurse"))) - (set-process-filter mh-make-folder-list-process - 'mh-make-folder-list-filter) - (process-kill-without-query mh-make-folder-list-process))))) - -(defun mh-make-folder-list-filter (process output) - "Given the PROCESS \"folders -fast\", parse OUTPUT. -See also `set-process-filter'." - (let ((position 0) - line-end - new-folder - (prevailing-match-data (match-data))) - (unwind-protect - ;; make sure got complete line - (while (setq line-end (string-match "\n" output position)) - (setq new-folder (format "+%s%s" - mh-folder-list-partial-line - (substring output position line-end))) - (setq mh-folder-list-partial-line "") - ;; is new folder a subfolder of previous? - (if (and mh-folder-list-temp - (string-match - (regexp-quote - (concat (car (car mh-folder-list-temp)) "/")) - new-folder)) - ;; append slash to parent folder for better completion - ;; (undone by mh-prompt-for-folder) - (setq mh-folder-list-temp - (cons - (list new-folder) - (cons - (list (concat (car (car mh-folder-list-temp)) "/")) - (cdr mh-folder-list-temp)))) - (setq mh-folder-list-temp - (cons (list new-folder) - mh-folder-list-temp))) - (setq position (1+ line-end))) - (set-match-data prevailing-match-data)) - (setq mh-folder-list-partial-line (substring output position)))) - ;;; Issue commands to MH. (defun mh-exec-cmd (command &rest args) @@ -1712,14 +1817,14 @@ 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-temp-buffer)) + (set-buffer (get-buffer-create mh-log-buffer)) (erase-buffer) (apply 'call-process (expand-file-name command mh-progs) nil t nil (mh-list-to-string args)) (if (> (buffer-size) 0) (save-window-excursion - (switch-to-buffer-other-window mh-temp-buffer) + (switch-to-buffer-other-window mh-log-buffer) (sit-for 5))))) (defun mh-exec-cmd-error (env command &rest args) @@ -1743,24 +1848,30 @@ Signals an error if process does not complete successfully." (mh-list-to-string args))))) (mh-handle-process-error command status)))) -(defun mh-exec-cmd-daemon (command &rest args) - "Execute MH command COMMAND with ARGS in the background. -Any output from command is displayed in an asynchronous pop-up window." +(defun mh-exec-cmd-daemon (command filter &rest args) + "Execute MH command COMMAND in the background. + +If FILTER is non-nil then it is used to process the output otherwise the +default filter `mh-process-daemon' is used. See `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-temp-buffer)) + (set-buffer (get-buffer-create mh-log-buffer)) (erase-buffer)) (let* ((process-connection-type nil) (process (apply 'start-process command nil (expand-file-name command mh-progs) (mh-list-to-string args)))) - (set-process-filter process 'mh-process-daemon))) + (set-process-filter process (or filter 'mh-process-daemon)))) (defun mh-process-daemon (process output) - "PROCESS daemon that puts OUTPUT into a temporary buffer." - (set-buffer (get-buffer-create mh-temp-buffer)) + "PROCESS daemon that puts OUTPUT into a temporary buffer. +Any output from the process is displayed in an asynchronous pop-up window." + (set-buffer (get-buffer-create mh-log-buffer)) (insert-before-markers output) - (display-buffer mh-temp-buffer)) + (display-buffer mh-log-buffer)) (defun mh-exec-cmd-quiet (raise-error command &rest args) "Signal RAISE-ERROR if COMMAND with ARGS fails. diff --git a/lisp/mh-e/mh-xemacs-compat.el b/lisp/mh-e/mh-xemacs-compat.el index d544115e9a2..692d792a1bc 100644 --- a/lisp/mh-e/mh-xemacs-compat.el +++ b/lisp/mh-e/mh-xemacs-compat.el @@ -28,7 +28,7 @@ ;;; Change Log: -;; $Id: mh-xemacs-compat.el,v 1.3 2003/01/08 23:21:16 wohler Exp $ +;; $Id: mh-xemacs-compat.el,v 1.13 2002/11/30 01:21:42 wohler Exp $ ;;; Code: diff --git a/lisp/toolbar/mh-logo.xpm b/lisp/toolbar/mh-logo.xpm new file mode 100644 index 00000000000..ce6b97c2f5a --- /dev/null +++ b/lisp/toolbar/mh-logo.xpm @@ -0,0 +1,22 @@ +/* XPM */ +static char *mh-e[] = { +/* width height num_colors chars_per_pixel */ +" 18 13 2 1", +/* colors */ +"# c #666699", +". c None s None", +/* pixels */ +"........##........", +".......####.......", +"......######......", +"......######......", +"....#########.....", +"..##############..", +".##...######....#.", +"##...#.#.####...#.", +"....#..#.##.#...#.", +"...#..##.#.#.#....", +"...#..#..#..#.#...", +"...#..#.##..#.##..", +"...#..#.#..#....#." +}; |