annotate lisp/env.el @ 83826:41451b9525da

*** empty log message ***
author Thien-Thi Nguyen <ttn@gnuvola.org>
date Fri, 31 Aug 2007 19:15:07 +0000
parents 83408efd641e
children bf9d24dbf5a9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38412
253f761ad37b Some fixes to follow coding conventions in files maintained by FSF.
Pavel Janík <Pavel@Janik.cz>
parents: 28917
diff changeset
1 ;;; env.el --- functions to manipulate environment variables
658
7cbd4fcd8b0f *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 584
diff changeset
2
64762
41bb365f41c4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64091
diff changeset
3 ;; Copyright (C) 1991, 1994, 2000, 2001, 2002, 2003, 2004,
75347
e3694f1cb928 Add 2007 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 70417
diff changeset
4 ;; 2005, 2006, 2007 Free Software Foundation, Inc.
1185
4ec50a934e54 entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 814
diff changeset
5
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
6 ;; Maintainer: FSF
2315
9e7ec92a4fdf Added or corrected Commentary headers
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1218
diff changeset
7 ;; Keywords: processes, unix
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
8
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
9 ;; This file is part of GNU Emacs.
489
3d2d0362a496 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
78236
9355f9b7bbff Switch license to GPLv3 or later.
Glenn Morris <rgm@gnu.org>
parents: 75347
diff changeset
13 ;; the Free Software Foundation; either version 3, or (at your option)
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
14 ;; any later version.
489
3d2d0362a496 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
19 ;; GNU General Public License for more details.
489
3d2d0362a496 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
21 ;; You should have received a copy of the GNU General Public License
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64091
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 52401
diff changeset
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 52401
diff changeset
24 ;; Boston, MA 02110-1301, USA.
489
3d2d0362a496 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
25
2315
9e7ec92a4fdf Added or corrected Commentary headers
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1218
diff changeset
26 ;;; Commentary:
9e7ec92a4fdf Added or corrected Commentary headers
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1218
diff changeset
27
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
28 ;; UNIX processes inherit a list of name-to-string associations from their
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
29 ;; parents called their `environment'; these are commonly used to control
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
30 ;; program options. This package permits you to set environment variables
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
31 ;; to be passed to any sub-process run under Emacs.
2315
9e7ec92a4fdf Added or corrected Commentary headers
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1218
diff changeset
32
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
33 ;; Note that the environment string `process-environment' is not
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
34 ;; decoded, but the args of `setenv' and `getenv' are normally
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
35 ;; multibyte text and get coding conversion.
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
36
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
37 ;;; Code:
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
38
83425
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
39 (eval-when-compile (require 'cl))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
40
9220
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
41 ;; History list for environment variable names.
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
42 (defvar read-envvar-name-history nil)
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
43
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
44 (defun read-envvar-name (prompt &optional mustmatch)
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
45 "Read environment variable name, prompting with PROMPT.
9345
832197fec54d (read-envvar-name): Special meaning for MUSTMATCH
Richard M. Stallman <rms@gnu.org>
parents: 9220
diff changeset
46 Optional second arg MUSTMATCH, if non-nil, means require existing envvar name.
832197fec54d (read-envvar-name): Special meaning for MUSTMATCH
Richard M. Stallman <rms@gnu.org>
parents: 9220
diff changeset
47 If it is also not t, RET does not exit if it does non-null completion."
9220
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
48 (completing-read prompt
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
49 (mapcar (lambda (enventry)
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
50 (list (if enable-multibyte-characters
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
51 (decode-coding-string
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
52 (substring enventry 0
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
53 (string-match "=" enventry))
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
54 locale-coding-system t)
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
55 (substring enventry 0
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
56 (string-match "=" enventry)))))
83425
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
57 (append process-environment
83640
2aee92eacdab * server.el (server-process-filter): Likewise.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 83594
diff changeset
58 nil ;;(frame-parameter (frame-with-environment) 'environment)
2aee92eacdab * server.el (server-process-filter): Likewise.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 83594
diff changeset
59 ))
9220
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
60 nil mustmatch nil 'read-envvar-name-history))
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
61
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
62 ;; History list for VALUE argument to setenv.
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
63 (defvar setenv-history nil)
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
64
39554
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
65
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
66 (defun substitute-env-vars (string)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
67 "Substitute environment variables referred to in STRING.
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
68 `$FOO' where FOO is an environment variable name means to substitute
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
69 the value of that variable. The variable name should be terminated
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
70 with a character not a letter, digit or underscore; otherwise, enclose
51279
92f5fdc30889 (substitute-env-vars): Fix typo.
Richard M. Stallman <rms@gnu.org>
parents: 50873
diff changeset
71 the entire variable name in braces. For instance, in `ab$cd-x',
92f5fdc30889 (substitute-env-vars): Fix typo.
Richard M. Stallman <rms@gnu.org>
parents: 50873
diff changeset
72 `$cd' is treated as an environment variable.
92f5fdc30889 (substitute-env-vars): Fix typo.
Richard M. Stallman <rms@gnu.org>
parents: 50873
diff changeset
73
92f5fdc30889 (substitute-env-vars): Fix typo.
Richard M. Stallman <rms@gnu.org>
parents: 50873
diff changeset
74 Use `$$' to insert a single dollar sign."
39554
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
75 (let ((start 0))
49588
37645a051842 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 40430
diff changeset
76 (while (string-match
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
77 (eval-when-compile
51279
92f5fdc30889 (substitute-env-vars): Fix typo.
Richard M. Stallman <rms@gnu.org>
parents: 50873
diff changeset
78 (rx (or (and "$" (submatch (1+ (regexp "[[:alnum:]_]"))))
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
79 (and "${" (submatch (minimal-match (0+ anything))) "}")
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
80 "$$")))
39554
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
81 string start)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
82 (cond ((match-beginning 1)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
83 (let ((value (getenv (match-string 1 string))))
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
84 (setq string (replace-match (or value "") t t string)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
85 start (+ (match-beginning 0) (length value)))))
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
86 ((match-beginning 2)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
87 (let ((value (getenv (match-string 2 string))))
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
88 (setq string (replace-match (or value "") t t string)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
89 start (+ (match-beginning 0) (length value)))))
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
90 (t
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
91 (setq string (replace-match "$" t t string)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
92 start (+ (match-beginning 0) 1)))))
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
93 string))
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
94
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
95
83529
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
96 (defun setenv-internal (env variable value keep-empty)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
97 "Set VARIABLE to VALUE in ENV, adding empty entries if KEEP-EMPTY.
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
98 Changes ENV by side-effect, and returns its new value."
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
99 (let ((pattern (concat "\\`" (regexp-quote variable) "\\(=\\|\\'\\)"))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
100 (case-fold-search nil)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
101 (scan env)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
102 prev found)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
103 ;; Handle deletions from the beginning of the list specially.
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
104 (if (and (null value)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
105 (not keep-empty)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
106 env
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
107 (stringp (car env))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
108 (string-match pattern (car env)))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
109 (cdr env)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
110 ;; Try to find existing entry for VARIABLE in ENV.
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
111 (while (and scan (stringp (car scan)))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
112 (when (string-match pattern (car scan))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
113 (if value
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
114 (setcar scan (concat variable "=" value))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
115 (if keep-empty
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
116 (setcar scan variable)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
117 (setcdr prev (cdr scan))))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
118 (setq found t
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
119 scan nil))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
120 (setq prev scan
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
121 scan (cdr scan)))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
122 (if (and (not found) (or value keep-empty))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
123 (cons (if value
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
124 (concat variable "=" value)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
125 variable)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
126 env)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
127 env))))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
128
83425
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
129 ;; Fixme: Should the environment be recoded if LC_CTYPE &c is set?
39554
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
130
83510
2d2f6f096f6e Merged from emacs@sv.gnu.org
Karoly Lorentey <lorentey@elte.hu>
parents: 83468 70094
diff changeset
131 (defun setenv (variable &optional value substitute-env-vars frame)
489
3d2d0362a496 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
132 "Set the value of the environment variable named VARIABLE to VALUE.
50873
562c854aa190 (setenv): Don't quote nil and t in docstrings.
Juanma Barranquero <lekktu@gmail.com>
parents: 49977
diff changeset
133 VARIABLE should be a string. VALUE is optional; if not provided or
70094
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
134 nil, the environment variable VARIABLE will be removed.
8004
a86eceda6537 (setenv): Rewrite. Provide a way to unset interactively.
Richard M. Stallman <rms@gnu.org>
parents: 8002
diff changeset
135
83430
10f26433fe3f Update environment-related doc strings.
Karoly Lorentey <lorentey@elte.hu>
parents: 83427
diff changeset
136 Interactively, a prefix argument means to unset the variable, and
10f26433fe3f Update environment-related doc strings.
Karoly Lorentey <lorentey@elte.hu>
parents: 83427
diff changeset
137 otherwise the current value (if any) of the variable appears at
10f26433fe3f Update environment-related doc strings.
Karoly Lorentey <lorentey@elte.hu>
parents: 83427
diff changeset
138 the front of the history list when you type in the new value.
10f26433fe3f Update environment-related doc strings.
Karoly Lorentey <lorentey@elte.hu>
parents: 83427
diff changeset
139 This function always replaces environment variables in the new
10f26433fe3f Update environment-related doc strings.
Karoly Lorentey <lorentey@elte.hu>
parents: 83427
diff changeset
140 value when called interactively.
9220
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
141
70094
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
142 SUBSTITUTE-ENV-VARS, if non-nil, means to substitute environment
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
143 variables in VALUE with `substitute-env-vars', which see.
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
144 This is normally used only for interactive calls.
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
145
83529
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
146 If optional parameter FRAME is non-nil, this function modifies
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
147 only the frame-local value of VARIABLE on FRAME, ignoring
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
148 `process-environment'. Note that frames on the same terminal
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
149 device usually share their environment, so calling `setenv' on
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
150 one of them affects the others as well.
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
151
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
152 If FRAME is nil, `setenv' changes the global value of VARIABLE by
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
153 modifying `process-environment'. Note that the global value
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
154 overrides any frame-local values.
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
155
70094
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
156 The return value is the new value of VARIABLE, or nil if
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
157 it was removed from the environment.
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
158
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
159 As a special case, setting variable `TZ' calls `set-time-zone-rule' as
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
160 a side-effect."
8004
a86eceda6537 (setenv): Rewrite. Provide a way to unset interactively.
Richard M. Stallman <rms@gnu.org>
parents: 8002
diff changeset
161 (interactive
a86eceda6537 (setenv): Rewrite. Provide a way to unset interactively.
Richard M. Stallman <rms@gnu.org>
parents: 8002
diff changeset
162 (if current-prefix-arg
70094
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
163 (list (read-envvar-name "Clear environment variable: " 'exact) nil)
39126
c0713ad66d33 (setenv): Interactively, if VARIABLE has a current value,
Gerd Moellmann <gerd@gnu.org>
parents: 38412
diff changeset
164 (let* ((var (read-envvar-name "Set environment variable: " nil))
c0713ad66d33 (setenv): Interactively, if VARIABLE has a current value,
Gerd Moellmann <gerd@gnu.org>
parents: 38412
diff changeset
165 (value (getenv var)))
c0713ad66d33 (setenv): Interactively, if VARIABLE has a current value,
Gerd Moellmann <gerd@gnu.org>
parents: 38412
diff changeset
166 (when value
70417
95f3ef491663 (setenv): Use add-to-history.
Kim F. Storm <storm@cua.dk>
parents: 70094
diff changeset
167 (add-to-history 'setenv-history value))
9220
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
168 ;; Here finally we specify the args to give call setenv with.
49588
37645a051842 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 40430
diff changeset
169 (list var
39554
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
170 (read-from-minibuffer (format "Set %s to value: " var)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
171 nil nil nil 'setenv-history
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
172 value)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
173 t))))
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
174 (if (and (multibyte-string-p variable) locale-coding-system)
49977
f491c5cee974 (setenv): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49968
diff changeset
175 (let ((codings (find-coding-systems-string (concat variable value))))
f491c5cee974 (setenv): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49968
diff changeset
176 (unless (or (eq 'undecided (car codings))
f491c5cee974 (setenv): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49968
diff changeset
177 (memq (coding-system-base locale-coding-system) codings))
f491c5cee974 (setenv): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49968
diff changeset
178 (error "Can't encode `%s=%s' with `locale-coding-system'"
f491c5cee974 (setenv): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49968
diff changeset
179 variable (or value "")))))
70094
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
180 (and value
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
181 substitute-env-vars
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
182 (setq value (substitute-env-vars value)))
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
183 (if (multibyte-string-p variable)
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
184 (setq variable (encode-coding-string variable locale-coding-system)))
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
185 (if (and value (multibyte-string-p value))
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
186 (setq value (encode-coding-string value locale-coding-system)))
489
3d2d0362a496 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
187 (if (string-match "=" variable)
83421
bb2edc915032 Implement automatic terminal-local environment variables via `local-environment-variables'.
Karoly Lorentey <lorentey@elte.hu>
parents: 64762
diff changeset
188 (error "Environment variable name `%s' contains `='" variable))
83529
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
189 (if (string-equal "TZ" variable)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
190 (set-time-zone-rule value))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
191 (if (null frame)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
192 (setq process-environment (setenv-internal process-environment
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
193 variable value t))
83427
2afc49c9f0c0 Store local environment in frame (not terminal) parameters.
Karoly Lorentey <lorentey@elte.hu>
parents: 83425
diff changeset
194 (setq frame (frame-with-environment frame))
83797
f86e7a61b05e Trivial spacing and comment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 83648
diff changeset
195 (cond
83640
2aee92eacdab * server.el (server-process-filter): Likewise.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 83594
diff changeset
196 ((string-equal "DISPLAY" variable)
2aee92eacdab * server.el (server-process-filter): Likewise.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 83594
diff changeset
197 (set-frame-parameter frame 'display-environment-variable value))
83797
f86e7a61b05e Trivial spacing and comment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 83648
diff changeset
198 (t
83640
2aee92eacdab * server.el (server-process-filter): Likewise.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 83594
diff changeset
199 (setq process-environment (setenv-internal process-environment
2aee92eacdab * server.el (server-process-filter): Likewise.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 83594
diff changeset
200 variable value nil)))))
39554
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
201 value)
584
4cd7543be581 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 489
diff changeset
202
83427
2afc49c9f0c0 Store local environment in frame (not terminal) parameters.
Karoly Lorentey <lorentey@elte.hu>
parents: 83425
diff changeset
203 (defun getenv (variable &optional frame)
28917
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
204 "Get the value of environment variable VARIABLE.
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
205 VARIABLE should be a string. Value is nil if VARIABLE is undefined in
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
206 the environment. Otherwise, value is a string.
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
207
83427
2afc49c9f0c0 Store local environment in frame (not terminal) parameters.
Karoly Lorentey <lorentey@elte.hu>
parents: 83425
diff changeset
208 If optional parameter FRAME is non-nil, then it should be a
83529
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
209 frame. This function will look up VARIABLE in its 'environment
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
210 parameter.
83421
bb2edc915032 Implement automatic terminal-local environment variables via `local-environment-variables'.
Karoly Lorentey <lorentey@elte.hu>
parents: 64762
diff changeset
211
83427
2afc49c9f0c0 Store local environment in frame (not terminal) parameters.
Karoly Lorentey <lorentey@elte.hu>
parents: 83425
diff changeset
212 Otherwise, this function searches `process-environment' for
83529
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
213 VARIABLE. If it is not found there, then it continues the search
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
214 in the environment list of the selected frame."
28917
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
215 (interactive (list (read-envvar-name "Get environment variable: " t)))
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
216 (let ((value (getenv-internal (if (multibyte-string-p variable)
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
217 (encode-coding-string
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
218 variable locale-coding-system)
83594
2716535391b7 Rudimentary fix for environment variable handling.
Miles Bader <miles@gnu.org>
parents: 83568
diff changeset
219 variable)
2716535391b7 Rudimentary fix for environment variable handling.
Miles Bader <miles@gnu.org>
parents: 83568
diff changeset
220 frame)))
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
221 (if (and enable-multibyte-characters value)
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
222 (setq value (decode-coding-string value locale-coding-system)))
28917
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
223 (when (interactive-p)
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
224 (message "%s" (if value value "Not set")))
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
225 value))
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
226
83594
2716535391b7 Rudimentary fix for environment variable handling.
Miles Bader <miles@gnu.org>
parents: 83568
diff changeset
227 (defun environment (&optional frame)
83425
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
228 "Return a list of environment variables with their values.
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
229 Each entry in the list is a string of the form NAME=VALUE.
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
230
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
231 The returned list can not be used to change environment
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
232 variables, only read them. See `setenv' to do that.
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
233
83594
2716535391b7 Rudimentary fix for environment variable handling.
Miles Bader <miles@gnu.org>
parents: 83568
diff changeset
234 If optional parameter FRAME is non-nil, then it should be a
2716535391b7 Rudimentary fix for environment variable handling.
Miles Bader <miles@gnu.org>
parents: 83568
diff changeset
235 frame. The function returns the environment of that frame.
2716535391b7 Rudimentary fix for environment variable handling.
Miles Bader <miles@gnu.org>
parents: 83568
diff changeset
236
83529
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
237 The list is constructed by concatenating the elements of
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
238 `process-environment' and the 'environment parameter of the
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
239 selected frame, and removing duplicated and empty values.
83425
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
240
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
241 Non-ASCII characters are encoded according to the initial value of
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
242 `locale-coding-system', i.e. the elements must normally be decoded for use.
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
243 See `setenv' and `getenv'."
83529
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
244 (let* ((env (append process-environment
83640
2aee92eacdab * server.el (server-process-filter): Likewise.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 83594
diff changeset
245 ;; (frame-parameter (frame-with-environment frame)
2aee92eacdab * server.el (server-process-filter): Likewise.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 83594
diff changeset
246 ;; 'environment)
83529
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
247 nil))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
248 (scan env)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
249 prev seen)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
250 ;; Remove unset variables from the beginning of the list.
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
251 (while (and env
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
252 (or (not (stringp (car env)))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
253 (not (string-match "=" (car env)))))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
254 (or (member (car env) seen)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
255 (setq seen (cons (car env) seen)))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
256 (setq env (cdr env)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
257 scan env))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
258 (let (name)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
259 (while scan
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
260 (cond ((or (not (stringp (car scan)))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
261 (not (string-match "=" (car scan))))
83425
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
262 ;; Unset variable.
83529
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
263 (or (member (car scan) seen)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
264 (setq seen (cons (car scan) seen)))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
265 (setcdr prev (cdr scan)))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
266 ((member (setq name (substring (car scan) 0 (string-match "=" (car scan)))) seen)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
267 ;; Duplicated variable.
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
268 (setcdr prev (cdr scan)))
83425
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
269 (t
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
270 ;; New variable.
83529
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
271 (setq seen (cons name seen))))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
272 (setq prev scan
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
273 scan (cdr scan))))
83425
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
274 env))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
275
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
276 (defmacro let-environment (varlist &rest body)
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
277 "Evaluate BODY with environment variables set according to VARLIST.
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
278 The environment variables are then restored to their previous
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
279 values.
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
280 The value of the last form in BODY is returned.
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
281
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
282 Each element of VARLIST is either a string (which variable is
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
283 then removed from the environment), or a list (NAME
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
284 VALUEFORM) (which sets NAME to the value of VALUEFORM, a string).
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
285 All the VALUEFORMs are evaluated before any variables are set."
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
286 (declare (indent 2))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
287 (let ((old-env (make-symbol "old-env"))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
288 (name (make-symbol "name"))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
289 (value (make-symbol "value"))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
290 (entry (make-symbol "entry"))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
291 (frame (make-symbol "frame")))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
292 `(let ((,frame (selected-frame))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
293 ,old-env)
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
294 ;; Evaluate VALUEFORMs and replace them in VARLIST with their values.
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
295 (dolist (,entry ,varlist)
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
296 (unless (stringp ,entry)
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
297 (if (cdr (cdr ,entry))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
298 (error "`let-environment' bindings can have only one value-form"))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
299 (setcdr ,entry (eval (cadr ,entry)))))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
300 ;; Set the variables.
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
301 (dolist (,entry ,varlist)
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
302 (let ((,name (if (stringp ,entry) ,entry (car ,entry)))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
303 (,value (if (consp ,entry) (cdr ,entry))))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
304 (setq ,old-env (cons (cons ,name (getenv ,name)) ,old-env))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
305 (setenv ,name ,value)))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
306 (unwind-protect
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
307 (progn ,@body)
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
308 ;; Restore old values.
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
309 (with-selected-frame (if (frame-live-p ,frame)
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
310 ,frame
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
311 (selected-frame))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
312 (dolist (,entry ,old-env)
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
313 (setenv (car ,entry) (cdr ,entry))))))))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
314
2403
05d8916e4cde renamed to env.el; changed setenv to putenv.
Noah Friedman <friedman@splode.com>
parents: 2315
diff changeset
315 (provide 'env)
05d8916e4cde renamed to env.el; changed setenv to putenv.
Noah Friedman <friedman@splode.com>
parents: 2315
diff changeset
316
83797
f86e7a61b05e Trivial spacing and comment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 83648
diff changeset
317 ;; arch-tag: b7d6a8f7-bc81-46db-8e39-8d721d4ed0b8
2403
05d8916e4cde renamed to env.el; changed setenv to putenv.
Noah Friedman <friedman@splode.com>
parents: 2315
diff changeset
318 ;;; env.el ends here