diff lisp/mail/metamail.el @ 4171:341cd3b063ae

entered into RCS
author Richard M. Stallman <rms@gnu.org>
date Tue, 20 Jul 1993 03:02:12 +0000
parents
children 0a94cd2c51c4
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/mail/metamail.el	Tue Jul 20 03:02:12 1993 +0000
@@ -0,0 +1,123 @@
+;;; metamail.el --- Metamail interface for GNU Emacs
+
+;; Copyright (C) 1993 Masanobu UMEDA
+
+;; Author: Masanobu UMEDA <umerin@mse.kyutech.ac.jp>
+;; Version: $Header: metamail.el,v 1.5 93/07/08 21:56:49 umerin Exp $
+;; Keywords: mail, news, mime, multimedia
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to
+;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;;; Commentary:
+
+;; LCD Archive Entry:
+;; metamail|Masanobu UMEDA|umerin@mse.kyutech.ac.jp|
+;; Metamail interface for GNU Emacs|
+;; $Date: 93/07/08 21:56:49 $|$Revision: 1.5 $|~/misc/metamail.el.Z|
+
+;; Note: Metamail does not have all options which is compatible with
+;; the environment variables.  For that reason, matamail.el have to
+;; hack the environment variables.  In addition, there is no way to
+;; display all header fields without extra informative body messages
+;; which is suppressed by "-q" option.
+
+;; The idea of using metamail to process MIME messages is from
+;; gnus-mime.el by Spike <Spike@world.std.com>.
+
+;;; Code:
+
+(defvar metamail-program-name "metamail"
+  "*Metamail program name.")
+
+(defvar metamail-environment '("KEYHEADS=*")
+  "*Environment variables passed to `metamail'.
+It must ba a list of strings that have the format ENVVARNAME=VALUE.")
+
+(defvar metamail-switches '("-m" "emacs" "-x" "-d" "-z")
+  "*Switches for `metamail' program.
+-z is required to remove zap file.")
+
+(defun metamail-buffer (&optional buffer nodisplay)
+  "Process current buffer through `metamail'.
+Optional 1st argument BUFFER specifies a buffer to be filled (nil
+means current).
+Optional 2nd argument NODISPLAY non-nil means buffer is not
+redisplayed as output is inserted."
+  (interactive)
+  (metamail-region (point-min) (point-max) buffer nodisplay))
+
+(defun metamail-region (beg end &optional buffer nodisplay)
+  "Process current region through 'metamail'.
+Optional 1st argument BUFFER specifies a buffer to be filled (nil
+means current).
+Optional 2nd argument NODISPLAY non-nil means buffer is not
+redisplayed as output is inserted."
+  (interactive "r")
+  (let ((curbuf (current-buffer))
+	(buffer-read-only nil)
+	(metafile (make-temp-name "/tmp/metamail")))
+    (save-excursion
+      ;; Gee!  Metamail does not ouput to stdout if input comes from
+      ;; stdin.
+      (write-region beg end metafile nil 'nomessage)
+      (if buffer
+	  (set-buffer buffer))
+      (setq buffer-read-only nil)
+      ;; Clear destination buffer.
+      (if (eq curbuf (current-buffer))
+	  (delete-region beg end)
+	(delete-region (point-min) (point-max)))
+      ;; We have to pass the environment variable KEYHEADS to display
+      ;; all header fields.  Metamail should have an optional argument
+      ;; to pass such information directly.
+      (let ((process-environment
+	     (append metamail-environment process-environment)))
+	(apply (function call-process)
+	       metamail-program-name
+	       nil
+	       t			;Output to current buffer
+	       (not nodisplay)		;Force redisplay
+	       (append metamail-switches (list metafile))))
+      ;; `metamail' may not delete the temporary file!
+      (condition-case error
+	  (delete-file metafile)
+	(error nil))
+      )))
+
+;(defun metamail-region (beg end &optional buffer)
+;  "Process current region through 'metamail'.
+;Optional argument BUFFER specifies a buffer to be filled (nil means current)."
+;  (interactive "r")
+;  (let ((curbuf (current-buffer))
+;	(buffer-read-only nil)
+;	(metafile (make-temp-name "/tmp/metamail")))
+;    (save-excursion
+;      (write-region (point-min) (point-max) metafile nil 'nomessage)
+;      (if (eq curbuf
+;	      (if buffer (get-buffer buffer) (current-buffer)))
+;	  (delete-region (point-min) (point-max)))
+;      (apply (function call-process)
+;	     metamail-program-name
+;	     nil
+;	     (or buffer t)		;BUFFER or current buffer
+;	     nil			;don't redisplay
+;	     (append metamail-switches (list metafile)))
+;      )))
+
+(provide 'metamail)
+
+;;; metamail.el ends here