;;; ;;; Copyright (C) 1995 Free Software Foundation, Inc. ;;; Copyright (C) 1994,1995 MORIOKA Tomohiko ;;; ;;; Author: MORIOKA Tomohiko ;;; Version: ;;; $Id: tm-rmail.el,v 7.15 1995/11/12 15:15:15 morioka Exp $ ;;; Keywords: mail, MIME, multimedia, multilingual, encoded-word ;;; ;;; This file is part of tm (Tools for MIME). ;;; (require 'tl-list) (require 'tl-misc) (require 'rmail) (autoload 'mime/viewer-mode "tm-view" "View MIME message." t) (autoload 'mime/Content-Type "tm-view" "parse Content-Type field.") (autoload 'mime/decode-message-header "tm-ew-d" "Decode MIME encoded-word." t) ;;; @ variables ;;; (defvar tm-rmail/decode-all nil) ;;; @ message filter ;;; (setq rmail-message-filter (function (lambda () (let ((mf (buffer-modified-p)) (buffer-read-only nil)) (mime/decode-message-header) (set-buffer-modified-p mf) )))) ;;; @ MIME preview ;;; (defun tm-rmail/show-all-header-p () (save-restriction (narrow-to-region (point-min) (and (re-search-forward "^$" nil t) (match-beginning 0))) (goto-char (point-min)) (re-search-forward rmail-ignored-headers nil t) )) (defun tm-rmail/preview-message () (interactive) (setq tm-rmail/decode-all t) (let ((ret (rmail-widen-to-current-msgbeg (function (lambda () (cons (mime/Content-Type) (mime/Content-Transfer-Encoding "7bit") ) ))))) (narrow-to-region (point-min) (save-excursion (goto-char (point-max)) (if (and (re-search-backward "^\n") (eq (match-end 0)(point-max))) (match-beginning 0) (point-max) ))) (mime/viewer-mode nil (car ret)(cdr ret) nil (format "*Preview-%s [%d/%d]*" (buffer-name) rmail-current-message rmail-total-messages)) )) (defun tm-rmail/preview-message-if-you-need () (if tm-rmail/decode-all (tm-rmail/preview-message) )) (add-hook 'rmail-show-message-hook 'tm-rmail/preview-message-if-you-need) (define-key rmail-mode-map "v" (function tm-rmail/preview-message)) (defun tm-rmail/setup () (local-set-key "v" (function (lambda () (interactive) (pop-to-buffer rmail-buffer) (tm-rmail/preview-message) ))) ) (add-hook 'rmail-summary-mode-hook 'tm-rmail/setup) ;;; @ over-to-* and quitting methods ;;; (defun tm-rmail/quitting-method-to-summary () (mime-viewer/kill-buffer) (rmail-summary) (delete-other-windows) ) (defun tm-rmail/quitting-method-to-article () (setq tm-rmail/decode-all nil) (mime-viewer/kill-buffer) ) (defalias 'tm-rmail/quitting-method 'tm-rmail/quitting-method-to-article) (defun tm-rmail/over-to-previous-method () (let (tm-rmail/decode-all) (mime-viewer/quit) ) (if (not (eq (rmail-next-undeleted-message -1) t)) (tm-rmail/preview-message) ) ) (defun tm-rmail/over-to-next-method () (let (tm-rmail/decode-all) (mime-viewer/quit) ) (if (not (eq (rmail-next-undeleted-message 1) t)) (tm-rmail/preview-message) ) ) (call-after-loaded 'tm-view (function (lambda () (set-alist 'mime-viewer/quitting-method-alist 'rmail-mode (function tm-rmail/quitting-method)) (set-alist 'mime-viewer/over-to-previous-method-alist 'rmail-mode (function tm-rmail/over-to-previous-method)) (set-alist 'mime-viewer/over-to-next-method-alist 'rmail-mode (function tm-rmail/over-to-next-method)) ))) ;;; @ for tm-partial ;;; (call-after-loaded 'tm-partial (function (lambda () (set-atype 'mime/content-decoding-condition '((type . "message/partial") (method . mime-article/grab-message/partials) (major-mode . rmail-mode) (summary-buffer-exp . (progn (rmail-summary) (pop-to-buffer rmail-buffer) rmail-summary-buffer)) )) (set-alist 'tm-partial/preview-article-method-alist 'rmail-mode (function (lambda () (rmail-summary-goto-msg (count-lines 1 (point))) (pop-to-buffer rmail-buffer) (tm-rmail/preview-message) ))) ))) ;;; @ for tm-edit ;;; (call-after-loaded 'tm-edit (function (lambda () (defun tm-rmail/forward () "\ Forward current message in message/rfc822 content-type message from rmail. The message will be appended if being composed." (interactive) ;;>> this gets set even if we abort. Can't do anything about it, though. (rmail-set-attribute "forwarded" t) (let ((initialized nil) (beginning nil) (forwarding-buffer (current-buffer)) (subject (concat "[" (mail-strip-quoted-names (mail-fetch-field "From")) ": " (or (mail-fetch-field "Subject") "") "]"))) ;; If only one window, use it for the mail buffer. ;; Otherwise, use another window for the mail buffer ;; so that the Rmail buffer remains visible ;; and sending the mail will get back to it. (setq initialized (if (one-window-p t) (mail nil nil subject) (mail-other-window nil nil subject))) (save-excursion (goto-char (point-max)) (forward-line 1) (setq beginning (point)) (mime-editor/insert-tag "message" "rfc822") (insert-buffer forwarding-buffer)) (if (not initialized) (goto-char beginning)) )) (substitute-key-definition 'rmail-forward 'tm-rmail/forward rmail-mode-map) (defun gnus-mail-forward-using-mail-mime () "\ Forward current article in message/rfc822 content-type message from GNUS. The message will be appended if being composed." (let ((initialized nil) (beginning nil) (forwarding-buffer (current-buffer)) (subject (concat "[" gnus-newsgroup-name "] " ;;(mail-strip-quoted-names (gnus-fetch-field "From")) ": " (or (gnus-fetch-field "Subject") "")))) ;; If only one window, use it for the mail buffer. ;; Otherwise, use another window for the mail buffer ;; so that the Rmail buffer remains visible ;; and sending the mail will get back to it. (setq initialized (if (one-window-p t) (mail nil nil subject) (mail-other-window nil nil subject))) (save-excursion (goto-char (point-max)) (setq beginning (point)) (mime-editor/insert-tag "message" "rfc822") (insert-buffer forwarding-buffer) ;; You have a chance to arrange the message. (run-hooks 'gnus-mail-forward-hook) ) (if (not initialized) (goto-char beginning)) )) ;; (setq gnus-mail-forward-method 'mime-forward-from-gnus-using-mail) ))) ;;; @ end ;;; (provide 'tm-rmail) (run-hooks 'tm-rmail-load-hook)