2 ;;; A MIME viewer for GNU Emacs
4 ;;; by Morioka Tomohiko, 1994/07/13
23 (defconst mime-viewer/RCS-ID
24 "$Id: tm-view.el,v 6.14 1995/04/12 11:52:34 morioka Exp morioka $")
26 (defconst mime-viewer/version (get-version-string mime-viewer/RCS-ID))
27 (defconst mime/viewer-version mime-viewer/version)
33 (defconst mime/tspecials "\000-\040()<>@,;:\\\"/[\093?.=")
34 (defconst mime/token-regexp
35 (concat "[^" mime/tspecials "]*"))
36 (defconst mime/content-type-subtype-regexp
37 (concat mime/token-regexp "/" mime/token-regexp))
38 (defconst mime/content-parameter-value-regexp
40 message/quoted-string-regexp
43 (defconst mime/output-buffer-name "*MIME-out*")
44 (defconst mime/decoding-buffer-name "*MIME-decoding*")
50 (defvar mime/content-decoding-condition
51 ;;(setq mime/content-decoding-condition
52 '(((type . "text/plain")
53 (method "tm-plain" nil 'file 'type 'encoding 'mode 'name))
54 ;;((type . "text/x-latex")
55 ;; (method "tm-latex" nil 'file 'type 'encoding 'mode 'name))
56 ((type . "audio/basic")
57 (method "tm-au" nil 'file 'type 'encoding 'mode 'name))
59 (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
60 ((type . "image/jpeg")
61 (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
62 ((type . "image/tiff")
63 (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
64 ((type . "image/x-tiff")
65 (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
66 ((type . "image/x-xbm")
67 (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
68 ((type . "image/x-pic")
69 (method "tm-image" nil 'file 'type 'encoding 'mode 'name))
70 ((type . "video/mpeg")
71 (method "tm-mpeg" nil 'file 'type 'encoding 'mode 'name))
72 ((type . "application/octet-stream")
73 (method "tm-file" nil 'file 'type 'encoding 'mode 'name))
74 ;;((type . "message/external-body")
75 ;; (method "xterm" nil
76 ;; "-e" "showexternal"
77 ;; 'file '"access-type" '"name" '"site" '"directory"))
78 ((type . "message/partial")
79 (method . mime/decode-message/partial-region))
81 "-m" "tm" "-x" "-d" "-z" "-e" 'file)(mode . "play"))
84 (defvar mime-viewer/content-filter-alist
85 '(("text/plain" . mime-viewer/filter-text/plain)))
87 (defvar mime-viewer/content-subject-function
89 (lambda (cnum subj ctype params)
91 (format "[%s %s (%s)]\n"
95 (format "%s" (+ num 1))
102 (defvar mime-viewer/content-header-filter-function
103 (function mime-viewer/default-content-header-filter-function))
105 (defvar mime-viewer/childrens-header-showing-Content-Type-list
108 (defvar mime-viewer/ignored-field-list
111 (defun mime-viewer/default-content-header-filter-function (cnum cinfo)
112 (if (and (listp cnum)
114 (mime::content-info/type
115 (mime::article/get-content-region (butlast cnum) cinfo)
117 mime-viewer/childrens-header-showing-Content-Type-list)
119 (delete-region (goto-char (point-min))
120 (or (and (re-search-forward "^$" nil t)
126 (narrow-to-region (goto-char (point-min))
127 (or (and (re-search-forward "^$" nil t)
133 (goto-char (point-min))
134 (while (and (re-search-forward
135 (concat "^" (regexp-quote field) ":")
142 (concat message/field-body-regexp "\n")
148 )) mime-viewer/ignored-field-list)
151 (defvar mime-viewer/default-showing-Content-Type-list
152 '("text/plain" "text/richtext" "text/enriched"
153 "text/x-latex" "application/x-latex"
154 "application/octet-stream" nil))
156 (defvar mime-viewer/quitting-method-alist
159 (mime-viewer/kill-buffer)
160 (delete-other-windows)
161 (gnus-article-show-summary)
165 (mime-viewer/kill-buffer)
167 (delete-other-windows)
171 (let ((win (get-buffer-window
172 mime/output-buffer-name))
174 (mime::preview-content-info/buffer
175 (car mime::preview/content-list)))
180 (mime-viewer/kill-buffer)
182 (let ((name (buffer-name buf)))
183 (string-match "show-" name)
184 (substring name (match-end 0))
186 ;; patch for mh-narrow.el
187 ;; by YAMAOKA Katsumi <yamaoka@ga.sony.co.jp>
188 (if (and (featurep 'mh-narrow)
189 (fboundp 'mh-narrow-to-page))
191 (set-buffer mh-show-buffer)
192 (mh-narrow-to-page)))
195 (mime/show-message-mode
197 (set-window-configuration
198 mime/show-mode-old-window-configuration)
199 (let ((mother mime/mother-buffer))
201 (mime::preview-content-info/buffer
202 (car mime::preview/content-list)))
203 (mime-viewer/kill-buffer)
204 (pop-to-buffer mother)
205 (goto-char (point-min))
206 (mime-viewer/up-content)
210 (defvar mime-viewer/decoding-mode "play" "MIME body decoding mode")
219 (defun mime::make-content-info (beg end ctype params encoding children)
220 (vector beg end ctype params encoding children)
223 (defun mime::content-info/point-min (cinfo)
227 (defun mime::content-info/point-max (cinfo)
231 (defun mime::content-info/type (cinfo)
235 (defun mime::content-info/parameters (cinfo)
239 (defun mime::content-info/encoding (cinfo)
243 (defun mime::content-info/children (cinfo)
247 ;;; @@ preview-content-info
250 (defun mime::make-preview-content-info (beg end buf cinfo)
251 (vector beg end buf cinfo)
254 (defun mime::preview-content-info/point-min (pcinfo)
258 (defun mime::preview-content-info/point-max (pcinfo)
262 (defun mime::preview-content-info/buffer (pcinfo)
266 (defun mime::preview-content-info/content-info (pcinfo)
271 ;;; @ buffer local variables
274 (defvar mime::article/content-info)
275 (defvar mime::article/preview-buffer)
277 (defvar mime::preview/content-list nil)
278 (defvar mime::preview/original-major-mode nil)
284 (defun mime-viewer/parse-message (&optional ctl encoding)
285 (make-variable-buffer-local 'mime::article/content-info)
286 (setq mime::article/content-info (mime-viewer/parse ctl encoding))
287 (let ((ret (mime-viewer/make-preview-buffer)))
288 (make-variable-buffer-local 'mime::article/preview-buffer)
289 (setq mime::article/preview-buffer (car ret))
292 (defun mime-viewer/parse (&optional ctl encoding)
297 (goto-char (point-min))
302 (setq encoding (progn
303 (goto-char (point-min))
304 (mime/Content-Transfer-Encoding)
307 (let ((ctype (car ctl))
311 (setq ctype (downcase ctype))
313 (if (stringp encoding)
314 (setq encoding (downcase encoding))
316 (let ((boundary (assoc "boundary" params)))
317 (search-forward "\n\n" nil t)
320 (message/strip-quoted-string (cdr boundary)))
321 (mime-viewer/parse-multipart
324 (search-forward (concat "--" boundary "--\n") nil t)
327 boundary ctype params encoding)
329 ((string= ctype "message/rfc822")
330 (mime::make-content-info
331 (point-min) (point-max)
332 ctype params encoding
335 (narrow-to-region (match-end 0) (point-max))
336 (list (mime-viewer/parse))
341 (mime::make-content-info (point-min) (point-max)
342 ctype params encoding nil)
346 (defun mime-viewer/parse-multipart (beg end boundary ctype params encoding)
347 (let ((sep (concat "^--" boundary "$"))
348 cb ce ct ret ncb children)
351 (narrow-to-region beg end)
352 (goto-char (point-min))
353 (search-forward (concat "--" boundary "\n") nil t)
354 (setq cb (match-end 0))
355 (while (re-search-forward sep nil t)
356 (setq ce (match-beginning 0))
357 (setq ncb (match-end 0))
360 (narrow-to-region cb ce)
361 (setq ret (mime-viewer/parse))
363 (setq children (nconc children (list ret)))
364 (goto-char (mime::content-info/point-max ret))
365 (search-forward (concat "--" boundary "\n") nil t)
366 (goto-char (setq cb (match-end 0)))
368 (setq ce (point-max))
371 (narrow-to-region cb ce)
372 (setq ret (mime-viewer/parse))
374 (setq children (nconc children (list ret)))
376 (setq beg (point-min))
378 (mime::make-content-info beg end ctype params encoding children)
381 (defun mime/Content-Type ()
384 (if (and (re-search-forward "^Content-Type:[ \t]*" nil t)
388 (and (re-search-forward ".*\\(\n[ \t].*\\)*" nil t)
391 (goto-char (point-min))
392 (re-search-forward mime/content-type-subtype-regexp nil t)
396 (buffer-substring (match-beginning 0) (match-end 0))
398 dest attribute value)
399 (while (and (re-search-forward "[ \t\n]*;[ \t\n]*" nil t)
400 (re-search-forward mime/token-regexp nil t)
404 (buffer-substring (match-beginning 0) (match-end 0))
406 (if (and (re-search-forward "=[ \t\n]*" nil t)
407 (re-search-forward mime/content-parameter-value-regexp
412 (message/strip-quoted-string
413 (buffer-substring (match-beginning 0)
421 (defun mime/Content-Transfer-Encoding (&optional default-encoding)
424 (if (and (re-search-forward "^Content-Transfer-Encoding:[ \t]*" nil t)
425 (re-search-forward mime/token-regexp nil t)
427 (downcase (buffer-substring (match-beginning 0) (match-end 0)))
431 (defun mime/get-subject (param)
435 (or (and (setq ret (assoc "name" param))
436 (message/strip-quoted-string (cdr ret))
438 (and (setq ret (assoc "x-name" param))
439 (message/strip-quoted-string (cdr ret))
442 (narrow-to-region (point-min)
443 (or (and (search-forward "\n\n" nil t)
448 (message/get-field-body "Content-Description")
449 (message/get-field-body "Subject")
454 (defun mime/get-name (param)
455 (replace-as-filename (mime/get-subject param))
458 (defun mime-viewer/make-preview-buffer (&optional buf cinfo obuf)
459 (let ((the-buf (current-buffer)) pcl dest)
467 (switch-to-buffer buf)
468 (setq cinfo mime::article/content-info)
471 (setq obuf (concat "*Preview-" (buffer-name buf) "*"))
473 (setq pcl (mime::make-flat-content-list cinfo))
474 (if (get-buffer obuf)
481 (let ((beg (mime::content-info/point-min cell))
482 (end (mime::content-info/point-max cell))
483 (ctype (mime::content-info/type cell))
484 (params (mime::content-info/parameters cell))
485 cnum e nb ne subj str)
486 (setq cnum (mime::get-point-content-number beg cinfo))
487 (switch-to-buffer buf)
492 mime-viewer/default-showing-Content-Type-list))
496 (search-forward "\n\n" nil t)
500 (if (> e (point-max))
503 (setq str (buffer-substring beg e))
504 (switch-to-buffer obuf)
511 (narrow-to-region nb ne)
512 (mime/decode-message-header)
513 (setq subj (mime/get-subject params))
517 mime-viewer/content-filter-alist))))
518 (if (and f (fboundp f))
519 (funcall f ctype params)
521 (funcall mime-viewer/content-header-filter-function
524 (funcall mime-viewer/content-subject-function
525 cnum subj ctype params)
526 (setq ne (point-max))
527 (mime::make-preview-content-info nb (- ne 1)
533 (set-buffer-modified-p nil)
534 (setq buffer-read-only t)
535 (switch-to-buffer the-buf)
540 ;;; @ content information
543 (defun mime::get-point-content-number (p &optional cinfo)
545 (setq cinfo mime::article/content-info)
547 (let ((b (mime::content-info/point-min cinfo))
548 (e (mime::content-info/point-max cinfo))
549 (c (mime::content-info/children cinfo))
551 (if (and (<= b p)(<= p e))
552 (or (let (co ret (sn 0))
556 (setq ret (mime::get-point-content-number p co))
557 (cond ((eq ret t) (throw 'tag (list sn)))
558 (ret (throw 'tag (cons sn ret)))
565 (defun mime::article/get-content-region (cn &optional cinfo)
567 (setq cinfo mime::article/content-info)
574 (let ((rc (nth sn (mime::content-info/children cinfo))))
576 (mime::article/get-content-region (cdr cn) rc)
580 (defun mime::make-flat-content-list (&optional cinfo)
582 (setq cinfo mime::article/content-info)
584 (let ((dest (list cinfo))
585 (rcl (mime::content-info/children cinfo))
588 (setq dest (nconc dest (mime::make-flat-content-list (car rcl))))
593 (defun mime::point-preview-content (p &optional pcl)
595 (setq pcl mime::preview/content-list)
601 (if (and (<= (mime::preview-content-info/point-min cell) p)
602 (<= p (mime::preview-content-info/point-max cell))
615 (defun mime/Quoted-Printable-decode-region (beg end)
619 (narrow-to-region beg end)
620 (goto-char (point-min))
621 (while (re-search-forward "=\n" nil t)
624 (goto-char (point-min))
626 (while (re-search-forward mime/Quoted-Printable-octet-regexp nil t)
627 (setq b (match-beginning 0))
628 (setq e (match-end 0))
629 (setq str (buffer-substring b e))
631 (insert (mime/Quoted-Printable-decode-string str))
635 (defun mime/Base64-decode-region (beg end)
639 (narrow-to-region beg end)
640 (goto-char (point-min))
641 (while (search-forward "\n" nil t)
644 (let ((str (buffer-substring (point-min)(point-max))))
645 (delete-region (point-min)(point-max))
646 (insert (mime/base64-decode-string str))
649 (defun mime/make-method-args (cal format)
654 (let ((ret (cdr (assoc (eval arg) cal))))
662 (defun mime/start-external-method-region (beg end cal)
665 (narrow-to-region beg end)
667 (let ((method (cdr (assoc 'method cal)))
668 (name (mime/get-name cal))
671 (let ((file (make-temp-name
672 (expand-file-name "TM" mime/tmp-dir)))
676 (search-forward "\n\n" nil t)
677 (setq b (match-end 0))
680 (write-region b end file)
682 'name (replace-as-filename name) cal))
683 (setq cal (put-alist 'file file cal))
686 mime/output-buffer-name (car method)
688 (mime/make-method-args cal (cdr (cdr method)))
690 (apply (function start-process) args)
691 (mime/show-output-buffer)
695 (defun mime/decode-message/partial-region (beg end cal)
697 (let* ((root-dir (expand-file-name
698 (concat "m-prts-" (user-login-name)) mime/tmp-dir))
699 (id (cdr (assoc "id" cal)))
700 (number (cdr (assoc "number" cal)))
701 (total (cdr (assoc "total" cal)))
702 (the-buf (current-buffer))
704 (mother mime::article/preview-buffer))
705 (if (not (file-exists-p root-dir))
706 (make-directory root-dir)
708 (setq id (replace-as-filename id))
709 (setq root-dir (concat root-dir "/" id))
710 (if (not (file-exists-p root-dir))
711 (make-directory root-dir)
713 (setq file (concat root-dir "/FULL"))
714 (if (not (file-exists-p file))
716 (re-search-forward "^$")
717 (goto-char (+ (match-end 0) 1))
718 (setq file (concat root-dir "/" number))
719 (write-region (point) (point-max) file)
720 (if (get-buffer "*MIME-temp*")
721 (kill-buffer "*MIME-temp*")
723 (switch-to-buffer "*MIME-temp*")
725 (max (string-to-int total))
729 (setq file (concat root-dir "/" (int-to-string i)))
730 (if (not (file-exists-p file))
732 (switch-to-buffer the-buf)
735 (insert-file-contents file)
736 (goto-char (point-max))
739 (delete-other-windows)
740 (write-file (concat root-dir "/FULL"))
741 (setq major-mode 'mime/show-message-mode)
742 (mime/viewer-mode mother)
743 (pop-to-buffer (current-buffer))
747 (delete-other-windows)
749 (setq major-mode 'mime/show-message-mode)
750 (mime/viewer-mode mother)
751 (pop-to-buffer (current-buffer))
755 (defun mime/get-content-decoding-alist (al)
756 (get-unified-alist mime/content-decoding-condition al)
759 (defun mime::article/decode-content-region (cinfo)
761 (let ((beg (mime::content-info/point-min cinfo))
762 (end (mime::content-info/point-max cinfo))
763 (ctype (mime::content-info/type cinfo))
764 (params (mime::content-info/parameters cinfo))
765 (encoding (mime::content-info/encoding cinfo))
768 (let (method cal ret)
769 (setq cal (append (list (cons 'type ctype)
770 (cons 'encoding encoding)
771 (cons 'major-mode major-mode)
774 (if mime-viewer/decoding-mode
776 (cons 'mode mime-viewer/decoding-mode)
779 (setq ret (mime/get-content-decoding-alist cal))
780 (setq method (cdr (assoc 'method ret)))
781 (cond ((and (symbolp method)
783 (funcall method beg end ret)
785 ((and (listp method)(stringp (car method)))
786 (mime/start-external-method-region beg end ret)
788 (t (mime/show-output-buffer
789 "No method are specified for %s\n" ctype)
794 (defun mime/show-output-buffer (&rest forms)
795 (let ((the-buf (current-buffer)))
796 (if (null (get-buffer-window mime/output-buffer-name))
797 (split-window-vertically (/ (* (window-height) 3) 4))
799 (pop-to-buffer mime/output-buffer-name)
800 (goto-char (point-max))
802 (insert (apply (function format) forms))
804 (pop-to-buffer the-buf)
811 (defun mime-viewer/filter-text/plain (ctype params)
814 (let ((charset (cdr (assoc "charset" params)))
818 (goto-char (point-min))
819 (narrow-to-region (point-min)
820 (or (and (search-forward "\n\n" nil t)
823 (goto-char (point-min))
824 (mime/Content-Transfer-Encoding "7bit")
826 (beg (point-min)) (end (point-max))
828 (goto-char (point-min))
829 (if (search-forward "\n\n" nil t)
830 (setq beg (match-end 0))
832 (if (cond ((string= encoding "quoted-printable")
833 (mime/Quoted-Printable-decode-region beg end)
835 ((string= encoding "base64")
836 (mime/Base64-decode-region beg end)
838 (mime/code-convert-region-to-emacs beg (point-max) charset)
843 ;;; @ MIME viewer mode
846 (defvar mime/viewer-mode-map nil)
847 (if (null mime/viewer-mode-map)
849 (setq mime/viewer-mode-map (make-keymap))
850 (suppress-keymap mime/viewer-mode-map)
851 (define-key mime/viewer-mode-map
852 "u" (function mime-viewer/up-content))
853 (define-key mime/viewer-mode-map
854 "p" (function mime-viewer/previous-content))
855 (define-key mime/viewer-mode-map
856 "n" (function mime-viewer/next-content))
857 (define-key mime/viewer-mode-map
858 " " (function mime-viewer/scroll-up-content))
859 (define-key mime/viewer-mode-map
860 "\M- " (function mime-viewer/scroll-down-content))
861 (define-key mime/viewer-mode-map
862 "\177" (function mime-viewer/scroll-down-content))
863 (define-key mime/viewer-mode-map
864 "\C-m" (function mime-viewer/next-line-content))
865 (define-key mime/viewer-mode-map
866 "\C-\M-m" (function mime-viewer/previous-line-content))
867 (define-key mime/viewer-mode-map
868 "v" (function mime-viewer/play-content))
869 (define-key mime/viewer-mode-map
870 "e" (function mime-viewer/extract-content))
871 (define-key mime/viewer-mode-map
872 "\C-c\C-p" (function mime-viewer/print-content))
873 (define-key mime/viewer-mode-map
874 "q" (function mime-viewer/quit))
875 (define-key mime/viewer-mode-map
876 "\C-c\C-x" (function mime-viewer/kill-buffer))
879 (defun mime/viewer-mode (&optional mother ctl encoding)
880 "Major mode for viewing MIME message.
882 u Move to upper content
883 p Move to previous content
884 n Move to next content
888 RET Move to next line
889 M-RET Move to previous line
890 v Decode the content as `play mode'
891 e Decode the content as `extract mode'
892 C-c C-p Decode the content as `print mode'
896 (let ((buf (get-buffer mime/output-buffer-name))
897 (the-buf (current-buffer))
901 (switch-to-buffer buf)
903 (switch-to-buffer the-buf)
905 (let ((ret (mime-viewer/parse-message ctl encoding))
907 (switch-to-buffer (car ret))
908 (setq major-mode 'mime/viewer-mode)
909 (setq mode-name "MIME-View")
910 (make-variable-buffer-local 'mime::preview/original-major-mode)
911 (setq mime::preview/original-major-mode
914 (make-variable-buffer-local
915 'mime/show-mode-old-window-configuration)
916 (setq mime/show-mode-old-window-configuration
917 (current-window-configuration))
918 (make-variable-buffer-local 'mime/mother-buffer)
919 (setq mime/mother-buffer mother)
920 'mime/show-message-mode)
922 (use-local-map mime/viewer-mode-map)
923 (make-variable-buffer-local 'mime::preview/content-list)
924 (setq mime::preview/content-list (nth 1 ret))
926 (let ((ce (mime::preview-content-info/point-max
927 (car mime::preview/content-list)
930 (goto-char (point-min))
931 (search-forward "\n\n" nil t)
932 (setq e (match-end 0))
936 (run-hooks 'mime/viewer-mode-hook)
939 (defun mime::preview/decode-content ()
941 (let ((pc (mime::point-preview-content (point))))
943 (let ((the-buf (current-buffer)))
944 (switch-to-buffer (mime::preview-content-info/buffer pc))
945 (mime::article/decode-content-region
946 (mime::preview-content-info/content-info pc))
947 (if (eq (current-buffer)
948 (mime::preview-content-info/buffer pc))
949 (switch-to-buffer the-buf)
953 (defun mime-viewer/play-content ()
955 (let ((mime-viewer/decoding-mode "play"))
956 (mime::preview/decode-content)
959 (defun mime-viewer/extract-content ()
961 (let ((mime-viewer/decoding-mode "extract"))
962 (mime::preview/decode-content)
965 (defun mime-viewer/print-content ()
967 (let ((mime-viewer/decoding-mode "print"))
968 (mime::preview/decode-content)
971 (defun mime-viewer/up-content ()
973 (let ((pc (mime::point-preview-content (point))) cinfo
974 (the-buf (current-buffer))
976 (switch-to-buffer (mime::preview-content-info/buffer pc))
977 (setq cinfo (mime::preview-content-info/content-info pc))
978 (setq cn (mime::get-point-content-number
979 (mime::content-info/point-min cinfo)))
981 (mime-viewer/quit the-buf
982 (mime::preview-content-info/buffer pc)
984 (setq r (mime::article/get-content-region (butlast cn)))
985 (switch-to-buffer the-buf)
987 (let ((rpcl mime::preview/content-list) cell)
989 (setq cell (car rpcl))
990 (if (eq r (mime::preview-content-info/content-info cell))
992 (goto-char (mime::preview-content-info/point-min cell))
995 (setq rpcl (cdr rpcl))
999 (defun mime-viewer/previous-content ()
1001 (let* ((pcl mime::preview/content-list)
1003 (i (- (length pcl) 1))
1007 (setq beg (mime::preview-content-info/point-min (nth i pcl)))
1009 (throw 'tag (goto-char beg))
1015 (defun mime-viewer/next-content ()
1017 (let ((pcl mime::preview/content-list)
1022 (setq beg (mime::preview-content-info/point-min (car pcl)))
1024 (throw 'tag (goto-char beg))
1026 (setq pcl (cdr pcl))
1030 (defun mime-viewer/scroll-up-content (&optional h)
1033 (setq h (- (window-height) 1))
1035 (let ((pcl mime::preview/content-list)
1041 (setq beg (mime::preview-content-info/point-min (car pcl)))
1045 (setq pcl (cdr pcl))
1053 (defun mime-viewer/scroll-down-content (&optional h)
1056 (setq h (- (window-height) 1))
1058 (let ((pcl mime::preview/content-list)
1062 (or (let ((i (- (length pcl) 1)))
1065 (setq beg (mime::preview-content-info/point-min
1073 (forward-line (- h))
1078 (defun mime-viewer/next-line-content ()
1080 (mime-viewer/scroll-up-content 1)
1083 (defun mime-viewer/previous-line-content ()
1085 (mime-viewer/scroll-down-content 1)
1088 (defun mime-viewer/quit (&optional the-buf buf)
1091 (setq the-buf (current-buffer))
1094 (setq buf (mime::preview-content-info/buffer
1095 (mime::point-preview-content (point))))
1098 (switch-to-buffer buf)
1099 (assoc major-mode mime-viewer/quitting-method-alist)
1103 (switch-to-buffer the-buf)
1108 (defun mime-viewer/kill-buffer ()
1110 (kill-buffer (current-buffer))
1113 (fset 'mime/view-mode 'mime/viewer-mode)
1115 (run-hooks 'tm-view-load-hook)