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))
23 (defconst tm-mh-e/RCS-ID
24 "$Id: tm-mh-e.el,v 6.10 1995/06/12 01:53:19 morioka Exp $")
26 (defconst tm-mh-e/version (get-version-string tm-mh-e/RCS-ID))
31 (defvar tm-mh-e/decode-all t
32 "*If t, decode all of the message. Otherwise decode header only.")
38 (defun tm-mh-e/display-msg (msg-num folder &optional show-buffer mode)
40 (setq mode tm-mh-e/decode-all)
42 ;; Display message NUMBER of FOLDER.
43 ;; Sets the current buffer to the show buffer.
46 (setq show-buffer mh-show-buffer))
47 ;; Bind variables in folder buffer in case they are local
48 (let ((msg-filename (mh-msg-filename msg-num)))
49 (if (not (file-exists-p msg-filename))
50 (error "Message %d does not exist" msg-num))
51 (set-buffer show-buffer)
52 (cond ((not (equal msg-filename buffer-file-name))
53 ;; Buffer does not yet contain message.
54 (clear-visited-file-modtime)
56 (setq buffer-file-name nil) ; no locking during setup
57 (let (buffer-read-only)
61 (let ((file-coding-system-for-read
62 (if (boundp 'MULE) *noconv*))
64 (insert-file-contents msg-filename)
66 (set-buffer-modified-p nil)
69 (goto-char (point-min))
71 (let ((clean-message-header mh-clean-message-header)
72 (invisible-headers mh-invisible-headers)
73 (visible-headers mh-visible-headers)
75 (insert-file-contents msg-filename)
76 (goto-char (point-min))
77 (cond (clean-message-header
78 (mh-clean-msg-header (point-min)
81 (goto-char (point-min)))
83 (mh-start-of-uncleaned-message)))
84 (mime/decode-message-header)
85 (set-buffer-modified-p nil)
88 (or (eq buffer-undo-list t) ;don't save undo info for prev msgs
89 (setq buffer-undo-list nil))
90 (setq buffer-file-name msg-filename)
92 (setq mode-line-buffer-identification
93 (list (format mh-show-buffer-mode-line-buffer-id
96 (setq mh-showing-with-headers nil)))))
98 (fset 'mh-display-msg (symbol-function 'tm-mh-e/display-msg))
100 (defun tm-mh-e/view-message (&optional msg)
101 "MIME decode and play this message."
103 (mh-invalidate-show-buffer)
104 (let ((tm-mh-e/decode-all t))
107 (pop-to-buffer (save-window-excursion
108 (switch-to-buffer mh-show-buffer)
109 mime::article/preview-buffer))
112 (defun tm-mh-e/toggle-decoding-mode (arg)
113 "Toggle MIME processing mode.
114 With arg, turn MIME processing on if arg is positive."
116 (setq tm-mh-e/decode-all
118 (not tm-mh-e/decode-all)
120 (mh-show (mh-get-msg-num t))
121 (if tm-mh-e/decode-all
122 (let ((the-buf (current-buffer)))
123 (pop-to-buffer (save-excursion
124 (switch-to-buffer mh-show-buffer)
125 mime::article/preview-buffer))
126 (pop-to-buffer the-buf)
129 (defun tm-mh-e/cite ()
131 (if tm-mh-e/decode-all
135 (save-window-excursion
136 (switch-to-buffer (concat "show-" mh-sent-from-folder))
137 mime::article/preview-buffer))
138 (if (looking-at "^\\[.+\\]\n")
140 (run-hooks 'mail-citation-hook)
149 (defun tm-mh-e/content-header-filter ()
150 (goto-char (point-min))
151 (while (and (re-search-forward
152 (concat "^" mime-viewer/ignored-field-regexp ":")
159 (re-search-forward "^\\([^ \t]\\|$\\)" nil t)
163 (mime/code-convert-region-to-emacs (point-min)(point-max)
164 mime/default-coding-system)
165 (mime/decode-message-header)
168 (defun tm-mh-e/quitting-method ()
169 (let ((win (get-buffer-window
170 mime/output-buffer-name))
171 (buf mime::preview/article-buffer)
177 (let ((name (buffer-name buf)))
180 (if (not tm-mh-e/decode-all)
181 (mh-show (mh-get-msg-num t))
187 (defun tm-mh-e::make-message (folder number)
188 (vector folder number)
191 (defun tm-mh-e::message/folder (message)
195 (defun tm-mh-e::message/number (message)
199 (defun tm-mh-e::message/file-name (message)
201 (tm-mh-e::message/number message)
202 (mh-expand-file-name (tm-mh-e::message/folder message))
205 (defun tm-mh-e::prompt-for-message (prompt folder &optional default)
207 (directory-files (mh-expand-file-name folder) nil "^[0-9]+$")
209 (completing-read prompt
220 (defun tm-mh-e::query-message ()
221 (let* ((folder (mh-prompt-for-folder "Visit" "+inbox" nil))
222 (number (tm-mh-e::prompt-for-message "Number?" folder))
224 (tm-mh-e::make-message folder number)
227 (defun tm-mh-e::insert-message (&optional message)
229 (setq message (tm-mh-e::query-message))
231 (insert-file (tm-mh-e::message/file-name message))
239 'tm-comp/message-inserter-alist
240 'mh-letter-mode (function tm-mh-e::insert-message))
247 ;;(add-hook 'mh-show-mode-hook (function mime/viewer-mode))
249 (define-key mh-folder-mode-map "v" (function tm-mh-e/view-message))
250 (define-key mh-folder-mode-map "\et" (function tm-mh-e/toggle-decoding-mode))
251 (define-key mh-folder-mode-map "\r"
254 (scroll-other-window 1)
256 (define-key mh-folder-mode-map "\e\r"
259 (scroll-other-window -1)
261 (define-key mh-folder-mode-map " "
264 (scroll-other-window)
266 (define-key mh-folder-mode-map "\177"
269 (scroll-other-window (- (save-window-excursion
274 (add-hook 'mh-letter-mode-hook
277 (define-key mh-letter-mode-map "\C-c\C-y" (function tm-mh-e/cite))
280 (set-alist 'mime-viewer/quitting-method-alist
282 (function tm-mh-e/quitting-method))
284 (set-alist 'mime-viewer/content-header-filter-alist
286 (function tm-mh-e/content-header-filter))
288 (run-hooks 'tm-mh-e-load-hook)