]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new macro with-environment-variables
authorLars Ingebrigtsen <larsi@gnus.org>
Sun, 26 Sep 2021 06:27:51 +0000 (08:27 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 26 Sep 2021 06:27:51 +0000 (08:27 +0200)
* doc/lispref/os.texi (System Environment): Document it.

* lisp/env.el (with-environment-variables): New macro.

doc/lispref/os.texi
etc/NEWS
lisp/env.el

index 658f742c418e9fdb4a4814aebfdda1abe73edabb..a34c01c81aa11ffc2161f45bdebe07407f5c000b 100644 (file)
@@ -1042,6 +1042,18 @@ that variable with @code{let} is also reasonable practice.
 if it removed @var{variable} from the environment.
 @end deffn
 
+@defmac with-environment-variables variables body@dots{}
+This macro sets the environment variables in @var{variables}
+temporarily when executing @var{body}.  The previous values are
+restored when the form finishes.
+
+@lisp
+(with-environment-variables (("LANG" "C")
+                             ("LANGUAGE" "en_US:en"))
+  (call-process "ls" nil t))
+@end lisp
+@end defmac
+
 @defvar process-environment
 This variable is a list of strings, each describing one environment
 variable.  The functions @code{getenv} and @code{setenv} work by means
index d77d34160b21a7edded60934e68361c619da7a37..bc468c6df4cb8a3dc493c5f16bc16744273e2072 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -4417,6 +4417,11 @@ obsoletes the old data layout specifications.  It supports
 arbitrary-size integers, recursive types, and more.  See the Info node
 "(elisp) Byte Packing" in the ELisp manual for more details.
 
++++
+** New macro 'with-environment-variables'.
+This macro allows setting environment variables temporarily when
+executing a form.
+
 \f
 * Changes in Emacs 28.1 on Non-Free Operating Systems
 
index 83f43d1006b98578958f64fba7230495348bd329..31a728c0e5690debdd7235d020dbba1fb7fdc169 100644 (file)
@@ -218,6 +218,23 @@ in the environment list of the selected frame."
       (message "%s" (if value value "Not set")))
     value))
 
+;;;###autoload
+(defmacro with-environment-variables (variables &rest body)
+  "Set VARIABLES in the environent and execute BODY.
+VARIABLES is a list of variable settings where first element
+should be the name of the variable and the second element should
+be the value.
+
+The previous values will be be restored upon exit."
+  (declare (indent 1) (debug (sexp body)))
+  (unless (consp variables)
+    (error "Invalid VARIABLES: %s" variables))
+  `(let ((process-environment (copy-sequence process-environment)))
+     ,@(mapcar (lambda (elem)
+                 `(setenv ,(car elem) ,(cadr elem)))
+               variables)
+     ,@body))
+
 (provide 'env)
 
 ;;; env.el ends here