2 ;;; tm-vm.el --- tm-MUA for VM
4 ;;; Copyright (C) 1994 MASUTANI Yasuhiro
5 ;;; Copyright (C) 1995 WAKAMIYA Kenji
6 ;;; Copyright (C) 1995,1996 KOBAYASHI Shuhei
8 ;;; Author: MASUTANI Yasuhiro <masutani@me.es.osaka-u.ac.jp>
9 ;;; Kenji Wakamiya <wkenji@flab.fujitsu.co.jp>
10 ;;; MORIOKA Tomohiko <morioka@jaist.ac.jp>
11 ;;; Shuhei KOBAYASHI <shuhei@cmpt01.phys.tohoku.ac.jp>
12 ;;; Oscar Figueiredo <figueire@lspsun2.epfl.ch>
13 ;;; modified by SHIONO Jun'ichi <jun@case.nm.fujitsu.co.jp>
14 ;;; ISHIHARA Akito <aki@bpel.tutics.tut.ac.jp>
15 ;;; Rob Kooper <kooper@cc.gatech.edu>
16 ;;; Maintainer: Shuhei KOBAYASHI <shuhei@cmpt01.phys.tohoku.ac.jp>
17 ;;; Created: 1994/10/29
18 ;;; Version: $Revision: 7.48 $
19 ;;; Keywords: mail, MIME, multimedia, multilingual, encoded-word
21 ;;; This file is part of tm (Tools for MIME).
23 ;;; Plese insert `(require 'tm-vm)' in your ~/.vm file.
25 ;;; This program is free software; you can redistribute it and/or
26 ;;; modify it under the terms of the GNU General Public License as
27 ;;; published by the Free Software Foundation; either version 2, or
28 ;;; (at your option) any later version.
30 ;;; This program is distributed in the hope that it will be useful,
31 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
32 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
33 ;;; General Public License for more details.
35 ;;; You should have received a copy of the GNU General Public License
36 ;;; along with This program. If not, write to the Free Software
37 ;;; Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
44 (defconst tm-vm/RCS-ID
45 "$Id: tm-vm.el,v 7.48 1996/03/11 15:21:25 morioka Exp $")
46 (defconst tm-vm/version (get-version-string tm-vm/RCS-ID))
48 (define-key vm-mode-map "Z" 'tm-vm/view-message)
49 (define-key vm-mode-map "T" 'tm-vm/decode-message-header)
50 (define-key vm-mode-map "\et" 'tm-vm/toggle-preview-mode)
52 (defvar tm-vm/use-original-url-button nil
53 "*If it is t, use original URL button instead of tm's.")
55 (defvar tm-vm-load-hook nil
56 "*List of functions called after tm-vm is loaded.")
59 ;;; @ for MIME encoded-words
62 (defvar tm-vm/use-tm-patch nil
63 "Does not decode encoded-words in summary buffer if it is t.
64 If you use tiny-mime patch for VM (by RIKITAKE Kenji
65 <kenji@reseau.toyonaka.osaka.jp>), please set it t [tm-vm.el]")
67 (or tm-vm/use-tm-patch
70 (defvar tm-vm/chop-full-name-function 'tm-vm/default-chop-full-name)
71 (setq vm-chop-full-name-function tm-vm/chop-full-name-function)
73 (defun tm-vm/default-chop-full-name (address)
74 (let* ((ret (vm-default-chop-full-name address))
77 (if (stringp full-name)
78 (cons (mime-eword/decode-string full-name)
83 (or (fboundp 'tm:vm-su-subject)
84 (fset 'tm:vm-su-subject (symbol-function 'vm-su-subject))
86 (defun vm-su-subject (m)
87 (mime-eword/decode-string (tm:vm-su-subject m))
90 (or (fboundp 'tm:vm-su-full-name)
91 (fset 'tm:vm-su-full-name (symbol-function 'vm-su-full-name))
93 (defun vm-su-full-name (m)
94 (mime-eword/decode-string (tm:vm-su-full-name m))
97 (or (fboundp 'tm:vm-su-to-names)
98 (fset 'tm:vm-su-to-names (symbol-function 'vm-su-to-names))
100 (defun vm-su-to-names (m)
101 (mime-eword/decode-string (tm:vm-su-to-names m))
106 (defun tm-vm/decode-message-header (&optional count)
107 "Decode MIME header of current message through tiny-mime.
108 Numeric prefix argument COUNT means to decode the current message plus
109 the next COUNT-1 messages. A negative COUNT means decode the current
110 message and the previous COUNT-1 messages.
111 When invoked on marked messages (via vm-next-command-uses-marks),
112 all marked messages are affected, other messages are ignored."
114 (or count (setq count 1))
115 (vm-follow-summary-cursor)
116 (vm-select-folder-buffer)
117 (vm-check-for-killed-summary)
118 (vm-error-if-folder-empty)
119 (vm-error-if-folder-read-only)
120 (let ((mlist (vm-select-marked-or-prefixed-messages count))
126 (setq realm (vm-real-message-of (car mlist)))
127 ;; Go to real folder of this message.
128 ;; But maybe this message is already real message...
129 (set-buffer (vm-buffer-of realm))
130 (let ((buffer-read-only nil))
132 (narrow-to-region (vm-headers-of realm) (vm-text-of realm))
133 (mime/decode-message-header))
134 (let ((vm-message-pointer (list realm))
136 (vm-discard-cached-data))
137 ;; Mark each virtual and real message for later summary
139 (setq vlist (cons realm (vm-virtual-messages-of realm)))
141 (vm-mark-for-summary-update (car vlist))
142 ;; Remember virtual and real folders related this message,
143 ;; for later display update.
144 (or (memq (vm-buffer-of (car vlist)) vbufs)
145 (setq vbufs (cons (vm-buffer-of (car vlist)) vbufs)))
146 (setq vlist (cdr vlist)))
147 (if (eq vm-flush-interval t)
148 (vm-stuff-virtual-attributes realm)
149 (vm-set-modflag-of realm t)))
150 (setq mlist (cdr mlist)))
151 ;; Update mail-buffers and summaries.
153 (set-buffer (car vbufs))
154 (vm-preview-current-message)
155 (setq vbufs (cdr vbufs))))))
158 ;;; @ automatic MIME preview
161 (defvar tm-vm/automatic-mime-preview t
162 "*If non-nil, show MIME processed article.")
164 (defvar tm-vm/strict-mime t
165 "*If nil, do MIME processing even if there is not MIME-Version field.")
167 (defvar tm-vm/select-message-hook nil
168 "*List of functions called every time a message is selected.
169 tm-vm uses `vm-select-message-hook', use this hook instead.")
171 (defvar tm-vm/system-state nil)
172 (defun tm-vm/system-state ()
174 (if mime::preview/article-buffer
175 (set-buffer mime::preview/article-buffer)
176 (vm-select-folder-buffer))
179 (defun tm-vm/display-preview-buffer ()
180 (let* ((mbuf (current-buffer))
181 (mwin (vm-get-visible-buffer-window mbuf))
182 (pbuf (and mime::article/preview-buffer
183 (get-buffer mime::article/preview-buffer)))
184 (pwin (and pbuf (vm-get-visible-buffer-window pbuf))))
185 (if (and pbuf (tm-vm/system-state))
186 ;; display preview buffer
189 (vm-undisplay-buffer mbuf)
190 (tm-vm/show-current-message))
191 ((and mwin (not pwin))
192 (set-window-buffer mwin pbuf)
193 (tm-vm/show-current-message))
195 (tm-vm/show-current-message))
197 ;; don't display if neither mwin nor pwin was displayed before.
199 ;; display folder buffer
202 (vm-undisplay-buffer pbuf))
203 ((and (not mwin) pwin)
204 (set-window-buffer pwin mbuf))
206 ;; folder buffer is already displayed.
209 ;; don't display if neither mwin nor pwin was displayed before.
213 (defun tm-vm/preview-current-message ()
214 ;; assumed current buffer is folder buffer.
215 (setq tm-vm/system-state nil)
216 (if (get-buffer mime/output-buffer-name)
217 (vm-undisplay-buffer mime/output-buffer-name))
218 (if (and vm-message-pointer tm-vm/automatic-mime-preview)
219 (if (or (not tm-vm/strict-mime)
220 (vm-get-header-contents (car vm-message-pointer)
222 ;; do MIME processiong.
224 (set (make-local-variable 'tm-vm/system-state) 'previewing)
225 (save-window-excursion
227 (goto-char (point-max))
229 (narrow-to-region (point)
232 (vm-start-of (car vm-message-pointer))
238 (if (and tm-vm/use-original-url-button
239 vm-use-menus (vm-menu-support-possible-p))
241 ;; 1996/2/16, fixed by
242 ;; Oscar Figueiredo <figueire@lspsun2.epfl.ch>
243 ;; Highlight message (and display XFace if supported)
244 (if (or vm-highlighted-header-regexp
245 (and (vm-xemacs-p) vm-use-lucid-highlighting))
246 (vm-highlight-headers))
248 (goto-char (point-min))
249 (narrow-to-region (point) (search-forward "\n\n" nil t))
251 ;; don't do MIME processing. decode header only.
252 (let (buffer-read-only)
253 (mime/decode-message-header))
255 ;; don't preview; do nothing.
257 (tm-vm/display-preview-buffer)
258 (run-hooks 'tm-vm/select-message-hook))
260 (defun tm-vm/show-current-message ()
261 (if mime::preview/article-buffer
262 (set-buffer mime::preview/article-buffer)
263 (vm-select-folder-buffer))
264 ;; Now current buffer is folder buffer.
265 (if (or t ; mime/viewer-mode doesn't support narrowing yet.
266 (null vm-preview-lines)
267 (and (not vm-preview-read-messages)
269 (car vm-message-pointer)))
271 (car vm-message-pointer)))))
273 (set-buffer mime::article/preview-buffer)
276 (goto-char (point-min))
278 ;; narrow to page; mime/viewer-mode doesn't support narrowing yet.
280 (if (vm-get-visible-buffer-window mime::article/preview-buffer)
282 (setq tm-vm/system-state 'reading)
283 (if (vm-new-flag (car vm-message-pointer))
284 (vm-set-new-flag (car vm-message-pointer) nil))
285 (if (vm-unread-flag (car vm-message-pointer))
286 (vm-set-unread-flag (car vm-message-pointer) nil))
287 (vm-update-summary-and-mode-line)
289 (vm-update-summary-and-mode-line)))
291 (defun tm-vm/toggle-preview-mode ()
293 (vm-select-folder-buffer)
294 (vm-display (current-buffer) t (list this-command)
295 (list this-command 'reading-message))
296 (if tm-vm/automatic-mime-preview
297 (setq tm-vm/automatic-mime-preview nil
298 tm-vm/system-state nil)
299 (setq tm-vm/automatic-mime-preview t
300 tm-vm/system-state nil)
303 (let* ((mp (car vm-message-pointer))
304 (exposed (= (point-min) (vm-start-of mp))))
305 (if (or (not tm-vm/strict-mime)
306 (vm-get-header-contents mp "MIME-Version:"))
307 ;; do MIME processiong.
309 (set (make-local-variable 'tm-vm/system-state) 'previewing)
310 (save-window-excursion
312 (goto-char (point-min))
313 (narrow-to-region (point)
314 (search-forward "\n\n" nil t))
316 ;; don't do MIME processing. decode header only.
317 (let (buffer-read-only)
318 (mime/decode-message-header))
320 ;; don't preview; do nothing.
322 (tm-vm/display-preview-buffer)
325 (add-hook 'vm-select-message-hook 'tm-vm/preview-current-message)
326 (add-hook 'vm-visit-folder-hook 'tm-vm/preview-current-message)
328 ;;; tm-vm move commands
331 (defmacro tm-vm/save-window-excursion (&rest forms)
332 (list 'let '((tm-vm/selected-window (selected-window)))
333 (list 'unwind-protect
335 '(if (window-live-p tm-vm/selected-window)
336 (select-window tm-vm/selected-window)))))
338 ;;; based on vm-scroll-forward [vm-page.el]
339 (defun tm-vm/scroll-forward (&optional arg)
341 (let ((this-command 'vm-scroll-forward))
342 (if (not (tm-vm/system-state))
343 (vm-scroll-forward arg)
344 (let* ((mp-changed (vm-follow-summary-cursor))
345 (mbuf (or (vm-select-folder-buffer) (current-buffer)))
346 (mwin (vm-get-buffer-window mbuf))
347 (pbuf (and mime::article/preview-buffer
348 (get-buffer mime::article/preview-buffer)))
349 (pwin (and pbuf (vm-get-buffer-window pbuf)))
350 (was-invisible (and (null mwin) (null pwin)))
352 ;; now current buffer is folder buffer.
353 (tm-vm/save-window-excursion
354 (if (or mp-changed was-invisible)
355 (vm-display mbuf t '(vm-scroll-forward vm-scroll-backward)
356 (list this-command 'reading-message)))
357 (tm-vm/display-preview-buffer)
358 (setq mwin (vm-get-buffer-window mbuf)
359 pwin (and pbuf (vm-get-buffer-window pbuf)))
361 ((or mp-changed was-invisible)
365 ;; preview buffer is killed.
366 (tm-vm/preview-current-message)
367 (vm-update-summary-and-mode-line))
368 ((eq (tm-vm/system-state) 'previewing)
369 (tm-vm/show-current-message))
373 (if (pos-visible-in-window-p (point-max) pwin)
375 ;; not end of message. scroll preview buffer only.
382 ;;; based on vm-scroll-backward [vm-page.el]
383 (defun tm-vm/scroll-backward (&optional arg)
385 (let ((this-command 'vm-scroll-backward))
386 (if (not (tm-vm/system-state))
387 (vm-scroll-backward arg)
388 (let* ((mp-changed (vm-follow-summary-cursor))
389 (mbuf (or (vm-select-folder-buffer) (current-buffer)))
390 (mwin (vm-get-buffer-window mbuf))
391 (pbuf (and mime::article/preview-buffer
392 (get-buffer mime::article/preview-buffer)))
393 (pwin (and pbuf (vm-get-buffer-window pbuf)))
394 (was-invisible (and (null mwin) (null pwin)))
396 ;; now current buffer is folder buffer.
397 (if (or mp-changed was-invisible)
398 (vm-display mbuf t '(vm-scroll-forward vm-scroll-backward)
399 (list this-command 'reading-message)))
400 (tm-vm/save-window-excursion
401 (tm-vm/display-preview-buffer)
402 (setq mwin (vm-get-buffer-window mbuf)
403 pwin (and pbuf (vm-get-buffer-window pbuf)))
409 ;; preview buffer is killed.
410 (tm-vm/preview-current-message)
411 (vm-update-summary-and-mode-line))
412 ((eq (tm-vm/system-state) 'previewing)
413 (tm-vm/show-current-message))
417 (if (pos-visible-in-window-p (point-min) pwin)
419 ;; scroll preview buffer only.
425 ;;; based on vm-beginning-of-message [vm-page.el]
426 (defun tm-vm/beginning-of-message ()
427 "Moves to the beginning of the current message."
429 (if (not (tm-vm/system-state))
431 (setq this-command 'vm-beginning-of-message)
432 (vm-beginning-of-message))
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-beginning-of-message)
446 '(vm-beginning-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-min))
455 ;;; based on vm-end-of-message [vm-page.el]
456 (defun tm-vm/end-of-message ()
457 "Moves to the end of the current message."
459 (if (not (tm-vm/system-state))
461 (setq this-command 'vm-end-of-message)
463 (vm-follow-summary-cursor)
464 (vm-select-folder-buffer)
465 (vm-check-for-killed-summary)
466 (vm-error-if-folder-empty)
467 (let ((mbuf (current-buffer))
468 (pbuf (and mime::article/preview-buffer
469 (get-buffer mime::article/preview-buffer))))
472 (tm-vm/preview-current-message)
473 (setq pbuf (get-buffer mime::article/preview-buffer))
475 (vm-display mbuf t '(vm-end-of-message)
476 '(vm-end-of-message reading-message))
477 (tm-vm/display-preview-buffer)
479 (tm-vm/save-window-excursion
480 (select-window (vm-get-buffer-window pbuf))
482 (goto-char (point-max))
485 ;;; based on vm-howl-if-eom [vm-page.el]
486 (defun tm-vm/howl-if-eom ()
487 (let* ((pbuf (or mime::article/preview-buffer (current-buffer)))
488 (pwin (and (vm-get-visible-buffer-window pbuf))))
491 (save-window-excursion
493 (let ((next-screen-context-lines 0))
496 (save-window-excursion
497 (let ((scroll-in-place-replace-original nil))
501 (tm-vm/emit-eom-blurb)
504 ;;; based on vm-emit-eom-blurb [vm-page.el]
505 (defun tm-vm/emit-eom-blurb ()
507 (if mime::preview/article-buffer
508 (set-buffer mime::preview/article-buffer))
509 (vm-emit-eom-blurb)))
511 ;;; based on vm-quit [vm-folder.el]
515 (vm-select-folder-buffer)
516 (if (and mime::article/preview-buffer
517 (get-buffer mime::article/preview-buffer))
518 (kill-buffer mime::article/preview-buffer)))
521 (substitute-key-definition 'vm-scroll-forward
522 'tm-vm/scroll-forward vm-mode-map)
523 (substitute-key-definition 'vm-scroll-backward
524 'tm-vm/scroll-backward vm-mode-map)
525 (substitute-key-definition 'vm-beginning-of-message
526 'tm-vm/beginning-of-message vm-mode-map)
527 (substitute-key-definition 'vm-end-of-message
528 'tm-vm/end-of-message vm-mode-map)
529 (substitute-key-definition 'vm-quit
530 'tm-vm/quit vm-mode-map)
532 ;;; based on vm-next-message [vm-motion.el]
533 (defun tm-vm/next-message ()
534 (set-buffer mime::preview/article-buffer)
535 (let ((this-command 'vm-next-message)
536 (owin (selected-window))
537 (vm-preview-lines nil)
539 (vm-next-message 1 nil t)
540 (if (window-live-p owin)
541 (select-window owin))))
543 ;;; based on vm-previous-message [vm-motion.el]
544 (defun tm-vm/previous-message ()
545 (set-buffer mime::preview/article-buffer)
546 (let ((this-command 'vm-previous-message)
547 (owin (selected-window))
548 (vm-preview-lines nil)
550 (vm-previous-message 1 nil t)
551 (if (window-live-p owin)
552 (select-window owin))))
554 (set-alist 'mime-viewer/over-to-previous-method-alist
555 'vm-mode 'tm-vm/previous-message)
556 (set-alist 'mime-viewer/over-to-next-method-alist
557 'vm-mode 'tm-vm/next-message)
558 (set-alist 'mime-viewer/over-to-previous-method-alist
559 'vm-virtual-mode 'tm-vm/previous-message)
560 (set-alist 'mime-viewer/over-to-next-method-alist
561 'vm-virtual-mode 'tm-vm/next-message)
567 (defun tm-vm/quit-view-message ()
568 "Quit MIME-viewer and go back to VM.
569 This function is called by `mime-viewer/quit' command via
570 `mime-viewer/quitting-method-alist'."
571 (if (get-buffer mime/output-buffer-name)
572 (vm-undisplay-buffer mime/output-buffer-name))
573 (if (and tm-vm/automatic-mime-preview
575 (set-buffer mime::preview/article-buffer)
577 (switch-to-buffer mime::preview/article-buffer)
578 (mime-viewer/kill-buffer)
579 (vm-select-folder-buffer)
580 (setq tm-vm/system-state nil))
581 (vm-display (current-buffer) t (list this-command)
582 (list this-command 'reading-message))
583 (tm-vm/display-preview-buffer)
586 (defun tm-vm/view-message ()
587 "Decode and view MIME encoded message, under VM."
589 (vm-follow-summary-cursor)
590 (vm-select-folder-buffer)
591 (vm-check-for-killed-summary)
592 (vm-error-if-folder-empty)
593 (vm-display (current-buffer) t '(tm-vm/view-message)
594 '(tm-vm/view-mesage reading-message))
595 (let* ((mp (car vm-message-pointer))
596 (ct (vm-get-header-contents mp "Content-Type:"))
597 (cte (vm-get-header-contents mp "Content-Transfer-Encoding:"))
598 (exposed (= (point-min) (vm-start-of mp))))
601 ;; vm-widen-page hides exposed header if pages are delimited.
602 ;; So, here we expose it again.
604 (narrow-to-region (vm-start-of mp) (point-max)))
605 (select-window (vm-get-buffer-window (current-buffer)))
606 (mime/viewer-mode nil
607 (mime/parse-Content-Type (or ct ""))
611 (set-alist 'mime-viewer/quitting-method-alist
613 'tm-vm/quit-view-message)
615 (set-alist 'mime-viewer/quitting-method-alist
617 'tm-vm/quit-view-message)
627 (set-atype 'mime/content-decoding-condition
628 '((type . "message/partial")
629 (method . mime-article/grab-message/partials)
630 (major-mode . vm-mode)
631 (summary-buffer-exp . vm-summary-buffer)
633 (set-alist 'tm-partial/preview-article-method-alist
645 ;;; @@ for multipart/digest
648 (defvar tm-vm/forward-message-hook nil
649 "*List of functions called after a Mail mode buffer has been
650 created to forward a message in message/rfc822 type format.
651 If `vm-forwarding-digest-type' is \"rfc1521\", tm-vm runs this
652 hook instead of `vm-forward-message-hook'.")
654 (defvar tm-vm/send-digest-hook nil
655 "*List of functions called after a Mail mode buffer has been
656 created to send a digest in multipart/digest type format.
657 If `vm-digest-send-type' is \"rfc1521\", tm-vm runs this hook
658 instead of `vm-send-digest-hook'.")
660 (defun tm-vm/enclose-messages (mlist)
661 "Enclose the messages in MLIST as multipart/digest.
662 The resulting digest is inserted at point in the current buffer.
664 MLIST should be a list of message structs (real or virtual).
665 These are the messages that will be enclosed."
667 (let ((digest (consp (cdr mlist)))
670 (narrow-to-region (point) (point))
672 (setq m (vm-real-message-of (car mlist)))
673 (mime-editor/insert-tag "message" "rfc822")
674 (tm-mail/insert-message m)
675 (goto-char (point-max))
676 (setq mlist (cdr mlist)))
678 (mime-editor/enclose-digest-region (point-min) (point-max)))
681 (defun tm-vm/forward-message ()
682 "Forward the current message to one or more recipients.
683 You will be placed in a Mail mode buffer as you would with a
684 reply, but you must fill in the To: header and perhaps the
685 Subject: header manually."
687 (if (not (equal vm-forwarding-digest-type "rfc1521"))
689 (vm-follow-summary-cursor)
690 (vm-select-folder-buffer)
691 (vm-check-for-killed-summary)
692 (vm-error-if-folder-empty)
693 (if (eq last-command 'vm-next-command-uses-marks)
694 (let ((vm-digest-send-type vm-forwarding-digest-type))
695 (setq this-command 'vm-next-command-uses-marks)
696 (command-execute 'tm-vm/send-digest))
697 (let ((dir default-directory)
698 (mp vm-message-pointer))
702 (format "forward of %s's note re: %s"
703 (vm-su-full-name (car vm-message-pointer))
704 (vm-su-subject (car vm-message-pointer)))
706 (and vm-forwarding-subject-format
707 (let ((vm-summary-uninteresting-senders nil))
708 (vm-sprintf 'vm-forwarding-subject-format (car mp)))))
709 (make-local-variable 'vm-forward-list)
710 (setq vm-system-state 'forwarding
711 vm-forward-list (list (car mp))
712 default-directory dir)
713 (goto-char (point-min))
715 (concat "^" (regexp-quote mail-header-separator) "\n") nil 0)
716 (tm-vm/enclose-messages vm-forward-list)
717 (mail-position-on-field "To"))
718 (run-hooks 'tm-vm/forward-message-hook)
719 (run-hooks 'vm-mail-mode-hook)))))
721 (defun tm-vm/send-digest (&optional prefix)
722 "Send a digest of all messages in the current folder to recipients.
723 The type of the digest is specified by the variable vm-digest-send-type.
724 You will be placed in a Mail mode buffer as is usual with replies, but you
725 must fill in the To: and Subject: headers manually.
727 If invoked on marked messages (via vm-next-command-uses-marks),
728 only marked messages will be put into the digest."
730 (if (not (equal vm-digest-send-type "rfc1521"))
731 (vm-send-digest prefix)
732 (vm-select-folder-buffer)
733 (vm-check-for-killed-summary)
734 (vm-error-if-folder-empty)
735 (let ((dir default-directory)
736 (mp vm-message-pointer)
737 (mlist (if (eq last-command 'vm-next-command-uses-marks)
738 (vm-select-marked-or-prefixed-messages 0)
743 (vm-mail-internal (format "digest from %s" (buffer-name)))
744 (setq vm-system-state 'forwarding
745 vm-forward-list mlist
746 default-directory dir)
747 (goto-char (point-min))
748 (re-search-forward (concat "^" (regexp-quote mail-header-separator)
750 (goto-char (match-end 0))
753 (vm-unsaved-message "Building %s digest..." vm-digest-send-type)
754 (tm-vm/enclose-messages mlist)
759 (mime-editor/insert-tag "text" "plain")
760 (vm-unsaved-message "Building digest preamble...")
762 (let ((vm-summary-uninteresting-senders nil))
763 (insert (vm-sprintf 'vm-digest-preamble-format (car mp)) "\n"))
764 (if vm-digest-center-preamble
769 (setq mp (cdr mp)))))
770 (mail-position-on-field "To")
771 (message "Building %s digest... done" vm-digest-send-type)))
772 (run-hooks 'tm-vm/send-digest-hook)
773 (run-hooks 'vm-mail-mode-hook)))
775 (substitute-key-definition 'vm-forward-message
776 'tm-vm/forward-message vm-mode-map)
777 (substitute-key-definition 'vm-send-digest
778 'tm-vm/send-digest vm-mode-map)
780 ;;; @@ for message/rfc822
787 (defvar tm-vm/use-xemacs-popup-menu t)
789 ;;; modified by Steven L. Baur <steve@miranova.com>
790 ;;; 1995/12/6 (c.f. [tm-en:209])
791 (defun mime-editor/attach-to-vm-mode-menu ()
792 "Arrange to attach MIME editor's popup menu to VM's"
793 (if (boundp 'vm-menu-mail-menu)
795 (setq vm-menu-mail-menu
796 (append vm-menu-mail-menu
798 mime-editor/popup-menu-for-xemacs)))
799 (remove-hook 'vm-mail-mode-hook 'mime-editor/attach-to-vm-mode-menu)
806 (autoload 'tm-mail/insert-message "tm-mail")
807 (set-alist 'mime-editor/message-inserter-alist
808 'mail-mode (function tm-mail/insert-message))
809 (if (and (string-match "XEmacs\\|Lucid" emacs-version)
810 tm-vm/use-xemacs-popup-menu)
811 (add-hook 'vm-mail-mode-hook 'mime-editor/attach-to-vm-mode-menu)
819 (setq vm-forwarding-digest-type "rfc1521")
820 (setq vm-digest-send-type "rfc1521")
833 (or (fboundp 'tm:bbdb/vm-update-record)
834 (fset 'tm:bbdb/vm-update-record
835 (symbol-function 'bbdb/vm-update-record)))
836 (defun bbdb/vm-update-record (&optional offer-to-create)
837 (vm-select-folder-buffer)
838 (if (and (tm-vm/system-state)
839 mime::article/preview-buffer
840 (get-buffer mime::article/preview-buffer))
841 (tm-bbdb/update-record offer-to-create)
842 (tm:bbdb/vm-update-record offer-to-create)
844 (remove-hook 'vm-select-message-hook 'bbdb/vm-update-record)
845 (remove-hook 'vm-show-message-hook 'bbdb/vm-update-record)
846 (add-hook 'tm-vm/select-message-hook 'bbdb/vm-update-record)
855 (run-hooks 'tm-vm-load-hook)
857 ;;; tm-vm.el ends here.