Mercurial > emacs
diff lisp/simple.el @ 90037:0fe073a08cef
Revision: miles@gnu.org--gnu-2004/emacs--unicode--0--patch-65
Merge from emacs--cvs-trunk--0
Patches applied:
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-634
- miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-639
Update from CVS
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-640
Merge from gnus--rel--5.10
* miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-641
Update from CVS
* miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-59
- miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-60
Update from CVS
author | Miles Bader <miles@gnu.org> |
---|---|
date | Wed, 27 Oct 2004 05:42:04 +0000 |
parents | 0796fc36c2bd 4d4bfb9781e1 |
children | e24e2e78deda |
line wrap: on
line diff
--- a/lisp/simple.el Tue Oct 26 01:28:28 2004 +0000 +++ b/lisp/simple.el Wed Oct 27 05:42:04 2004 +0000 @@ -1879,6 +1879,39 @@ (with-current-buffer standard-output (call-process shell-file-name nil t nil shell-command-switch command)))) + +(defun process-file (program &optional infile buffer display &rest args) + "Process files synchronously in a separate process. +Similar to `call-process', but may invoke a file handler based on +`default-directory'. The current working directory of the +subprocess is `default-directory'. + +File names in INFILE and BUFFER are handled normally, but file +names in ARGS should be relative to `default-directory', as they +are passed to the process verbatim. \(This is a difference to +`call-process' which does not support file handlers for INFILE +and BUFFER.\) + +Some file handlers might not support all variants, for example +they might behave as if DISPLAY was nil, regardless of the actual +value passed." + (let ((fh (find-file-name-handler default-directory 'process-file)) + lc stderr-file) + (unwind-protect + (if fh (apply fh 'process-file program infile buffer display args) + (when infile (setq lc (file-local-copy infile))) + (setq stderr-file (when (and (consp buffer) (stringp (cadr buffer))) + (make-temp-file "emacs"))) + (prog1 + (apply 'call-process program + (or lc infile) + (if stderr-file (list (car buffer) stderr-file) buffer) + display args) + (when stderr-file (copy-file stderr-file (cadr buffer))))) + (when stderr-file (delete-file stderr-file)) + (when lc (delete-file lc))))) + + (defvar universal-argument-map (let ((map (make-sparse-keymap)))