2 ;;; A MIME extender for mh-e
4 ;;; by Morioka Tomohiko, 1993/11/21
14 (if (not (boundp 'mh-e-version))
23 (defconst tm-mh-e/RCS-ID
24 "$Id: tm-mh-e.el,v 6.27 1995/09/20 12:34:39 morioka Exp $")
26 (defconst tm-mh-e/version (get-version-string tm-mh-e/RCS-ID))
32 (defvar tm-mh-e/decode-all t
33 "*If t, decode all of the message. Otherwise decode header only.")
39 (defun tm-mh-e/display-msg (msg-num folder &optional show-buffer mode)
41 (setq mode tm-mh-e/decode-all)
43 ;; Display message NUMBER of FOLDER.
44 ;; Sets the current buffer to the show buffer.
47 (setq show-buffer mh-show-buffer))
48 ;; Bind variables in folder buffer in case they are local
49 (let ((msg-filename (mh-msg-filename msg-num)))
50 (if (not (file-exists-p msg-filename))
51 (error "Message %d does not exist" msg-num))
52 (set-buffer show-buffer)
53 (cond ((not (equal msg-filename buffer-file-name))
54 ;; Buffer does not yet contain message.
55 (clear-visited-file-modtime)
57 (setq buffer-file-name nil) ; no locking during setup
58 (setq buffer-read-only nil)
62 (let ((file-coding-system-for-read
63 (if (boundp 'MULE) *noconv*))
65 (insert-file-contents msg-filename)
66 ;; (goto-char (point-min))
67 (while (re-search-forward "\r$" nil t)
71 (set-buffer-modified-p nil)
72 (setq buffer-read-only t)
75 (goto-char (point-min))
77 (let ((clean-message-header mh-clean-message-header)
78 (invisible-headers mh-invisible-headers)
79 (visible-headers mh-visible-headers)
81 (insert-file-contents msg-filename)
82 (goto-char (point-min))
83 (cond (clean-message-header
84 (mh-clean-msg-header (point-min)
87 (goto-char (point-min)))
89 (mh-start-of-uncleaned-message)))
90 (mime/decode-message-header)
91 (set-buffer-modified-p nil)
92 (setq buffer-read-only t)
95 (or (eq buffer-undo-list t) ;don't save undo info for prev msgs
96 (setq buffer-undo-list nil))
97 (setq buffer-file-name msg-filename)
99 (setq mode-line-buffer-identification
100 (list (format mh-show-buffer-mode-line-buffer-id
103 (setq mh-showing-with-headers nil)))))
105 (fset 'mh-display-msg (symbol-function 'tm-mh-e/display-msg))
107 (defun tm-mh-e/view-message (&optional msg)
108 "MIME decode and play this message."
110 (mh-invalidate-show-buffer)
111 (let ((tm-mh-e/decode-all t))
114 (pop-to-buffer (save-window-excursion
115 (switch-to-buffer mh-show-buffer)
116 mime::article/preview-buffer))
119 (defun tm-mh-e/toggle-decoding-mode (arg)
120 "Toggle MIME processing mode.
121 With arg, turn MIME processing on if arg is positive."
123 (setq tm-mh-e/decode-all
125 (not tm-mh-e/decode-all)
127 (save-window-excursion
128 (switch-to-buffer mh-show-buffer)
129 (if (null tm-mh-e/decode-all)
130 (if (and mime::article/preview-buffer
131 (get-buffer mime::article/preview-buffer))
132 (kill-buffer mime::article/preview-buffer)
134 (mh-show (mh-get-msg-num t))
135 (if tm-mh-e/decode-all
136 (let ((the-buf (current-buffer)))
137 (if mime::article/preview-buffer
138 (pop-to-buffer (save-excursion
139 (switch-to-buffer mh-show-buffer)
140 mime::article/preview-buffer))
141 (tm-mh-e/view-message (mh-get-msg-num t)))
142 (pop-to-buffer the-buf)
145 (defun tm-mh-e/page-msg ()
147 (if tm-mh-e/decode-all
148 (scroll-other-window)
152 (defun tm-mh-e/previous-page ()
154 (if tm-mh-e/decode-all
155 (scroll-other-window (- (save-window-excursion
161 (defun tm-mh-e/cite ()
163 (if tm-mh-e/decode-all
167 (save-window-excursion
168 (switch-to-buffer (concat "show-" mh-sent-from-folder))
169 mime::article/preview-buffer))
170 (if (looking-at "^\\[.+\\(\n[ \t].+\\)*\\]\n")
172 (narrow-to-region (point)(point-max))
173 (mh-insert-prefix-string mh-ins-buf-prefix)
178 (defun tm-mh-e/toggle-showing ()
179 "Toggle the scanning mode/showing mode of displaying messages."
182 (if tm-mh-e/decode-all
184 (save-window-excursion
185 (set-buffer mh-show-buffer)
186 mime::article/preview-buffer)))
187 (if (get-buffer pbuf)
188 (delete-windows-on pbuf)
190 (setq mh-showing nil)
191 (set-buffer-modified-p (buffer-modified-p)) ;force mode line update
192 (if mh-recenter-summary-p
204 (fset 'tm-mh-e/code-convert-region-to-emacs
205 (symbol-function 'mime/code-convert-region-to-emacs))
207 (defun tm-mh-e/content-header-filter ()
208 (mime-viewer/x-face-function)
209 (goto-char (point-min))
210 (while (and (re-search-forward
211 (concat "^" mime-viewer/ignored-field-regexp ":")
218 (re-search-forward "^\\([^ \t]\\|$\\)" nil t)
222 (tm-mh-e/code-convert-region-to-emacs (point-min)(point-max)
223 mime/default-coding-system)
224 (mime/decode-message-header)
225 (if (featurep 'hilit19)
226 (hilit-rehighlight-buffer-quietly)
230 (defun tm-mh-e/quitting-method ()
231 (let ((win (get-buffer-window
232 mime/output-buffer-name))
233 (buf mime::preview/article-buffer)
239 (let ((name (buffer-name buf)))
242 (if (not tm-mh-e/decode-all)
243 (mh-show (mh-get-msg-num t))
250 (defun tm-mh-e::make-message (folder number)
251 (vector folder number)
254 (defun tm-mh-e::message/folder (message)
258 (defun tm-mh-e::message/number (message)
262 (defun tm-mh-e::message/file-name (message)
264 (tm-mh-e::message/number message)
265 (mh-expand-file-name (tm-mh-e::message/folder message))
268 (defun tm-mh-e::prompt-for-message (prompt folder &optional default)
270 (directory-files (mh-expand-file-name folder) nil "^[0-9]+$")
272 (completing-read prompt
283 (defun tm-mh-e::query-message ()
284 (let* ((folder (mh-prompt-for-folder "Visit" "+inbox" nil))
285 (number (tm-mh-e::prompt-for-message "Number?" folder))
287 (tm-mh-e::make-message folder number)
290 (defun tm-mh-e::insert-message (&optional message)
292 (setq message (tm-mh-e::query-message))
294 (insert-file (tm-mh-e::message/file-name message))
302 'tm-comp/message-inserter-alist
303 'mh-letter-mode (function tm-mh-e::insert-message))
310 ;;(add-hook 'mh-show-mode-hook (function mime/viewer-mode))
312 (define-key mh-folder-mode-map "v" (function tm-mh-e/view-message))
313 (define-key mh-folder-mode-map "\et" (function tm-mh-e/toggle-decoding-mode))
314 (define-key mh-folder-mode-map "t" (function tm-mh-e/toggle-showing))
315 (define-key mh-folder-mode-map "\r"
318 (scroll-other-window 1)
320 (define-key mh-folder-mode-map "\e\r"
323 (scroll-other-window -1)
325 (define-key mh-folder-mode-map " " (function tm-mh-e/page-msg))
326 (define-key mh-folder-mode-map "\177" (function tm-mh-e/previous-page))
328 (add-hook 'mh-letter-mode-hook
331 (define-key mh-letter-mode-map "\C-c\C-y" (function tm-mh-e/cite))
334 (defun tm-mh-e/summary-before-quit ()
335 (let ((buf (get-buffer mh-show-buffer)))
337 (let ((the-buf (current-buffer)))
338 (switch-to-buffer buf)
339 (if (and mime::article/preview-buffer
340 (setq buf (get-buffer mime::article/preview-buffer))
343 (switch-to-buffer the-buf)
346 (switch-to-buffer the-buf)
350 (add-hook 'mh-before-quit-hook (function tm-mh-e/summary-before-quit))
352 (set-alist 'mime-viewer/quitting-method-alist
354 (function tm-mh-e/quitting-method))
356 (set-alist 'mime-viewer/content-header-filter-alist
358 (function tm-mh-e/content-header-filter))
360 (set-alist 'mime-viewer/code-converter-alist
362 (function tm-mh-e/code-convert-region-to-emacs))
370 (run-hooks 'tm-mh-e-load-hook)