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.1 1995/10/07 08:26:47 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 (defun tm-mh-e/display-msg (msg-num folder &optional show-buffer mode)
46 (setq mode tm-mh-e/decode-all)
48 ;; Display message NUMBER of FOLDER.
49 ;; Sets the current buffer to the show buffer.
52 (setq show-buffer mh-show-buffer))
53 ;; Bind variables in folder buffer in case they are local
54 (let ((msg-filename (mh-msg-filename msg-num)))
55 (if (not (file-exists-p msg-filename))
56 (error "Message %d does not exist" msg-num))
57 (set-buffer show-buffer)
58 (cond ((not (equal msg-filename buffer-file-name))
59 ;; Buffer does not yet contain message.
60 (clear-visited-file-modtime)
62 (setq buffer-file-name nil) ; no locking during setup
63 (setq buffer-read-only nil)
67 (let ((file-coding-system-for-read
68 (if (boundp 'MULE) *noconv*))
70 (insert-file-contents msg-filename)
71 ;; (goto-char (point-min))
72 (while (re-search-forward "\r$" nil t)
76 (set-buffer-modified-p nil)
77 (setq buffer-read-only t)
80 (goto-char (point-min))
82 (let ((clean-message-header mh-clean-message-header)
83 (invisible-headers mh-invisible-headers)
84 (visible-headers mh-visible-headers)
87 ;; modified by ARIURA <ariura@cc.tuat.ac.jp>
90 (mh-exec-lib-cmd-output "mhl" "-nobell" "-noclear"
91 (if (stringp mhl-formfile)
92 (list "-form" mhl-formfile))
94 (insert-file-contents msg-filename))
96 (goto-char (point-min))
97 (cond (clean-message-header
98 (mh-clean-msg-header (point-min)
101 (goto-char (point-min)))
103 (mh-start-of-uncleaned-message)))
104 (mime/decode-message-header)
105 (set-buffer-modified-p nil)
106 (setq buffer-read-only t)
109 (or (eq buffer-undo-list t) ;don't save undo info for prev msgs
110 (setq buffer-undo-list nil))
111 (setq buffer-file-name msg-filename)
113 (setq mode-line-buffer-identification
114 (list (format mh-show-buffer-mode-line-buffer-id
117 (setq mh-showing-with-headers nil)))))
119 (fset 'mh-display-msg (symbol-function 'tm-mh-e/display-msg))
121 (defun tm-mh-e/view-message (&optional msg)
122 "MIME decode and play this message."
124 (mh-invalidate-show-buffer)
125 (let ((tm-mh-e/decode-all t))
128 (pop-to-buffer (save-window-excursion
129 (switch-to-buffer mh-show-buffer)
130 mime::article/preview-buffer))
133 (defun tm-mh-e/toggle-decoding-mode (arg)
134 "Toggle MIME processing mode.
135 With arg, turn MIME processing on if arg is positive."
137 (setq tm-mh-e/decode-all
139 (not tm-mh-e/decode-all)
141 (save-window-excursion
142 (switch-to-buffer mh-show-buffer)
143 (if (null tm-mh-e/decode-all)
144 (if (and mime::article/preview-buffer
145 (get-buffer mime::article/preview-buffer))
146 (kill-buffer mime::article/preview-buffer)
148 (mh-show (mh-get-msg-num t))
149 (if tm-mh-e/decode-all
150 (let ((the-buf (current-buffer)))
151 (if mime::article/preview-buffer
152 (pop-to-buffer (save-excursion
153 (switch-to-buffer mh-show-buffer)
154 mime::article/preview-buffer))
155 (tm-mh-e/view-message (mh-get-msg-num t)))
156 (pop-to-buffer the-buf)
159 (defun tm-mh-e/page-msg ()
161 (if tm-mh-e/decode-all
162 (scroll-other-window)
166 (defun tm-mh-e/previous-page ()
168 (if tm-mh-e/decode-all
169 (scroll-other-window (- (save-window-excursion
175 (defun tm-mh-e/cite ()
177 (if tm-mh-e/decode-all
179 (if mh-delete-yanked-msg-window
181 (set-buffer mh-sent-from-folder)
182 (set-buffer mh-show-buffer)
183 (delete-windows-on mime::article/preview-buffer)
190 ;; modified by Eric Ding <ericding@San-Jose.ate.slb.com>
192 (set-buffer mh-sent-from-folder)
193 (set-buffer mh-show-buffer)
194 (or mime::article/preview-buffer (current-buffer))
197 (if (looking-at "^\\[.+\\(\n[ \t].+\\)*\\]\n")
199 (narrow-to-region (point)(point-max))
200 (mh-insert-prefix-string mh-ins-buf-prefix)
205 (defun tm-mh-e/toggle-showing ()
206 "Toggle the scanning mode/showing mode of displaying messages."
209 (if tm-mh-e/decode-all
211 (save-window-excursion
212 (set-buffer mh-show-buffer)
213 mime::article/preview-buffer)))
214 (if (get-buffer pbuf)
215 (delete-windows-on pbuf)
217 (setq mh-showing nil)
218 (set-buffer-modified-p (buffer-modified-p)) ;force mode line update
219 (if mh-recenter-summary-p
231 (fset 'tm-mh-e/code-convert-region-to-emacs
232 (symbol-function 'mime/code-convert-region-to-emacs))
234 (defun tm-mh-e/content-header-filter ()
235 (goto-char (point-min))
236 (while (and (re-search-forward mime-viewer/ignored-field-regexp nil t)
242 (re-search-forward "^\\([^ \t]\\|$\\)" nil t)
246 (tm-mh-e/code-convert-region-to-emacs (point-min)(point-max)
247 mime/default-coding-system)
248 (mime/decode-message-header)
249 (if (featurep 'hilit19)
250 (hilit-rehighlight-buffer-quietly)
254 (defun tm-mh-e/quitting-method ()
255 (let ((win (get-buffer-window
256 mime/output-buffer-name))
257 (buf mime::preview/article-buffer)
263 (let ((name (buffer-name buf)))
266 (if (not tm-mh-e/decode-all)
267 (mh-show (mh-get-msg-num t))
274 (defun tm-mh-e::make-message (folder number)
275 (vector folder number)
278 (defun tm-mh-e::message/folder (message)
282 (defun tm-mh-e::message/number (message)
286 (defun tm-mh-e::message/file-name (message)
288 (tm-mh-e::message/number message)
289 (mh-expand-file-name (tm-mh-e::message/folder message))
292 (defun tm-mh-e::prompt-for-message (prompt folder &optional default)
294 (directory-files (mh-expand-file-name folder) nil "^[0-9]+$")
296 (completing-read prompt
307 (defun tm-mh-e::query-message ()
308 (let* ((folder (mh-prompt-for-folder "Visit" "+inbox" nil))
309 (number (tm-mh-e::prompt-for-message "Number?" folder))
311 (tm-mh-e::make-message folder number)
314 (defun tm-mh-e::insert-message (&optional message)
316 (setq message (tm-mh-e::query-message))
318 (insert-file (tm-mh-e::message/file-name message))
326 'tm-comp/message-inserter-alist
327 'mh-letter-mode (function tm-mh-e::insert-message))
334 ;;(add-hook 'mh-show-mode-hook (function mime/viewer-mode))
336 (define-key mh-folder-mode-map "v" (function tm-mh-e/view-message))
337 (define-key mh-folder-mode-map "\et" (function tm-mh-e/toggle-decoding-mode))
338 (define-key mh-folder-mode-map "t" (function tm-mh-e/toggle-showing))
339 (define-key mh-folder-mode-map "\r"
342 (scroll-other-window 1)
344 (define-key mh-folder-mode-map "\e\r"
347 (scroll-other-window -1)
349 (define-key mh-folder-mode-map " " (function tm-mh-e/page-msg))
350 (define-key mh-folder-mode-map "\177" (function tm-mh-e/previous-page))
352 (add-hook 'mh-letter-mode-hook
355 (define-key mh-letter-mode-map "\C-c\C-y" (function tm-mh-e/cite))
358 (defun tm-mh-e/summary-before-quit ()
359 (let ((buf (get-buffer mh-show-buffer)))
361 (let ((the-buf (current-buffer)))
362 (switch-to-buffer buf)
363 (if (and mime::article/preview-buffer
364 (setq buf (get-buffer mime::article/preview-buffer))
367 (switch-to-buffer the-buf)
370 (switch-to-buffer the-buf)
374 (add-hook 'mh-before-quit-hook (function tm-mh-e/summary-before-quit))
376 (set-alist 'mime-viewer/quitting-method-alist
378 (function tm-mh-e/quitting-method))
380 (set-alist 'mime-viewer/content-header-filter-alist
382 (function tm-mh-e/content-header-filter))
384 (set-alist 'mime-viewer/code-converter-alist
386 (function tm-mh-e/code-convert-region-to-emacs))
394 (run-hooks 'tm-mh-e-load-hook)