;;; @ require modules
;;;
(require 'tl-str)
+(require 'tl-misc)
(require 'tm-misc)
(require 'mh-e)
(if (not (boundp 'mh-e-version))
(require 'tm-mh-e3)
)
-(autoload 'mime/viewer-mode "tm-view" "View MIME message." t)
+(require 'tm-view)
;;; @ version
;;;
(defconst tm-mh-e/RCS-ID
- "$Id: tm-mh-e.el,v 6.1 1995/04/18 16:49:45 morioka Exp $")
+ "$Id: tm-mh-e.el,v 6.18 1995/06/20 21:07:39 morioka Exp $")
(defconst tm-mh-e/version (get-version-string tm-mh-e/RCS-ID))
-;;; @ MIME header decoding mode
+;;; @ variable
;;;
-(defun tm-mh-e/toggle-header-decoding-mode (arg)
- "Toggle MIME header processing.
+(defvar tm-mh-e/decode-all t
+ "*If t, decode all of the message. Otherwise decode header only.")
+
+
+;;; @ functions
+;;;
+
+(defun tm-mh-e/display-msg (msg-num folder &optional show-buffer mode)
+ (or mode
+ (setq mode tm-mh-e/decode-all)
+ )
+ ;; Display message NUMBER of FOLDER.
+ ;; Sets the current buffer to the show buffer.
+ (set-buffer folder)
+ (or show-buffer
+ (setq show-buffer mh-show-buffer))
+ ;; Bind variables in folder buffer in case they are local
+ (let ((msg-filename (mh-msg-filename msg-num)))
+ (if (not (file-exists-p msg-filename))
+ (error "Message %d does not exist" msg-num))
+ (set-buffer show-buffer)
+ (cond ((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
+ (setq buffer-read-only nil)
+ (erase-buffer)
+ (if mode
+ (progn
+ (let ((file-coding-system-for-read
+ (if (boundp 'MULE) *noconv*))
+ kanji-fileio-code)
+ (insert-file-contents msg-filename)
+ ;; (goto-char (point-min))
+ (while (re-search-forward "\r$" nil t)
+ (replace-match "")
+ )
+ )
+ (set-buffer-modified-p nil)
+ (setq buffer-read-only t)
+ (mh-show-mode)
+ (mime/viewer-mode)
+ (goto-char (point-min))
+ )
+ (let ((clean-message-header mh-clean-message-header)
+ (invisible-headers mh-invisible-headers)
+ (visible-headers mh-visible-headers)
+ )
+ (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
+ (mh-start-of-uncleaned-message)))
+ (mime/decode-message-header)
+ (set-buffer-modified-p nil)
+ (setq buffer-read-only t)
+ (mh-show-mode)
+ ))
+ (or (eq buffer-undo-list t) ;don't save undo info for prev msgs
+ (setq buffer-undo-list 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)))
+ (set-buffer folder)
+ (setq mh-showing-with-headers nil)))))
+
+(fset 'mh-display-msg (symbol-function 'tm-mh-e/display-msg))
+
+(defun tm-mh-e/view-message (&optional msg)
+ "MIME decode and play this message."
+ (interactive)
+ (mh-invalidate-show-buffer)
+ (let ((tm-mh-e/decode-all t))
+ (mh-show-msg msg)
+ )
+ (pop-to-buffer (save-window-excursion
+ (switch-to-buffer mh-show-buffer)
+ mime::article/preview-buffer))
+ )
+
+(defun tm-mh-e/toggle-decoding-mode (arg)
+ "Toggle MIME processing mode.
With arg, turn MIME processing on if arg is positive."
(interactive "P")
- (setq mime/header-decoding-mode
+ (setq tm-mh-e/decode-all
(if (null arg)
- (not mime/header-decoding-mode)
+ (not tm-mh-e/decode-all)
arg))
- (mh-invalidate-show-buffer)
- (mh-show-msg (mh-get-msg-num t))
- )
+ (save-window-excursion
+ (switch-to-buffer mh-show-buffer)
+ (if (null tm-mh-e/decode-all)
+ (if (and mime::article/preview-buffer
+ (get-buffer mime::article/preview-buffer))
+ (kill-buffer mime::article/preview-buffer)
+ )))
+ (mh-show (mh-get-msg-num t))
+ (if tm-mh-e/decode-all
+ (let ((the-buf (current-buffer)))
+ (if mime::article/preview-buffer
+ (pop-to-buffer (save-excursion
+ (switch-to-buffer mh-show-buffer)
+ mime::article/preview-buffer))
+ (tm-mh-e/view-message (mh-get-msg-num t)))
+ (pop-to-buffer the-buf)
+ )))
+
+(defun tm-mh-e/page-msg ()
+ (interactive)
+ (if tm-mh-e/decode-all
+ (scroll-other-window)
+ (mh-page-msg)
+ ))
+
+(defun tm-mh-e/previous-page ()
+ (interactive)
+ (if tm-mh-e/decode-all
+ (scroll-other-window (- (save-window-excursion
+ (other-window 1)
+ (window-height))))
+ (mh-previous-page)
+ ))
+
+(defun tm-mh-e/cite ()
+ (interactive)
+ (if tm-mh-e/decode-all
+ (save-excursion
+ (save-restriction
+ (insert-buffer
+ (save-window-excursion
+ (switch-to-buffer (concat "show-" mh-sent-from-folder))
+ mime::article/preview-buffer))
+ (if (looking-at "^\\[.+\\]\n")
+ (replace-match ""))
+ (run-hooks 'mail-citation-hook)
+ ))
+ (mh-yank-cur-msg)
+ ))
-;;; @ MIME body players
+;;; @ for tm-view
;;;
-(defun tm-mh-e/view-message (arg)
- "MIME decode and play this message."
- (interactive "P")
- (mh-invalidate-show-buffer)
- (mh-show-msg (mh-get-msg-num t))
- (pop-to-buffer mh-show-buffer t)
- ;; patch for mh-narrow.el
- ;; by YAMAOKA Katsumi <yamaoka@ga.sony.co.jp>
- (if (featurep 'mh-narrow)
- (widen)
- )
- ;; end of patch
- (mime/viewer-mode)
+
+(fset 'tm-mh-e/code-convert-region-to-emacs
+ (symbol-function 'mime/code-convert-region-to-emacs))
+
+(defun tm-mh-e/content-header-filter ()
+ (goto-char (point-min))
+ (while (and (re-search-forward
+ (concat "^" mime-viewer/ignored-field-regexp ":")
+ nil t)
+ (progn
+ (delete-region
+ (match-beginning 0)
+ (save-excursion
+ (and
+ (re-search-forward "^\\([^ \t]\\|$\\)" nil t)
+ (match-beginning 0)
+ )))
+ t)))
+ (tm-mh-e/code-convert-region-to-emacs (point-min)(point-max)
+ mime/default-coding-system)
+ (mime/decode-message-header)
)
+(defun tm-mh-e/quitting-method ()
+ (let ((win (get-buffer-window
+ mime/output-buffer-name))
+ (buf mime::preview/article-buffer)
+ )
+ (if win
+ (delete-window win)
+ )
+ (pop-to-buffer
+ (let ((name (buffer-name buf)))
+ (substring name 5)
+ ))
+ (if (not tm-mh-e/decode-all)
+ (mh-show (mh-get-msg-num t))
+ )))
+
;;; @ for tm-comp
;;;
(insert-file (tm-mh-e::message/file-name message))
)
-(if (featurep 'tm-comp)
- (set-alist 'tm-comp/message-inserter-alist
- 'mh-letter-mode (function tm-mh-e::insert-message))
- (add-hook 'tm-comp-load-hook
- (function
- (lambda ()
- (set-alist
- 'tm-comp/message-inserter-alist
- 'mh-letter-mode (function tm-mh-e::insert-message))
- )))
- )
+(call-after-loaded
+ 'tm-comp
+ (function
+ (lambda ()
+ (set-alist
+ 'tm-comp/message-inserter-alist
+ 'mh-letter-mode (function tm-mh-e::insert-message))
+ )))
;;; @ set up
;;;
-(defun tm-mh-e/decode-message-header ()
- (make-local-variable 'minor-mode-alist)
- (mime/add-header-decoding-mode-to-mode-line)
- (let ((buffer-read-only nil))
- (mime/decode-message-header-if-you-need)
- (set-buffer-modified-p nil)
- ))
-(add-hook 'mh-show-mode-hook
- (function tm-mh-e/decode-message-header))
+;;(add-hook 'mh-show-mode-hook (function mime/viewer-mode))
-(define-key mh-folder-mode-map "\et" 'tm-mh-e/toggle-header-decoding-mode)
-(define-key mh-folder-mode-map "v" 'tm-mh-e/view-message)
+(define-key mh-folder-mode-map "v" (function tm-mh-e/view-message))
+(define-key mh-folder-mode-map "\et" (function tm-mh-e/toggle-decoding-mode))
(define-key mh-folder-mode-map "\r"
(function (lambda ()
(interactive)
(interactive)
(scroll-other-window -1)
)))
+(define-key mh-folder-mode-map " " (function tm-mh-e/page-msg))
+(define-key mh-folder-mode-map "\177" (function tm-mh-e/previous-page))
+
+(add-hook 'mh-letter-mode-hook
+ (function
+ (lambda ()
+ (define-key mh-letter-mode-map "\C-c\C-y" (function tm-mh-e/cite))
+ )))
+
+(set-alist 'mime-viewer/quitting-method-alist
+ 'mh-show-mode
+ (function tm-mh-e/quitting-method))
+
+(set-alist 'mime-viewer/content-header-filter-alist
+ 'mh-show-mode
+ (function tm-mh-e/content-header-filter))
+
+(set-alist 'mime-viewer/code-converter-alist
+ 'mh-show-mode
+ (function tm-mh-e/code-convert-region-to-emacs))
+(run-hooks 'tm-mh-e-load-hook)
(provide 'tm-mh-e)