2 ;;; tm-vm.el --- tm-MUA for VM
4 ;;; Copyright (C) 1995 Free Software Foundation, Inc.
6 ;;; Author: MASUTANI Yasuhiro <masutani@me.es.osaka-u.ac.jp>
7 ;;; Kenji Wakamiya <wkenji@flab.fujitsu.co.jp>
8 ;;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
9 ;;; Shuhei KOBAYASHI <shuhei@cmpt01.phys.tohoku.ac.jp>
10 ;;; Oscar Figueiredo <figueire@lspsun2.epfl.ch>
11 ;;; modified by SHIONO Jun'ichi <jun@case.nm.fujitsu.co.jp>
12 ;;; and ISHIHARA Akito <aki@bpel.tutics.tut.ac.jp>
13 ;;; Maintainer: Shuhei KOBAYASHI <shuhei@cmpt01.phys.tohoku.ac.jp>
14 ;;; Created: 1994/10/29
15 ;;; Version: $Revision: 7.39 $
16 ;;; Keywords: mail, MIME, multimedia, multilingual, encoded-word
18 ;;; This file is part of tm (Tools for MIME).
20 ;;; Plese insert (require 'tm-vm) in your ~/.vm or ~/.emacs file.
22 ;;; This program is free software; you can redistribute it and/or
23 ;;; modify it under the terms of the GNU General Public License as
24 ;;; published by the Free Software Foundation; either version 2, or
25 ;;; (at your option) any later version.
27 ;;; This program is distributed in the hope that it will be useful,
28 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
29 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
30 ;;; General Public License for more details.
32 ;;; You should have received a copy of the GNU General Public License
33 ;;; along with This program. If not, write to the Free Software
34 ;;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
41 (defconst tm-vm/RCS-ID
42 "$Id: tm-vm.el,v 7.39 1996/01/23 04:46:54 morioka Exp $")
43 (defconst tm-vm/version (get-version-string tm-vm/RCS-ID))
45 (define-key vm-mode-map "Z" 'tm-vm/view-message)
46 (define-key vm-mode-map "T" 'tm-vm/decode-message-header)
47 (define-key vm-mode-map "\et" 'tm-vm/toggle-preview-mode)
49 (defvar tm-vm-load-hook nil
50 "*List of functions called after tm-vm is loaded.")
53 ;;; @ for MIME encoded-words
56 (defvar tm-vm/use-tm-patch nil
57 "Does not decode encoded-words in summary buffer if it is t.
58 If you use tiny-mime patch for VM (by RIKITAKE Kenji
59 <kenji@reseau.toyonaka.osaka.jp>), please set it t [tm-vm.el]")
61 (or tm-vm/use-tm-patch
64 (defvar tm-vm/chop-full-name-function 'tm-vm/default-chop-full-name)
65 (setq vm-chop-full-name-function tm-vm/chop-full-name-function)
67 (defun tm-vm/default-chop-full-name (address)
68 (let* ((ret (vm-default-chop-full-name address))
71 (if (stringp full-name)
72 (cons (mime-eword/decode-string full-name)
77 (or (fboundp 'tm:vm-su-subject)
78 (fset 'tm:vm-su-subject (symbol-function 'vm-su-subject))
80 (defun vm-su-subject (m)
81 (mime-eword/decode-string (tm:vm-su-subject m))
84 (or (fboundp 'tm:vm-su-full-name)
85 (fset 'tm:vm-su-full-name (symbol-function 'vm-su-full-name))
87 (defun vm-su-full-name (m)
88 (mime-eword/decode-string (tm:vm-su-full-name m))
91 (or (fboundp 'tm:vm-su-to-names)
92 (fset 'tm:vm-su-to-names (symbol-function 'vm-su-to-names))
94 (defun vm-su-to-names (m)
95 (mime-eword/decode-string (tm:vm-su-to-names m))
100 (defun tm-vm/decode-message-header (&optional count)
101 "Decode MIME header of current message through tiny-mime.
102 Numeric prefix argument COUNT means to decode the current message plus
103 the next COUNT-1 messages. A negative COUNT means decode the current
104 message and the previous COUNT-1 messages.
105 When invoked on marked messages (via vm-next-command-uses-marks),
106 all marked messages are affected, other messages are ignored."
108 (or count (setq count 1))
109 (vm-follow-summary-cursor)
110 (vm-select-folder-buffer)
111 (vm-check-for-killed-summary)
112 (vm-error-if-folder-empty)
113 (vm-error-if-folder-read-only)
114 (let ((mlist (vm-select-marked-or-prefixed-messages count))
120 (setq realm (vm-real-message-of (car mlist)))
121 ;; Go to real folder of this message.
122 ;; But maybe this message is already real message...
123 (set-buffer (vm-buffer-of realm))
124 (let ((buffer-read-only nil))
126 (narrow-to-region (vm-headers-of realm) (vm-text-of realm))
127 (mime/decode-message-header))
128 (let ((vm-message-pointer (list realm))
130 (vm-discard-cached-data))
131 ;; Mark each virtual and real message for later summary
133 (setq vlist (cons realm (vm-virtual-messages-of realm)))
135 (vm-mark-for-summary-update (car vlist))
136 ;; Remember virtual and real folders related this message,
137 ;; for later display update.
138 (or (memq (vm-buffer-of (car vlist)) vbufs)
139 (setq vbufs (cons (vm-buffer-of (car vlist)) vbufs)))
140 (setq vlist (cdr vlist)))
141 (if (eq vm-flush-interval t)
142 (vm-stuff-virtual-attributes realm)
143 (vm-set-modflag-of realm t)))
144 (setq mlist (cdr mlist)))
145 ;; Update mail-buffers and summaries.
147 (set-buffer (car vbufs))
148 (vm-preview-current-message)
149 (setq vbufs (cdr vbufs))))))
152 ;;; @ automatic MIME preview
155 (defvar tm-vm/automatic-mime-preview t
156 "*If non-nil, show MIME processed article.")
158 (defvar tm-vm/strict-mime t
159 "*If nil, do MIME processing even if there is not MIME-Version field.")
161 (defvar tm-vm/select-message-hook nil
162 "*List of functions called every time a message is selected.
163 tm-vm uses `vm-select-message-hook', use this hook instead.")
165 (defvar tm-vm/system-state nil)
166 (defun tm-vm/system-state ()
168 (if mime::preview/article-buffer
169 (set-buffer mime::preview/article-buffer)
170 (vm-select-folder-buffer))
173 (defun tm-vm/display-preview-buffer ()
174 (let* ((mbuf (current-buffer))
175 (mwin (vm-get-visible-buffer-window mbuf))
176 (pbuf (and mime::article/preview-buffer
177 (get-buffer mime::article/preview-buffer)))
178 (pwin (and pbuf (vm-get-visible-buffer-window pbuf))))
179 (if (and pbuf (tm-vm/system-state))
180 ;; display preview buffer
183 (vm-undisplay-buffer mbuf)
184 (tm-vm/show-current-message))
185 ((and mwin (not pwin))
186 (set-window-buffer mwin pbuf)
187 (tm-vm/show-current-message))
189 (tm-vm/show-current-message))
191 ;; don't display if neither mwin nor pwin was displayed before.
193 ;; display folder buffer
196 (vm-undisplay-buffer pbuf))
197 ((and (not mwin) pwin)
198 (set-window-buffer pwin mbuf))
200 ;; folder buffer is already displayed.
203 ;; don't display if neither mwin nor pwin was displayed before.
207 (defun tm-vm/preview-current-message ()
208 ;; assumed current buffer is folder buffer.
209 (setq tm-vm/system-state nil)
210 (if (get-buffer mime/output-buffer-name)
211 (vm-undisplay-buffer mime/output-buffer-name))
212 (if (and vm-message-pointer tm-vm/automatic-mime-preview)
213 (if (or (not tm-vm/strict-mime)
214 (vm-get-header-contents (car vm-message-pointer)
216 ;; do MIME processiong.
218 (set (make-local-variable 'tm-vm/system-state) 'previewing)
219 (save-window-excursion
221 (goto-char (point-min))
222 (narrow-to-region (point)
223 (search-forward "\n\n" nil t))
225 ;; don't do MIME processing. decode header only.
226 (let (buffer-read-only)
227 (mime/decode-message-header))
229 ;; don't preview; do nothing.
231 (tm-vm/display-preview-buffer)
232 (run-hooks 'tm-vm/select-message-hook))
234 (defun tm-vm/show-current-message ()
235 (if mime::preview/article-buffer
236 (set-buffer mime::preview/article-buffer)
237 (vm-select-folder-buffer))
238 ;; Now current buffer is folder buffer.
239 (if (or t ; mime/viewer-mode doesn't support narrowing yet.
240 (null vm-preview-lines)
241 (and (not vm-preview-read-messages)
243 (car vm-message-pointer)))
245 (car vm-message-pointer)))))
247 (set-buffer mime::article/preview-buffer)
250 (goto-char (point-min))
252 ;; narrow to page; mime/viewer-mode doesn't support narrowing yet.
254 (if (vm-get-visible-buffer-window mime::article/preview-buffer)
256 (setq tm-vm/system-state 'reading)
257 (if (vm-new-flag (car vm-message-pointer))
258 (vm-set-new-flag (car vm-message-pointer) nil))
259 (if (vm-unread-flag (car vm-message-pointer))
260 (vm-set-unread-flag (car vm-message-pointer) nil))
261 (vm-update-summary-and-mode-line)
263 (vm-update-summary-and-mode-line)))
265 (defun tm-vm/toggle-preview-mode ()
267 (vm-select-folder-buffer)
268 (vm-display (current-buffer) t (list this-command)
269 (list this-command 'reading-message))
270 (if tm-vm/automatic-mime-preview
271 (setq tm-vm/automatic-mime-preview nil
272 tm-vm/system-state nil)
273 (setq tm-vm/automatic-mime-preview t
274 tm-vm/system-state nil)
277 (let* ((mp (car vm-message-pointer))
278 (exposed (= (point-min) (vm-start-of mp))))
279 (if (or (not tm-vm/strict-mime)
280 (vm-get-header-contents mp "MIME-Version:"))
281 ;; do MIME processiong.
283 (set (make-local-variable 'tm-vm/system-state) 'previewing)
284 (save-window-excursion
286 (goto-char (point-min))
287 (narrow-to-region (point)
288 (search-forward "\n\n" nil t))
290 ;; don't do MIME processing. decode header only.
291 (let (buffer-read-only)
292 (mime/decode-message-header))
294 ;; don't preview; do nothing.
296 (tm-vm/display-preview-buffer)
299 (add-hook 'vm-select-message-hook 'tm-vm/preview-current-message)
300 (add-hook 'vm-visit-folder-hook 'tm-vm/preview-current-message)
302 ;;; tm-vm move commands
305 (defmacro tm-vm/save-window-excursion (&rest forms)
306 (list 'let '((tm-vm/selected-window (selected-window)))
307 (list 'unwind-protect
309 '(if (window-live-p tm-vm/selected-window)
310 (select-window tm-vm/selected-window)))))
312 ;;; based on vm-scroll-forward [vm-page.el]
313 (defun tm-vm/scroll-forward (&optional arg)
315 (let ((this-command 'vm-scroll-forward))
316 (if (not (tm-vm/system-state))
317 (vm-scroll-forward arg)
318 (let* ((mp-changed (vm-follow-summary-cursor))
319 (mbuf (or (vm-select-folder-buffer) (current-buffer)))
320 (mwin (vm-get-buffer-window mbuf))
321 (pbuf (and mime::article/preview-buffer
322 (get-buffer mime::article/preview-buffer)))
323 (pwin (and pbuf (vm-get-buffer-window pbuf)))
324 (was-invisible (and (null mwin) (null pwin)))
326 ;; now current buffer is folder buffer.
327 (tm-vm/save-window-excursion
328 (if (or mp-changed was-invisible)
329 (vm-display mbuf t '(vm-scroll-forward vm-scroll-backward)
330 (list this-command 'reading-message)))
331 (tm-vm/display-preview-buffer)
332 (setq mwin (vm-get-buffer-window mbuf)
333 pwin (and pbuf (vm-get-buffer-window pbuf)))
339 ;; preview buffer is killed.
340 (tm-vm/preview-current-message)
341 (vm-update-summary-and-mode-line))
342 ((eq (tm-vm/system-state) 'previewing)
343 (tm-vm/show-current-message))
347 (if (pos-visible-in-window-p (point-max) pwin)
349 ;; not end of message. scroll preview buffer only.
356 ;;; based on vm-scroll-backward [vm-page.el]
357 (defun tm-vm/scroll-backward (&optional arg)
359 (let ((this-command 'vm-scroll-backward))
360 (if (not (tm-vm/system-state))
361 (vm-scroll-backward arg)
362 (let* ((mp-changed (vm-follow-summary-cursor))
363 (mbuf (or (vm-select-folder-buffer) (current-buffer)))
364 (mwin (vm-get-buffer-window mbuf))
365 (pbuf (and mime::article/preview-buffer
366 (get-buffer mime::article/preview-buffer)))
367 (pwin (and pbuf (vm-get-buffer-window pbuf)))
368 (was-invisible (and (null mwin) (null pwin)))
370 ;; now current buffer is folder buffer.
371 (if (or mp-changed was-invisible)
372 (vm-display mbuf t '(vm-scroll-forward vm-scroll-backward)
373 (list this-command 'reading-message)))
374 (tm-vm/save-window-excursion
375 (tm-vm/display-preview-buffer)
376 (setq mwin (vm-get-buffer-window mbuf)
377 pwin (and pbuf (vm-get-buffer-window pbuf)))
383 ;; preview buffer is killed.
384 (tm-vm/preview-current-message)
385 (vm-update-summary-and-mode-line))
386 ((eq (tm-vm/system-state) 'previewing)
387 (tm-vm/show-current-message))
391 (if (pos-visible-in-window-p (point-min) pwin)
393 ;; scroll preview buffer only.
399 ;;; based on vm-beginning-of-message [vm-page.el]
400 (defun tm-vm/beginning-of-message ()
401 "Moves to the beginning of the current message."
403 (if (not (tm-vm/system-state))
404 (vm-beginning-of-message)
405 (vm-follow-summary-cursor)
406 (vm-select-folder-buffer)
407 (vm-check-for-killed-summary)
408 (vm-error-if-folder-empty)
409 (let ((mbuf (current-buffer))
410 (pbuf (and mime::article/preview-buffer
411 (get-buffer mime::article/preview-buffer))))
414 (tm-vm/preview-current-message)
415 (setq pbuf (get-buffer mime::article/preview-buffer))
417 (vm-display mbuf t '(vm-beginning-of-message)
418 '(vm-beginning-of-message reading-message))
419 (tm-vm/display-preview-buffer)
421 (tm-vm/save-window-excursion
422 (select-window (vm-get-buffer-window pbuf))
424 (goto-char (point-min))
427 ;;; based on vm-end-of-message [vm-page.el]
428 (defun tm-vm/end-of-message ()
429 "Moves to the end of the current message."
431 (if (not (tm-vm/system-state))
433 (vm-follow-summary-cursor)
434 (vm-select-folder-buffer)
435 (vm-check-for-killed-summary)
436 (vm-error-if-folder-empty)
437 (let ((mbuf (current-buffer))
438 (pbuf (and mime::article/preview-buffer
439 (get-buffer mime::article/preview-buffer))))
442 (tm-vm/preview-current-message)
443 (setq pbuf (get-buffer mime::article/preview-buffer))
445 (vm-display mbuf t '(vm-end-of-message)
446 '(vm-end-of-message reading-message))
447 (tm-vm/display-preview-buffer)
449 (tm-vm/save-window-excursion
450 (select-window (vm-get-buffer-window pbuf))
452 (goto-char (point-max))
455 ;;; based on vm-howl-if-eom [vm-page.el]
456 (defun tm-vm/howl-if-eom ()
457 (let* ((pbuf (or mime::article/preview-buffer (current-buffer)))
458 (pwin (and (vm-get-visible-buffer-window pbuf))))
461 (save-window-excursion
463 (let ((next-screen-context-lines 0))
466 (save-window-excursion
467 (let ((scroll-in-place-replace-original nil))
471 (tm-vm/emit-eom-blurb)
474 ;;; based on vm-emit-eom-blurb [vm-page.el]
475 (defun tm-vm/emit-eom-blurb ()
477 (if mime::preview/article-buffer
478 (set-buffer mime::preview/article-buffer))
479 (vm-emit-eom-blurb)))
481 ;;; based on vm-quit [vm-folder.el]
485 (vm-select-folder-buffer)
486 (if (and mime::article/preview-buffer
487 (get-buffer mime::article/preview-buffer))
488 (kill-buffer mime::article/preview-buffer)))
491 (substitute-key-definition 'vm-scroll-forward
492 'tm-vm/scroll-forward vm-mode-map)
493 (substitute-key-definition 'vm-scroll-backward
494 'tm-vm/scroll-backward vm-mode-map)
495 (substitute-key-definition 'vm-beginning-of-message
496 'tm-vm/beginning-of-message vm-mode-map)
497 (substitute-key-definition 'vm-end-of-message
498 'tm-vm/end-of-message vm-mode-map)
499 (substitute-key-definition 'vm-quit
500 'tm-vm/quit vm-mode-map)
502 ;;; based on vm-next-message [vm-motion.el]
503 (defun tm-vm/next-message ()
504 (set-buffer mime::preview/article-buffer)
505 (let ((this-command 'vm-next-message)
506 (owin (selected-window))
507 (vm-preview-lines nil)
509 (vm-next-message 1 nil t)
510 (if (window-live-p owin)
511 (select-window owin))))
513 ;;; based on vm-previous-message [vm-motion.el]
514 (defun tm-vm/previous-message ()
515 (set-buffer mime::preview/article-buffer)
516 (let ((this-command 'vm-previous-message)
517 (owin (selected-window))
518 (vm-preview-lines nil)
520 (vm-previous-message 1 nil t)
521 (if (window-live-p owin)
522 (select-window owin))))
524 (set-alist 'mime-viewer/over-to-previous-method-alist
525 'vm-mode 'tm-vm/previous-message)
526 (set-alist 'mime-viewer/over-to-next-method-alist
527 'vm-mode 'tm-vm/next-message)
528 (set-alist 'mime-viewer/over-to-previous-method-alist
529 'vm-virtual-mode 'tm-vm/previous-message)
530 (set-alist 'mime-viewer/over-to-next-method-alist
531 'vm-virtual-mode 'tm-vm/next-message)
537 (defun tm-vm/quit-view-message ()
538 "Quit MIME-viewer and go back to VM.
539 This function is called by `mime-viewer/quit' command via
540 `mime-viewer/quitting-method-alist'."
541 (if (get-buffer mime/output-buffer-name)
542 (vm-undisplay-buffer mime/output-buffer-name))
543 (if (and tm-vm/automatic-mime-preview
545 (set-buffer mime::preview/article-buffer)
547 (switch-to-buffer mime::preview/mother-buffer)
548 (mime-viewer/kill-buffer)
549 (vm-select-folder-buffer)
550 (setq tm-vm/system-state nil))
551 (vm-display (current-buffer) t (list this-command)
552 (list this-command 'reading-message))
553 (tm-vm/display-preview-buffer)
556 (defun tm-vm/view-message ()
557 "Decode and view MIME encoded message, under VM."
559 (vm-follow-summary-cursor)
560 (vm-select-folder-buffer)
561 (vm-check-for-killed-summary)
562 (vm-error-if-folder-empty)
563 (vm-display (current-buffer) t '(tm-vm/view-message)
564 '(tm-vm/view-mesage reading-message))
565 (let* ((mp (car vm-message-pointer))
566 (ct (vm-get-header-contents mp "Content-Type:"))
567 (cte (vm-get-header-contents mp "Content-Transfer-Encoding:"))
568 (exposed (= (point-min) (vm-start-of mp))))
571 ;; vm-widen-page hides exposed header if pages are delimited.
572 ;; So, here we expose it again.
574 (narrow-to-region (vm-start-of mp) (point-max)))
575 (select-window (vm-get-buffer-window (current-buffer)))
576 (mime/viewer-mode nil
577 (mime/parse-Content-Type (or ct ""))
581 (set-alist 'mime-viewer/quitting-method-alist
583 'tm-vm/quit-view-message)
585 (set-alist 'mime-viewer/quitting-method-alist
587 'tm-vm/quit-view-message)
597 (set-atype 'mime/content-decoding-condition
598 '((type . "message/partial")
599 (method . mime-article/grab-message/partials)
600 (major-mode . vm-mode)
601 (summary-buffer-exp . vm-summary-buffer)
603 (set-alist 'tm-partial/preview-article-method-alist
615 ;;; @@ for multipart/digest
618 (defvar tm-vm/forward-message-hook nil
619 "*List of functions called after a Mail mode buffer has been
620 created to forward a message in message/rfc822 type format.
621 If `vm-forwarding-digest-type' is \"rfc1521\", tm-vm runs this
622 hook instead of `vm-forward-message-hook'.")
624 (defvar tm-vm/send-digest-hook nil
625 "*List of functions called after a Mail mode buffer has been
626 created to send a digest in multipart/digest type format.
627 If `vm-digest-send-type' is \"rfc1521\", tm-vm runs this hook
628 instead of `vm-send-digest-hook'.")
630 (defun tm-vm/enclose-messages (mlist)
631 "Enclose the messages in MLIST as multipart/digest.
632 The resulting digest is inserted at point in the current buffer.
634 MLIST should be a list of message structs (real or virtual).
635 These are the messages that will be enclosed."
637 (let ((digest (consp (cdr mlist)))
640 (narrow-to-region (point) (point))
642 (setq m (vm-real-message-of (car mlist)))
643 (mime-editor/insert-tag "message" "rfc822")
644 (tm-mail/insert-message m)
645 (goto-char (point-max))
646 (setq mlist (cdr mlist)))
648 (mime-editor/enclose-digest-region (point-min) (point-max)))
651 (defun tm-vm/forward-message ()
652 "Forward the current message to one or more recipients.
653 You will be placed in a Mail mode buffer as you would with a
654 reply, but you must fill in the To: header and perhaps the
655 Subject: header manually."
657 (if (not (equal vm-forwarding-digest-type "rfc1521"))
659 (vm-follow-summary-cursor)
660 (vm-select-folder-buffer)
661 (vm-check-for-killed-summary)
662 (vm-error-if-folder-empty)
663 (if (eq last-command 'vm-next-command-uses-marks)
664 (let ((vm-digest-send-type vm-forwarding-digest-type))
665 (setq this-command 'vm-next-command-uses-marks)
666 (command-execute 'tm-vm/send-digest))
667 (let ((dir default-directory)
668 (mp vm-message-pointer))
672 (format "forward of %s's note re: %s"
673 (vm-su-full-name (car vm-message-pointer))
674 (vm-su-subject (car vm-message-pointer)))
676 (and vm-forwarding-subject-format
677 (let ((vm-summary-uninteresting-senders nil))
678 (vm-sprintf 'vm-forwarding-subject-format (car mp)))))
679 (make-local-variable 'vm-forward-list)
680 (setq vm-system-state 'forwarding
681 vm-forward-list (list (car mp))
682 default-directory dir)
683 (goto-char (point-min))
685 (concat "^" (regexp-quote mail-header-separator) "\n") nil 0)
686 (tm-vm/enclose-messages vm-forward-list)
687 (mail-position-on-field "To"))
688 (run-hooks 'tm-vm/forward-message-hook)
689 (run-hooks 'vm-mail-mode-hook)))))
691 (defun tm-vm/send-digest (&optional prefix)
692 "Send a digest of all messages in the current folder to recipients.
693 The type of the digest is specified by the variable vm-digest-send-type.
694 You will be placed in a Mail mode buffer as is usual with replies, but you
695 must fill in the To: and Subject: headers manually.
697 If invoked on marked messages (via vm-next-command-uses-marks),
698 only marked messages will be put into the digest."
700 (if (not (equal vm-digest-send-type "rfc1521"))
701 (vm-send-digest prefix)
702 (vm-select-folder-buffer)
703 (vm-check-for-killed-summary)
704 (vm-error-if-folder-empty)
705 (let ((dir default-directory)
706 (mp vm-message-pointer)
707 (mlist (if (eq last-command 'vm-next-command-uses-marks)
708 (vm-select-marked-or-prefixed-messages 0)
713 (vm-mail-internal (format "digest from %s" (buffer-name)))
714 (setq vm-system-state 'forwarding
715 vm-forward-list mlist
716 default-directory dir)
717 (goto-char (point-min))
718 (re-search-forward (concat "^" (regexp-quote mail-header-separator)
720 (goto-char (match-end 0))
723 (vm-unsaved-message "Building %s digest..." vm-digest-send-type)
724 (tm-vm/enclose-messages mlist)
729 (mime-editor/insert-tag "text" "plain")
730 (vm-unsaved-message "Building digest preamble...")
732 (let ((vm-summary-uninteresting-senders nil))
733 (insert (vm-sprintf 'vm-digest-preamble-format (car mp)) "\n"))
734 (if vm-digest-center-preamble
739 (setq mp (cdr mp)))))
740 (mail-position-on-field "To")
741 (message "Building %s digest... done" vm-digest-send-type)))
742 (run-hooks 'tm-vm/send-digest-hook)
743 (run-hooks 'vm-mail-mode-hook)))
745 (substitute-key-definition 'vm-forward-message
746 'tm-vm/forward-message vm-mode-map)
747 (substitute-key-definition 'vm-send-digest
748 'tm-vm/send-digest vm-mode-map)
750 ;;; @@ for message/rfc822
757 (defvar tm-vm/use-xemacs-popup-menu t)
759 ;;; modified by Steven L. Baur <steve@miranova.com>
760 ;;; 1995/12/6 (c.f. [tm-en:209])
761 (defun mime-editor/attach-to-vm-mode-menu ()
762 "Arrange to attach MIME editor's popup menu to VM's"
763 (if (boundp 'vm-menu-mail-menu)
765 (setq vm-menu-mail-menu
766 (append vm-menu-mail-menu
768 mime-editor/popup-menu-for-xemacs)))
769 (remove-hook 'vm-mail-mode-hook 'mime-editor/attach-to-vm-mode-menu)
776 (autoload 'tm-mail/insert-message "tm-mail")
777 (set-alist 'mime-editor/message-inserter-alist
778 'mail-mode (function tm-mail/insert-message))
779 (if (and (string-match "XEmacs\\|Lucid" emacs-version)
780 tm-vm/use-xemacs-popup-menu)
781 (add-hook 'vm-mail-mode-hook 'mime-editor/attach-to-vm-mode-menu)
789 (setq vm-forwarding-digest-type "rfc1521")
790 (setq vm-digest-send-type "rfc1521")
803 (or (fboundp 'tm:bbdb/vm-update-record)
804 (fset 'tm:bbdb/vm-update-record
805 (symbol-function 'bbdb/vm-update-record)))
806 (defun bbdb/vm-update-record (&optional offer-to-create)
807 (vm-select-folder-buffer)
808 (if (and (tm-vm/system-state)
809 mime::article/preview-buffer
810 (get-buffer mime::article/preview-buffer))
811 (tm-bbdb/update-record offer-to-create)
812 (tm:bbdb/vm-update-record offer-to-create)
814 (remove-hook 'vm-select-message-hook 'bbdb/vm-update-record)
815 (remove-hook 'vm-show-message-hook 'bbdb/vm-update-record)
816 (add-hook 'tm-vm/select-message-hook 'bbdb/vm-update-record)
825 (run-hooks 'tm-vm-load-hook)
827 ;;; tm-vm.el ends here.