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.17 1995/11/14 06:29:27 morioka Exp $")
31 (defconst tm-mh-e/version (get-version-string tm-mh-e/RCS-ID))
37 (defvar tm-mh-e/automatic-mime-preview t
38 "If non-nil, show MIME processed message.")
40 (defvar tm-mh-e/decode-encoded-word t
41 "If non-nil, decode encoded-word when it is not MIME preview mode.")
47 (if (not (fboundp 'tm-mh-e/original-mh-display-msg))
48 (fset 'tm-mh-e/original-mh-display-msg
49 (symbol-function 'mh-display-msg))
52 (defun mh-display-msg (msg-num folder &optional show-buffer mode)
54 (setq mode tm-mh-e/automatic-mime-preview)
56 ;; Display message NUMBER of FOLDER.
57 ;; Sets the current buffer to the show buffer.
60 (setq show-buffer mh-show-buffer))
61 ;; Bind variables in folder buffer in case they are local
62 (let ((msg-filename (mh-msg-filename msg-num)))
63 (if (not (file-exists-p msg-filename))
64 (error "Message %d does not exist" msg-num))
65 (set-buffer show-buffer)
66 (cond ((not (equal msg-filename buffer-file-name))
67 ;; Buffer does not yet contain message.
68 (clear-visited-file-modtime)
70 (setq buffer-file-name nil) ; no locking during setup
71 (setq buffer-read-only nil)
74 (let* ((aname (concat "article-" folder))
75 (abuf (get-buffer aname))
80 (setq buffer-read-only nil)
83 (setq abuf (get-buffer-create aname))
86 (let ((file-coding-system-for-read
87 (if (boundp 'MULE) *noconv*))
89 (insert-file-contents msg-filename)
90 ;; (goto-char (point-min))
91 (while (re-search-forward "\r$" nil t)
95 (set-buffer-modified-p nil)
96 (setq buffer-read-only t)
98 (mime/viewer-mode nil nil nil
99 aname (concat "show-" folder))
100 (goto-char (point-min))
102 (let ((clean-message-header mh-clean-message-header)
103 (invisible-headers mh-invisible-headers)
104 (visible-headers mh-visible-headers)
107 ;; modified by ARIURA <ariura@cc.tuat.ac.jp>
110 (mh-exec-lib-cmd-output "mhl" "-nobell" "-noclear"
111 (if (stringp mhl-formfile)
112 (list "-form" mhl-formfile))
114 (insert-file-contents msg-filename))
116 (goto-char (point-min))
117 (cond (clean-message-header
118 (mh-clean-msg-header (point-min)
121 (goto-char (point-min)))
123 (mh-start-of-uncleaned-message)))
124 (if tm-mh-e/decode-encoded-word
125 (mime/decode-message-header)
127 (set-buffer-modified-p nil)
128 (setq buffer-read-only t)
131 (or (eq buffer-undo-list t) ;don't save undo info for prev msgs
132 (setq buffer-undo-list nil))
133 (setq buffer-file-name msg-filename)
135 (setq mode-line-buffer-identification
136 (list (format mh-show-buffer-mode-line-buffer-id
139 (setq mh-showing-with-headers nil)))))
141 (defun tm-mh-e/view-message (&optional msg)
142 "MIME decode and play this message."
144 (if (or (null tm-mh-e/automatic-mime-preview)
145 (null (get-buffer mh-show-buffer))
147 (set-buffer mh-show-buffer)
148 (not (eq major-mode 'mime/viewer-mode))
150 (let ((tm-mh-e/automatic-mime-preview t))
151 (mh-invalidate-show-buffer)
154 (pop-to-buffer mh-show-buffer)
157 (defun tm-mh-e/toggle-decoding-mode (arg)
158 "Toggle MIME processing mode.
159 With arg, turn MIME processing on if arg is positive."
161 (setq tm-mh-e/automatic-mime-preview
163 (not tm-mh-e/automatic-mime-preview)
166 (set-buffer mh-show-buffer)
167 (if (null tm-mh-e/automatic-mime-preview)
168 (if (and mime::preview/article-buffer
169 (get-buffer mime::preview/article-buffer))
170 (kill-buffer mime::preview/article-buffer)
172 (mh-invalidate-show-buffer)
173 (mh-show (mh-get-msg-num t))
176 (defun tm-mh-e/show (&optional message)
178 (mh-invalidate-show-buffer)
182 (defun tm-mh-e/header-display ()
184 (mh-invalidate-show-buffer)
185 (let (mime-viewer/ignored-field-list
186 tm-mh-e/decode-encoded-word)
190 (defun tm-mh-e/raw-display ()
192 (mh-invalidate-show-buffer)
193 (let (tm-mh-e/automatic-mime-preview
194 tm-mh-e/decode-encoded-word)
202 (fset 'tm-mh-e/code-convert-region-to-emacs
203 (symbol-function 'mime/code-convert-region-to-emacs))
205 (defun tm-mh-e/content-header-filter ()
206 (goto-char (point-min))
207 (while (and (re-search-forward mime-viewer/ignored-field-regexp nil t)
213 (re-search-forward "^\\([^ \t]\\|$\\)" nil t)
217 (tm-mh-e/code-convert-region-to-emacs (point-min)(point-max)
218 mime/default-coding-system)
219 (mime/decode-message-header)
220 (if (featurep 'hilit19)
221 (hilit-rehighlight-buffer-quietly)
225 (defun tm-mh-e/quitting-method ()
226 (let ((win (get-buffer-window
227 mime/output-buffer-name))
228 (buf (current-buffer))
234 (let ((name (buffer-name buf)))
237 (if (not tm-mh-e/automatic-mime-preview)
238 (mh-invalidate-show-buffer)
240 (mh-show (mh-get-msg-num t))
251 (set-atype 'mime/content-decoding-condition
252 '((type . "message/partial")
253 (method . mime-article/grab-message/partials)
254 (major-mode . mh-show-mode)
256 . (and (or (string-match "^article-\\(.+\\)$" article-buffer)
257 (string-match "^show-\\(.+\\)$" article-buffer))
258 (substring article-buffer
259 (match-beginning 1) (match-end 1))
262 (set-alist 'tm-partial/preview-article-method-alist
266 (let ((tm-mh-e/automatic-mime-preview t))
275 (defun tm-mh-e::make-message (folder number)
276 (vector folder number)
279 (defun tm-mh-e::message/folder (message)
283 (defun tm-mh-e::message/number (message)
287 (defun tm-mh-e::message/file-name (message)
289 (tm-mh-e::message/number message)
290 (mh-expand-file-name (tm-mh-e::message/folder message))
293 (defun tm-mh-e/prompt-for-message (prompt folder &optional default)
295 (directory-files (mh-expand-file-name folder) nil "^[0-9]+$")
297 (default (and (boundp 'mh-sent-from-msg) mh-sent-from-msg))
301 (int-to-string default)
304 (completing-read prompt
315 (defun tm-mh-e/query-message ()
316 (let* ((folder (mh-prompt-for-folder "Visit" "+inbox" nil))
317 (number (tm-mh-e/prompt-for-message "Number: " folder))
319 (tm-mh-e::make-message folder number)
322 (defun tm-mh-e/insert-message (&optional message)
324 (setq message (tm-mh-e/query-message))
326 (insert-file (tm-mh-e::message/file-name message))
327 (mime-editor/inserted-message-filter)
335 'mime-editor/message-inserter-alist
336 'mh-letter-mode (function tm-mh-e/insert-message))
338 'mime-editor/mail-inserter-alist
339 'mh-letter-mode (function tm-mh-e/insert-message))
341 'mime-editor/mail-inserter-alist
342 'news-reply-mode (function tm-mh-e/insert-message))
349 (define-key mh-folder-mode-map "v" (function tm-mh-e/view-message))
350 (define-key mh-folder-mode-map "\et" (function tm-mh-e/toggle-decoding-mode))
351 (define-key mh-folder-mode-map "." (function tm-mh-e/show))
352 (define-key mh-folder-mode-map "," (function tm-mh-e/header-display))
353 (define-key mh-folder-mode-map "\e," (function tm-mh-e/raw-display))
354 (define-key mh-folder-mode-map "\r"
357 (scroll-other-window 1)
359 (define-key mh-folder-mode-map "\e\r"
362 (scroll-other-window -1)
365 (defun tm-mh-e/summary-before-quit ()
366 (let ((buf (get-buffer mh-show-buffer)))
368 (let ((the-buf (current-buffer)))
369 (switch-to-buffer buf)
370 (if (and mime::article/preview-buffer
371 (setq buf (get-buffer mime::article/preview-buffer))
374 (switch-to-buffer the-buf)
377 (switch-to-buffer the-buf)
381 (add-hook 'mh-before-quit-hook (function tm-mh-e/summary-before-quit))
383 (set-alist 'mime-viewer/quitting-method-alist
385 (function tm-mh-e/quitting-method))
387 (set-alist 'mime-viewer/content-header-filter-alist
389 (function tm-mh-e/content-header-filter))
391 (set-alist 'mime-viewer/code-converter-alist
393 (function tm-mh-e/code-convert-region-to-emacs))
401 (run-hooks 'tm-mh-e-load-hook)