2 ;;; A MIME extender for mh-e
4 ;;; by Morioka Tomohiko, 1993/11/21
5 ;;; modified by YAMAOKA Katsumi <yamaoka@ga.sony.co.jp>
15 (if (not (boundp 'mh-e-version))
24 (defconst tm-mh-e/RCS-ID
25 "$Id: tm-mh-e.el,v 6.24 1995/09/02 06:02:20 morioka Exp $")
27 (defconst tm-mh-e/version (get-version-string tm-mh-e/RCS-ID))
33 (defvar tm-mh-e/decode-all t
34 "*If t, decode all of the message. Otherwise decode header only.")
40 (defun tm-mh-e/display-msg (msg-num folder &optional show-buffer mode)
42 (setq mode tm-mh-e/decode-all)
44 ;; Display message NUMBER of FOLDER.
45 ;; Sets the current buffer to the show buffer.
48 (setq show-buffer mh-show-buffer))
49 ;; Bind variables in folder buffer in case they are local
50 (let ((msg-filename (mh-msg-filename msg-num)))
51 (if (not (file-exists-p msg-filename))
52 (error "Message %d does not exist" msg-num))
53 (set-buffer show-buffer)
54 (cond ((not (equal msg-filename buffer-file-name))
55 ;; Buffer does not yet contain message.
56 (clear-visited-file-modtime)
58 (setq buffer-file-name nil) ; no locking during setup
59 (setq buffer-read-only nil)
63 (let ((file-coding-system-for-read
64 (if (boundp 'MULE) *noconv*))
66 (insert-file-contents msg-filename)
67 ;; (goto-char (point-min))
68 (while (re-search-forward "\r$" nil t)
72 (set-buffer-modified-p nil)
73 (setq buffer-read-only t)
76 (goto-char (point-min))
78 (let ((clean-message-header mh-clean-message-header)
79 (invisible-headers mh-invisible-headers)
80 (visible-headers mh-visible-headers)
82 (insert-file-contents msg-filename)
83 (goto-char (point-min))
84 (cond (clean-message-header
85 (mh-clean-msg-header (point-min)
88 (goto-char (point-min)))
90 (mh-start-of-uncleaned-message)))
91 (mime/decode-message-header)
92 (set-buffer-modified-p nil)
93 (setq buffer-read-only t)
96 (or (eq buffer-undo-list t) ;don't save undo info for prev msgs
97 (setq buffer-undo-list nil))
98 (setq buffer-file-name msg-filename)
100 (setq mode-line-buffer-identification
101 (list (format mh-show-buffer-mode-line-buffer-id
104 (setq mh-showing-with-headers nil)))))
106 (fset 'mh-display-msg (symbol-function 'tm-mh-e/display-msg))
108 (defun tm-mh-e/view-message (&optional msg)
109 "MIME decode and play this message."
111 (mh-invalidate-show-buffer)
112 (let ((tm-mh-e/decode-all t))
115 (pop-to-buffer (save-window-excursion
116 (switch-to-buffer mh-show-buffer)
117 mime::article/preview-buffer))
120 (defun tm-mh-e/toggle-decoding-mode (arg)
121 "Toggle MIME processing mode.
122 With arg, turn MIME processing on if arg is positive."
124 (setq tm-mh-e/decode-all
126 (not tm-mh-e/decode-all)
128 (save-window-excursion
129 (switch-to-buffer mh-show-buffer)
130 (if (null tm-mh-e/decode-all)
131 (if (and mime::article/preview-buffer
132 (get-buffer mime::article/preview-buffer))
133 (kill-buffer mime::article/preview-buffer)
135 (mh-show (mh-get-msg-num t))
136 (if tm-mh-e/decode-all
137 (let ((the-buf (current-buffer)))
138 (if mime::article/preview-buffer
139 (pop-to-buffer (save-excursion
140 (switch-to-buffer mh-show-buffer)
141 mime::article/preview-buffer))
142 (tm-mh-e/view-message (mh-get-msg-num t)))
143 (pop-to-buffer the-buf)
146 (defun tm-mh-e/page-msg ()
148 (if tm-mh-e/decode-all
149 (scroll-other-window)
153 (defun tm-mh-e/previous-page ()
155 (if tm-mh-e/decode-all
156 (scroll-other-window (- (save-window-excursion
162 (defun tm-mh-e/cite ()
164 (if tm-mh-e/decode-all
168 (save-window-excursion
169 (switch-to-buffer (concat "show-" mh-sent-from-folder))
170 mime::article/preview-buffer))
171 (if (looking-at "^\\[.+\\(\n[ \t].+\\)*\\]\n")
173 (narrow-to-region (point)(point-max))
174 (mh-insert-prefix-string mh-ins-buf-prefix)
183 (fset 'tm-mh-e/code-convert-region-to-emacs
184 (symbol-function 'mime/code-convert-region-to-emacs))
186 (defun tm-mh-e/content-header-filter ()
187 (goto-char (point-min))
188 (while (and (re-search-forward
189 (concat "^" mime-viewer/ignored-field-regexp ":")
196 (re-search-forward "^\\([^ \t]\\|$\\)" nil t)
200 (tm-mh-e/code-convert-region-to-emacs (point-min)(point-max)
201 mime/default-coding-system)
202 (mime/decode-message-header)
205 (defun tm-mh-e/quitting-method ()
206 (let ((win (get-buffer-window
207 mime/output-buffer-name))
208 (buf mime::preview/article-buffer)
214 (let ((name (buffer-name buf)))
217 (if (not tm-mh-e/decode-all)
218 (mh-show (mh-get-msg-num t))
225 (defun tm-mh-e::make-message (folder number)
226 (vector folder number)
229 (defun tm-mh-e::message/folder (message)
233 (defun tm-mh-e::message/number (message)
237 (defun tm-mh-e::message/file-name (message)
239 (tm-mh-e::message/number message)
240 (mh-expand-file-name (tm-mh-e::message/folder message))
243 (defun tm-mh-e::prompt-for-message (prompt folder &optional default)
245 (directory-files (mh-expand-file-name folder) nil "^[0-9]+$")
247 (completing-read prompt
258 (defun tm-mh-e::query-message ()
259 (let* ((folder (mh-prompt-for-folder "Visit" "+inbox" nil))
260 (number (tm-mh-e::prompt-for-message "Number?" folder))
262 (tm-mh-e::make-message folder number)
265 (defun tm-mh-e::insert-message (&optional message)
267 (setq message (tm-mh-e::query-message))
269 (insert-file (tm-mh-e::message/file-name message))
277 'tm-comp/message-inserter-alist
278 'mh-letter-mode (function tm-mh-e::insert-message))
285 ;;(add-hook 'mh-show-mode-hook (function mime/viewer-mode))
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 "\r"
292 (scroll-other-window 1)
294 (define-key mh-folder-mode-map "\e\r"
297 (scroll-other-window -1)
299 (define-key mh-folder-mode-map " " (function tm-mh-e/page-msg))
300 (define-key mh-folder-mode-map "\177" (function tm-mh-e/previous-page))
302 (add-hook 'mh-letter-mode-hook
305 (define-key mh-letter-mode-map "\C-c\C-y" (function tm-mh-e/cite))
308 (defun tm-mh-e/summary-before-quit ()
309 (let ((buf (get-buffer mh-show-buffer)))
311 (let ((the-buf (current-buffer)))
312 (switch-to-buffer buf)
313 (if (and mime::article/preview-buffer
314 (setq buf (get-buffer mime::article/preview-buffer))
317 (switch-to-buffer the-buf)
320 (switch-to-buffer the-buf)
324 (add-hook 'mh-before-quit-hook (function tm-mh-e/summary-before-quit))
326 (set-alist 'mime-viewer/quitting-method-alist
328 (function tm-mh-e/quitting-method))
330 (set-alist 'mime-viewer/content-header-filter-alist
332 (function tm-mh-e/content-header-filter))
334 (set-alist 'mime-viewer/code-converter-alist
336 (function tm-mh-e/code-convert-region-to-emacs))
344 (run-hooks 'tm-mh-e-load-hook)