]> git.eshelyaron.com Git - emacs.git/commitdiff
(with-temp-file): New macro.
authorRichard M. Stallman <rms@gnu.org>
Sat, 28 Sep 1996 04:16:00 +0000 (04:16 +0000)
committerRichard M. Stallman <rms@gnu.org>
Sat, 28 Sep 1996 04:16:00 +0000 (04:16 +0000)
lisp/subr.el

index a3357c7186353da98a107bb3d929ffbbed2a5c03..7a5c9c69a6ee330c0c926004ba10b41081fb22a3 100644 (file)
@@ -732,7 +732,7 @@ Wildcards and redirection are handled as usual in the shell."
    (t
     (start-process name buffer shell-file-name shell-command-switch
                   (mapconcat 'identity args " ")))))
-
+\f
 (defmacro with-current-buffer (buffer &rest body)
   "Execute the forms in BODY with BUFFER as the current buffer.
 The value returned is the value of the last form in BODY."
@@ -740,6 +740,52 @@ The value returned is the value of the last form in BODY."
     (set-buffer ,buffer)
     . ,body))
 
+(defmacro with-temp-file (file &rest forms)
+  "Create a new buffer, evaluate FORMS there, and write the buffer to FILE.
+Return the value of FORMS.
+If FILE is nil, just evaluate FORMS and don't save anything.
+If FILE is t, return the buffer contents as a string."
+  (let ((temp-file (make-symbol "temp-file"))
+       (temp-buffer (make-symbol "temp-buffer"))
+       (temp-results (make-symbol "temp-results")))
+    `(save-excursion
+       (let* ((,temp-file ,file)
+             (default-major-mode 'fundamental-mode)
+             (,temp-buffer
+              (progn
+                (set-buffer
+                 (get-buffer-create
+                  (generate-new-buffer-name " *temp file*")))
+                (buffer-disable-undo (current-buffer))
+                (current-buffer)))
+             ,temp-results)
+        (unwind-protect
+            (progn
+              (setq ,temp-results (progn ,@forms))
+              (cond
+               ;; Don't save anything.
+               ((null ,temp-file)
+                ,temp-results)
+               ;; Return the buffer contents.
+               ((eq ,temp-file t)
+                (set-buffer ,temp-buffer)
+                (buffer-string))
+               ;; Save a file.
+               (t
+                (set-buffer ,temp-buffer)
+                ;; Make sure the directory where this file is
+                ;; to be saved exists.
+                (when (not (file-directory-p
+                            (file-name-directory ,temp-file)))
+                  (make-directory (file-name-directory ,temp-file) t))
+                ;; Save the file.
+                (write-region (point-min) (point-max)
+                              ,temp-file nil 'nomesg)
+                ,temp-results)))
+          ;; Kill the buffer.
+          (when (buffer-name ,temp-buffer)
+            (kill-buffer ,temp-buffer)))))))
+\f
 (defmacro with-output-to-string (&rest body)
   "Execute BODY, return the text it sent to `standard-output', as a string."
   `(let ((standard-output (get-buffer-create " *string-output*")))
@@ -799,7 +845,7 @@ If SEPARATORS is absent, it defaults to \"[ \\f\\t\\n\\r\\v]+\"."
              (cons (substring string start)
                    list)))
     (nreverse list)))
-
+\f
 (defun shell-quote-argument (argument)
   "Quote an argument for passing as argument to an inferior shell."
   (if (eq system-type 'ms-dos)