I found another problem in the MH interface which could cause an integer-or-markerp error (for example, when displaying a draft message that has no From: field). Basically, one function returns "" on failure, and the function using it expects nil instead. Here's a new set of patches for the original BBDB 1.48 version of bbdb-mhe.el. It incorporates the earlier patches I've made to this file. Fritz *** bbdb-mhe.el.orig Sat Jul 24 11:16:29 1993 --- bbdb-mhe.el Tue Nov 30 14:00:57 1993 *************** *** 4,9 **** --- 4,10 ---- ;;; copyright (c) 1991 Todd Kaufmann <[EMAIL PROTECTED]> ;;; Interface to mh-e version 3.7 or later (modeled after bbdb-rmail). ;;; Created 5-Mar-91; Last modified: 24-jul-93. by jwz. + ;;; Modified 30-Nov-93 by [EMAIL PROTECTED] ;;; The Insidious Big Brother Database is free software; you can redistribute ;;; it and/or modify it under the terms of the GNU General Public License as *************** *** 20,34 **** ;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. (require 'bbdb) ! (require 'mh-e) ; Note- we later redefine a function in this file. (defmacro bbdb/mh-cache-key (message) "Return a (numeric) key for MESSAGE" ! ;; assumes message is a buffer-file-name like /usr/celine/Mail/inbox/2323, ! ;; and gets the 2323 from it. ! (list 'string-to-int (list 'file-name-nondirectory message))) - ;;;% Currently assumes msg buffer is the current buffer, ;;;% as usually (always?) is when called from the hook. --- 21,35 ---- ;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. (require 'bbdb) ! (require 'mh-e) ; Note- we advise several functions in this file. ! (require 'advice) (defmacro bbdb/mh-cache-key (message) "Return a (numeric) key for MESSAGE" ! (`(let* ((attrs (file-attributes (, message))) ! (status-time (nth 6 attrs))) ! (logxor (nth 10 attrs) (car status-time) (car (cdr status-time)))))) ;;;% Currently assumes msg buffer is the current buffer, ;;;% as usually (always?) is when called from the hook. *************** *** 39,61 **** the user confirms the creation." (if bbdb-use-pop-up (bbdb/mh-pop-up-bbdb-buffer offer-to-create) - (if (and (boundp 'mh-show-buffer) - (bufferp mh-show-buffer) - (buffer-name mh-show-buffer)) ; not killed; gnus messes this up - (set-buffer mh-show-buffer)) (let ((msg (bbdb/mh-cache-key buffer-file-name))) ! (if (eq msg 0) (setq msg nil)) ; 0 could mean trouble; be safe. ! (or (bbdb-message-cache-lookup msg nil) ; nil = current-buffer ! (let ((from (bbdb/mh-get-field "^From[ \t]*:")) ! name net) ! (if (or (null from) ! (string-match (bbdb-user-mail-names) ! (mail-strip-quoted-names from))) ! ;; if logged-in user sent this, use recipients. ! (setq from (or (bbdb/mh-get-field "^To[ \t]*:") from))) ! (if from ! (bbdb-encache-message msg ! (bbdb-annotate-message-sender from t (or (bbdb-invoke-hook-for-value bbdb/mail-auto-create-p) offer-to-create) offer-to-create)))))))) --- 40,63 ---- the user confirms the creation." (if bbdb-use-pop-up (bbdb/mh-pop-up-bbdb-buffer offer-to-create) (let ((msg (bbdb/mh-cache-key buffer-file-name))) ! (if (eq msg 0) (setq msg nil)) ; 0 could mean trouble; be safe. ! (or (bbdb-message-cache-lookup msg nil) ; nil = current-buffer ! (let ((from (bbdb/mh-get-field "^From[ \t]*:")) ! name net) ! (if (or (string= "" from) ! (string-match (bbdb-user-mail-names) ! (mail-strip-quoted-names from))) ! ;; if logged-in user sent this, use recipients. ! (progn ! (setq from (bbdb/mh-get-field "^To[ \t]*:")) ! (if (or (string= "" from) ! (string-match (bbdb-user-mail-names) ! (mail-strip-quoted-names from))) ! (setq from nil)))) ! (if from ! (bbdb-encache-message msg ! (bbdb-annotate-message-sender from t (or (bbdb-invoke-hook-for-value bbdb/mail-auto-create-p) offer-to-create) offer-to-create)))))))) *************** *** 67,75 **** (interactive (list (if bbdb-readonly-p (error "The Insidious Big Brother Database is read-only.") (read-string "Comments: ")))) ! (if (and (boundp 'mh-show-buffer) mh-show-buffer) ! (set-buffer mh-show-buffer)) ! (bbdb-annotate-notes (bbdb/mh-update-record t) string)) (defun bbdb/mh-edit-notes (&optional arg) --- 69,81 ---- (interactive (list (if bbdb-readonly-p (error "The Insidious Big Brother Database is read-only.") (read-string "Comments: ")))) ! (mh-show) ! (let ((b (current-buffer)) ! (p (point))) ! (set-buffer mh-show-buffer) ! (bbdb-annotate-notes (bbdb/mh-update-record t) string) ! (set-buffer b) ! (goto-char p))) (defun bbdb/mh-edit-notes (&optional arg) *************** *** 76,97 **** "Edit the notes field or (with a prefix arg) a user-defined field of the BBDB record corresponding to the sender of this message." (interactive "P") ! (let ((record (or (bbdb/mh-update-record t) (error "")))) ! (bbdb-display-records (list record)) ! (if arg ! (bbdb-record-edit-property record nil t) ! (bbdb-record-edit-notes record t)))) (defun bbdb/mh-show-sender () "Display the contents of the BBDB for the sender of this message. This buffer will be in bbdb-mode, with associated keybindings." (interactive) ! (if (and (boundp 'mh-show-buffer) mh-show-buffer) ! (set-buffer mh-show-buffer)) ! (let ((record (bbdb/mh-update-record t))) ! (if record ! (bbdb-display-records (list record)) ! (error "unperson")))) (defun bbdb/mh-pop-up-bbdb-buffer (&optional offer-to-create) --- 82,114 ---- "Edit the notes field or (with a prefix arg) a user-defined field of the BBDB record corresponding to the sender of this message." (interactive "P") ! (mh-show) ! (let ((b (current-buffer)) ! (p (point))) ! (set-buffer mh-show-buffer) ! (let (bbdb-electric-p (record (or (bbdb/mh-update-record t) (error "")))) ! (bbdb-display-records (list record)) ! (if arg ! (bbdb-record-edit-property record nil t) ! (bbdb-record-edit-notes record t))) ! (set-buffer b) ! (goto-char p))) + (defun bbdb/mh-show-sender () "Display the contents of the BBDB for the sender of this message. This buffer will be in bbdb-mode, with associated keybindings." (interactive) ! (mh-show) ! (let ((b (current-buffer)) ! (p (point))) ! (set-buffer mh-show-buffer) ! (let ((record (bbdb/mh-update-record t))) ! (if record ! (bbdb-display-records (list record)) ! (error "unperson"))) ! (set-buffer b) ! (goto-char p))) (defun bbdb/mh-pop-up-bbdb-buffer (&optional offer-to-create) *************** *** 101,122 **** (function (lambda (w) (let ((b (current-buffer))) (set-buffer (window-buffer w)) ! ;; I don't understand what this is supposed to do - tk ! ; (prog1 (eq major-mode 'rmail-mode) ; no such mode for show buffers... (match "^show" ..) ? ! ; (set-buffer b)) ! )))) (let ((bbdb-gag-messages t) (bbdb-use-pop-up nil) ! (bbdb-electric-p nil) ! (saved-point (point))) (let ((record (bbdb/mh-update-record offer-to-create)) ! (bbdb-elided-display (bbdb-pop-up-elided-display)) ! (b (current-buffer))) (bbdb-display-records (if record (list record) nil)) ! (set-buffer b) ! (goto-char saved-point) ! record) ! )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; --- 118,132 ---- (function (lambda (w) (let ((b (current-buffer))) (set-buffer (window-buffer w)) ! (prog1 (eq major-mode 'mh-folder-mode) ! (set-buffer b)))))) (let ((bbdb-gag-messages t) (bbdb-use-pop-up nil) ! (bbdb-electric-p nil)) (let ((record (bbdb/mh-update-record offer-to-create)) ! (bbdb-elided-display (bbdb-pop-up-elided-display))) (bbdb-display-records (if record (list record) nil)) ! record))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; *************** *** 128,183 **** (defvar mh-show-message-hook () "Invoked after message is displayed in buffer.") ! ;;; This has been modified to call mh-show-message-hook after setting up the message ! ;;; ! (defun mh-display-msg (msg-num folder) ! ;; Display message NUMBER of FOLDER. ! (set-buffer folder) ! ;; Bind variables in folder buffer in case they are local ! (let ((formfile mhl-formfile) ! (clean-message-header mh-clean-message-header) ! (invisible-headers mh-invisible-headers) ! (visible-headers mh-visible-headers) ! (msg-filename (mh-msg-filename msg-num)) ! (show-buffer mh-show-buffer) ! (folder mh-current-folder)) ! (if (not (file-exists-p msg-filename)) ! (error "Message %d does not exist" msg-num)) ! (switch-to-buffer show-buffer) ! (if mh-bury-show-buffer (bury-buffer (current-buffer))) ! (mh-when (not (equal msg-filename buffer-file-name)) ! ;; Buffer does not yet contain message. ! (clear-visited-file-modtime) ! (unlock-buffer) ! (setq buffer-file-name nil) ; no locking during setup ! (erase-buffer) ! (if formfile ! (if (stringp formfile) ! (mh-exec-lib-cmd-output "mhl" "-nobell" "-noclear" ! "-form" formfile msg-filename) ! (mh-exec-lib-cmd-output "mhl" "-nobell" "-noclear" ! msg-filename)) ! (insert-file-contents msg-filename)) ! (goto-char (point-min)) ! (cond (clean-message-header ! (mh-clean-msg-header (point-min) ! invisible-headers ! visible-headers) ! (goto-char (point-min))) ! (t ! (let ((case-fold-search t)) ! (re-search-forward ! "^To:\\|^From:\\|^Subject:\\|^Date:" nil t) ! (beginning-of-line) ! (mh-recenter 0)))) ! (set-buffer-modified-p nil) ! (setq buffer-file-name msg-filename) ! (set-mark nil) ! (setq mode-line-buffer-identification ! (list (format mh-show-buffer-mode-line-buffer-id ! folder msg-num))))) ! (run-hooks 'mh-show-message-hook) ! ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; this is a more strict version of mh-get-field which takes an regexp --- 138,147 ---- (defvar mh-show-message-hook () "Invoked after message is displayed in buffer.") ! ;; Modify mh-display-msg to call mh-show-message-hook after setting up ! ;; the message ! (defadvice mh-display-msg (after mh-bbdb-display-msg act) ! (run-hooks 'mh-show-message-hook)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; this is a more strict version of mh-get-field which takes an regexp *************** *** 200,278 **** (format "%s%s" field (buffer-substring end-of-match (point))))))))) ! (defun bbdb/mh-execute-commands () ! "Process outstanding delete and refile requests." ! (interactive) ! (save-excursion ! (set-buffer mh-show-buffer) ! (setq bbdb-message-cache nil)) ! (bbdb-orig-mh-execute-commands)) ! (defun mh-send (to cc subject) ! "Compose and send a letter." (interactive (list (bbdb-read-addresses-with-completion "To: ") (bbdb-read-addresses-with-completion "Cc: ") ! (read-string "Subject: "))) ! (let ((config (current-window-configuration))) ! (delete-other-windows) ! (mh-send-sub to cc subject config))) ! ;; from [EMAIL PROTECTED] ! (defun mh-send-other-window (to cc subject) ! "Compose and send a letter in another window.." (interactive (list (bbdb-read-addresses-with-completion "To: ") (bbdb-read-addresses-with-completion "Cc: ") ! (read-string "Subject: "))) ! (let ((pop-up-windows t)) ! (mh-send-sub to cc subject (current-window-configuration)))) ! ;; from [EMAIL PROTECTED] ! (defun mh-forward (prefix-provided msg-or-seq to cc) ! "Forward MESSAGE(s) (default: displayed message). ! If optional prefix argument provided, then prompt for the message sequence." (interactive (list current-prefix-arg (if current-prefix-arg (mh-read-seq-default "Forward" t) (mh-get-msg-num t)) (bbdb-read-addresses-with-completion "To: ") ! (bbdb-read-addresses-with-completion "Cc: "))) ! (let* ((folder mh-current-folder) ! (config (current-window-configuration)) ! ;; forw always leaves file in "draft" since it doesn't have -draft ! (draft-name (expand-file-name "draft" mh-user-path)) ! (draft (cond ((or (not (file-exists-p draft-name)) ! (y-or-n-p "The file 'draft' exists. Discard it? ")) ! (mh-exec-cmd "forw" ! "-build" mh-current-folder msg-or-seq) ! (prog1 ! (mh-read-draft "" draft-name t) ! (mh-insert-fields "To:" to "Cc:" cc) ! (set-buffer-modified-p nil))) ! (t ! (mh-read-draft "" draft-name nil))))) ! (goto-char (point-min)) ! (re-search-forward "^------- Forwarded Message") ! (forward-line -1) ! (narrow-to-region (point) (point-max)) ! (let* ((subject (save-excursion (mh-get-field "From:"))) ! (trim (string-match "<" subject)) ! (forw-subject (save-excursion (mh-get-field "Subject:")))) ! (if trim ! (setq subject (substring subject 0 (1- trim)))) ! (widen) ! (save-excursion ! (mh-insert-fields "Subject:" (format "[%s: %s]" subject forw-subject))) ! (delete-other-windows) ! (if prefix-provided ! (mh-add-msgs-to-seq (mh-seq-to-msgs msg-or-seq) 'forwarded t) ! (mh-add-msgs-to-seq msg-or-seq 'forwarded t)) ! (mh-compose-and-send-mail draft "" folder msg-or-seq ! to subject cc ! mh-note-forw "Forwarded:" ! config)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; mail from bbdb-mode using mh --- 164,198 ---- (format "%s%s" field (buffer-substring end-of-match (point))))))))) ! (defadvice mh-process-commands (after mh-bbdb-process act) ! (bbdb-offer-save)) ! (defadvice mh-send (before mh-bbdb-send act) (interactive (list (bbdb-read-addresses-with-completion "To: ") (bbdb-read-addresses-with-completion "Cc: ") ! (read-string "Subject: ")))) ! (defadvice mh-send-other-window (before mh-bbdb-send-other act) (interactive (list (bbdb-read-addresses-with-completion "To: ") (bbdb-read-addresses-with-completion "Cc: ") ! (read-string "Subject: ")))) ! (defadvice mh-forward (before mh-bbdb-forward act) (interactive (list current-prefix-arg (if current-prefix-arg (mh-read-seq-default "Forward" t) (mh-get-msg-num t)) (bbdb-read-addresses-with-completion "To: ") ! (bbdb-read-addresses-with-completion "Cc: ")))) + (defadvice mh-redistribute (before mh-bbdb-redist act) + (interactive (list + (bbdb-read-addresses-with-completion "Redist-To: ") + (bbdb-read-addresses-with-completion "Redist-Cc: ") + (mh-get-msg-num t)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; mail from bbdb-mode using mh *************** *** 285,297 **** (define-key mh-folder-mode-map ":" 'bbdb/mh-show-sender) (define-key mh-folder-mode-map ";" 'bbdb/mh-edit-notes) (bbdb-add-hook 'mh-show-message-hook 'bbdb/mh-update-record) - - ;; We must patch into the "expunge" command to clear the cache, since - ;; expunging a message invalidates the cache (which is based on msg numbers). - (or (fboundp 'bbdb-orig-mh-execute-commands) - (fset 'bbdb-orig-mh-execute-commands - (symbol-function 'mh-execute-commands))) - (fset 'mh-execute-commands 'bbdb/mh-execute-commands) ) (provide 'bbdb-mhe) --- 205,210 ----