2 ;;; tm-mh-e.el --- MIME extender for mh-e
4 ;;; Copyright (C) 1995 Free Software Foundation, Inc.
5 ;;; Copyright (C) 1993,1994,1995 MORIOKA Tomohiko
7 ;;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
8 ;;; Keywords: mail, MH, MIME, multimedia, encoded-word, multilingual
10 ;;; This file is part of tm (Tools for MIME).
19 (if (not (boundp 'mh-e-version))
28 (defconst tm-mh-e/RCS-ID
29 "$Id: tm-mh-e.el,v 7.3 1995/10/13 08:15:17 morioka Exp $")
31 (defconst tm-mh-e/version (get-version-string tm-mh-e/RCS-ID))
37 (defvar tm-mh-e/decode-all t
38 "*If t, decode all of the message. Otherwise decode header only.")
44 (if (not (fboundp 'tm-mh-e/original-mh-display-msg))
45 (fset 'tm-mh-e/original-mh-display-msg
46 (symbol-function 'mh-display-msg))
49 (defun mh-display-msg (msg-num folder &optional show-buffer mode)
51 (setq mode tm-mh-e/decode-all)
53 ;; Display message NUMBER of FOLDER.
54 ;; Sets the current buffer to the show buffer.
57 (setq show-buffer mh-show-buffer))
58 ;; Bind variables in folder buffer in case they are local
59 (let ((msg-filename (mh-msg-filename msg-num)))
60 (if (not (file-exists-p msg-filename))
61 (error "Message %d does not exist" msg-num))
62 (set-buffer show-buffer)
63 (cond ((not (equal msg-filename buffer-file-name))
64 ;; Buffer does not yet contain message.
65 (clear-visited-file-modtime)
67 (setq buffer-file-name nil) ; no locking during setup
68 (setq buffer-read-only nil)
71 (let* ((aname (concat "article-" folder))
72 (abuf (get-buffer aname))
77 (setq buffer-read-only nil)
80 (setq abuf (get-buffer-create aname))
83 (let ((file-coding-system-for-read
84 (if (boundp 'MULE) *noconv*))
86 (insert-file-contents msg-filename)
87 ;; (goto-char (point-min))
88 (while (re-search-forward "\r$" nil t)
92 (set-buffer-modified-p nil)
93 (setq buffer-read-only t)
95 (mime/viewer-mode nil nil nil
96 aname (concat "show-" folder))
97 (goto-char (point-min))
99 (let ((clean-message-header mh-clean-message-header)
100 (invisible-headers mh-invisible-headers)
101 (visible-headers mh-visible-headers)
104 ;; modified by ARIURA <ariura@cc.tuat.ac.jp>
107 (mh-exec-lib-cmd-output "mhl" "-nobell" "-noclear"
108 (if (stringp mhl-formfile)
109 (list "-form" mhl-formfile))
111 (insert-file-contents msg-filename))
113 (goto-char (point-min))
114 (cond (clean-message-header
115 (mh-clean-msg-header (point-min)
118 (goto-char (point-min)))
120 (mh-start-of-uncleaned-message)))
121 (mime/decode-message-header)
122 (set-buffer-modified-p nil)
123 (setq buffer-read-only t)
126 (or (eq buffer-undo-list t) ;don't save undo info for prev msgs
127 (setq buffer-undo-list nil))
128 (setq buffer-file-name msg-filename)
130 (setq mode-line-buffer-identification
131 (list (format mh-show-buffer-mode-line-buffer-id
134 (setq mh-showing-with-headers nil)))))
136 (defun tm-mh-e/view-message (&optional msg)
137 "MIME decode and play this message."
139 (if (null tm-mh-e/decode-all)
140 (let ((tm-mh-e/decode-all t))
141 (mh-invalidate-show-buffer)
144 (pop-to-buffer mh-show-buffer)
147 (defun tm-mh-e/toggle-decoding-mode (arg)
148 "Toggle MIME processing mode.
149 With arg, turn MIME processing on if arg is positive."
151 (setq tm-mh-e/decode-all
153 (not tm-mh-e/decode-all)
156 (set-buffer mh-show-buffer)
157 (if (null tm-mh-e/decode-all)
158 (if (and mime::preview/article-buffer
159 (get-buffer mime::preview/article-buffer))
160 (kill-buffer mime::preview/article-buffer)
162 (mh-invalidate-show-buffer)
163 (mh-show (mh-get-msg-num t))
166 (defun tm-mh-e/header-display ()
168 (if tm-mh-e/decode-all
169 (let ((win (selected-window)))
170 (pop-to-buffer mh-show-buffer)
171 (switch-to-buffer mime::preview/article-buffer)
172 (goto-char (point-min))
182 (fset 'tm-mh-e/code-convert-region-to-emacs
183 (symbol-function 'mime/code-convert-region-to-emacs))
185 (defun tm-mh-e/content-header-filter ()
186 (goto-char (point-min))
187 (while (and (re-search-forward mime-viewer/ignored-field-regexp nil t)
193 (re-search-forward "^\\([^ \t]\\|$\\)" nil t)
197 (tm-mh-e/code-convert-region-to-emacs (point-min)(point-max)
198 mime/default-coding-system)
199 (mime/decode-message-header)
200 (if (featurep 'hilit19)
201 (hilit-rehighlight-buffer-quietly)
205 (defun tm-mh-e/quitting-method ()
206 (let ((win (get-buffer-window
207 mime/output-buffer-name))
208 (buf (current-buffer))
214 (let ((name (buffer-name buf)))
217 (if (not tm-mh-e/decode-all)
218 (mh-invalidate-show-buffer)
220 (mh-show (mh-get-msg-num t))
227 (defun tm-mh-e::make-message (folder number)
228 (vector folder number)
231 (defun tm-mh-e::message/folder (message)
235 (defun tm-mh-e::message/number (message)
239 (defun tm-mh-e::message/file-name (message)
241 (tm-mh-e::message/number message)
242 (mh-expand-file-name (tm-mh-e::message/folder message))
245 (defun tm-mh-e::prompt-for-message (prompt folder &optional default)
247 (directory-files (mh-expand-file-name folder) nil "^[0-9]+$")
249 (completing-read prompt
260 (defun tm-mh-e::query-message ()
261 (let* ((folder (mh-prompt-for-folder "Visit" "+inbox" nil))
262 (number (tm-mh-e::prompt-for-message "Number?" folder))
264 (tm-mh-e::make-message folder number)
267 (defun tm-mh-e::insert-message (&optional message)
269 (setq message (tm-mh-e::query-message))
271 (insert-file (tm-mh-e::message/file-name message))
279 'tm-comp/message-inserter-alist
280 'mh-letter-mode (function tm-mh-e::insert-message))
287 (define-key mh-folder-mode-map "v" (function tm-mh-e/view-message))
288 (define-key mh-folder-mode-map "\et" (function tm-mh-e/toggle-decoding-mode))
289 (define-key mh-folder-mode-map "," (function tm-mh-e/header-display))
290 (define-key mh-folder-mode-map "\r"
293 (scroll-other-window 1)
295 (define-key mh-folder-mode-map "\e\r"
298 (scroll-other-window -1)
301 (defun tm-mh-e/summary-before-quit ()
302 (let ((buf (get-buffer mh-show-buffer)))
304 (let ((the-buf (current-buffer)))
305 (switch-to-buffer buf)
306 (if (and mime::article/preview-buffer
307 (setq buf (get-buffer mime::article/preview-buffer))
310 (switch-to-buffer the-buf)
313 (switch-to-buffer the-buf)
317 (add-hook 'mh-before-quit-hook (function tm-mh-e/summary-before-quit))
319 (set-alist 'mime-viewer/quitting-method-alist
321 (function tm-mh-e/quitting-method))
323 (set-alist 'mime-viewer/content-header-filter-alist
325 (function tm-mh-e/content-header-filter))
327 (set-alist 'mime-viewer/code-converter-alist
329 (function tm-mh-e/code-convert-region-to-emacs))
337 (run-hooks 'tm-mh-e-load-hook)