annotate lisp/env.el @ 110563:5b5c2cab9a6a

Merge changes made in Gnus.tranck gnus-art.el: Remove useless gnus-treat-translate. gnus-gravatar.el (gnus-gravatar-transform-address): Use gnus-gravatar-size. gnus.el: Remove useless gnus-local-domain. mml-smime.el: Remove useless mml-smime-verbose. mml2015.el: Remove useless mml2015-verbose.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Sat, 25 Sep 2010 12:49:02 +0000
parents 280c8ae2476d
children 417b1e4d63cd
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,
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 105372
diff changeset
4 ;; 2005, 2006, 2007, 2008, 2009, 2010 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
110015
280c8ae2476d Add "Package:" file headers to denote built-in packages.
Chong Yidong <cyd@stupidchicken.com>
parents: 106815
diff changeset
8 ;; Package: emacs
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
9
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
10 ;; This file is part of GNU Emacs.
489
3d2d0362a496 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 87649
diff changeset
12 ;; GNU Emacs is free software: you can redistribute it and/or modify
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 87649
diff changeset
14 ;; the Free Software Foundation, either version 3 of the License, or
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 87649
diff changeset
15 ;; (at your option) any later version.
489
3d2d0362a496 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
17 ;; 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
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
20 ;; GNU General Public License for more details.
489
3d2d0362a496 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
22 ;; You should have received a copy of the GNU General Public License
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 87649
diff changeset
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
489
3d2d0362a496 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
24
2315
9e7ec92a4fdf Added or corrected Commentary headers
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1218
diff changeset
25 ;;; Commentary:
9e7ec92a4fdf Added or corrected Commentary headers
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 1218
diff changeset
26
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
27 ;; 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
28 ;; parents called their `environment'; these are commonly used to control
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
29 ;; program options. This package permits you to set environment variables
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13018
diff changeset
30 ;; 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
31
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
32 ;; Note that the environment string `process-environment' is not
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
33 ;; 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
34 ;; multibyte text and get coding conversion.
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
35
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
36 ;;; Code:
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 658
diff changeset
37
83425
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
38 (eval-when-compile (require 'cl))
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
39
9220
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
40 ;; History list for environment variable names.
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
41 (defvar read-envvar-name-history nil)
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
42
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
43 (defun read-envvar-name (prompt &optional mustmatch)
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
44 "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
45 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
46 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
47 (completing-read prompt
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
48 (mapcar (lambda (enventry)
85142
740ac1a0736b (let-environment): Remove. Unused.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84751
diff changeset
49 (let ((str (substring enventry 0
740ac1a0736b (let-environment): Remove. Unused.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84751
diff changeset
50 (string-match "=" enventry))))
740ac1a0736b (let-environment): Remove. Unused.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84751
diff changeset
51 (if (multibyte-string-p str)
740ac1a0736b (let-environment): Remove. Unused.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84751
diff changeset
52 (decode-coding-string
740ac1a0736b (let-environment): Remove. Unused.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84751
diff changeset
53 str locale-coding-system t)
740ac1a0736b (let-environment): Remove. Unused.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84751
diff changeset
54 str)))
83425
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
55 (append process-environment
85142
740ac1a0736b (let-environment): Remove. Unused.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84751
diff changeset
56 ;;(frame-environment)
83640
2aee92eacdab * server.el (server-process-filter): Likewise.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 83594
diff changeset
57 ))
9220
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
58 nil mustmatch nil 'read-envvar-name-history))
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
59
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
60 ;; History list for VALUE argument to setenv.
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
61 (defvar setenv-history nil)
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
62
39554
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
63
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
64 (defun substitute-env-vars (string)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
65 "Substitute environment variables referred to in STRING.
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
66 `$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
67 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
68 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
69 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
70 `$cd' is treated as an environment variable.
92f5fdc30889 (substitute-env-vars): Fix typo.
Richard M. Stallman <rms@gnu.org>
parents: 50873
diff changeset
71
92f5fdc30889 (substitute-env-vars): Fix typo.
Richard M. Stallman <rms@gnu.org>
parents: 50873
diff changeset
72 Use `$$' to insert a single dollar sign."
39554
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
73 (let ((start 0))
49588
37645a051842 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 40430
diff changeset
74 (while (string-match
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
75 (eval-when-compile
51279
92f5fdc30889 (substitute-env-vars): Fix typo.
Richard M. Stallman <rms@gnu.org>
parents: 50873
diff changeset
76 (rx (or (and "$" (submatch (1+ (regexp "[[:alnum:]_]"))))
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
77 (and "${" (submatch (minimal-match (0+ anything))) "}")
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
78 "$$")))
39554
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
79 string start)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
80 (cond ((match-beginning 1)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
81 (let ((value (getenv (match-string 1 string))))
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
82 (setq string (replace-match (or value "") t t string)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
83 start (+ (match-beginning 0) (length value)))))
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
84 ((match-beginning 2)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
85 (let ((value (getenv (match-string 2 string))))
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
86 (setq string (replace-match (or value "") t t string)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
87 start (+ (match-beginning 0) (length value)))))
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
88 (t
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
89 (setq string (replace-match "$" t t string)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
90 start (+ (match-beginning 0) 1)))))
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
91 string))
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
92
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
93
83529
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
94 (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
95 "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
96 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
97 (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
98 (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
99 (scan env)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
100 prev found)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
101 ;; 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
102 (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
103 (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
104 env
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
105 (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
106 (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
107 (cdr env)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
108 ;; 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
109 (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
110 (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
111 (if value
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
112 (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
113 (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
114 (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
115 (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
116 (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
117 scan nil))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
118 (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
119 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
120 (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
121 (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
122 (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
123 variable)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
124 env)
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
125 env))))
0d9e16eab053 Rework environment variable support. (Reported by Kalle Olavi Niemitalo and Noah Friedman.)
Karoly Lorentey <lorentey@elte.hu>
parents: 83516
diff changeset
126
83425
c82829d08b89 Fix semantics of let-binding `process-environment'.
Karoly Lorentey <lorentey@elte.hu>
parents: 83421
diff changeset
127 ;; 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
128
70094
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
129 (defun setenv (variable &optional value substitute-env-vars)
489
3d2d0362a496 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
130 "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
131 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
132 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
133
83430
10f26433fe3f Update environment-related doc strings.
Karoly Lorentey <lorentey@elte.hu>
parents: 83427
diff changeset
134 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
135 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
136 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
137 This function always replaces environment variables in the new
10f26433fe3f Update environment-related doc strings.
Karoly Lorentey <lorentey@elte.hu>
parents: 83427
diff changeset
138 value when called interactively.
9220
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
139
70094
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
140 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
141 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
142 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
143
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
144 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
145 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
146
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
147 This function works by modifying `process-environment'.
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
148
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
149 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
150 a side-effect."
8004
a86eceda6537 (setenv): Rewrite. Provide a way to unset interactively.
Richard M. Stallman <rms@gnu.org>
parents: 8002
diff changeset
151 (interactive
a86eceda6537 (setenv): Rewrite. Provide a way to unset interactively.
Richard M. Stallman <rms@gnu.org>
parents: 8002
diff changeset
152 (if current-prefix-arg
70094
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
153 (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
154 (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
155 (value (getenv var)))
c0713ad66d33 (setenv): Interactively, if VARIABLE has a current value,
Gerd Moellmann <gerd@gnu.org>
parents: 38412
diff changeset
156 (when value
70417
95f3ef491663 (setenv): Use add-to-history.
Kim F. Storm <storm@cua.dk>
parents: 70094
diff changeset
157 (add-to-history 'setenv-history value))
9220
8f05784959cc (setenv-history): New history list.
Richard M. Stallman <rms@gnu.org>
parents: 8005
diff changeset
158 ;; 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
159 (list var
39554
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
160 (read-from-minibuffer (format "Set %s to value: " var)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
161 nil nil nil 'setenv-history
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
162 value)
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
163 t))))
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
164 (if (and (multibyte-string-p variable) locale-coding-system)
49977
f491c5cee974 (setenv): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49968
diff changeset
165 (let ((codings (find-coding-systems-string (concat variable value))))
f491c5cee974 (setenv): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49968
diff changeset
166 (unless (or (eq 'undecided (car codings))
f491c5cee974 (setenv): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49968
diff changeset
167 (memq (coding-system-base locale-coding-system) codings))
f491c5cee974 (setenv): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49968
diff changeset
168 (error "Can't encode `%s=%s' with `locale-coding-system'"
f491c5cee974 (setenv): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 49968
diff changeset
169 variable (or value "")))))
70094
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
170 (and value
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
171 substitute-env-vars
d893c3bf4c3b (setenv): Get rid of arg UNSET. Interactive unsetting
Richard M. Stallman <rms@gnu.org>
parents: 68651
diff changeset
172 (setq value (substitute-env-vars value)))
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
173 (if (multibyte-string-p variable)
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
174 (setq variable (encode-coding-string variable locale-coding-system)))
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
175 (if (and value (multibyte-string-p value))
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
176 (setq value (encode-coding-string value locale-coding-system)))
489
3d2d0362a496 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
177 (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
178 (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
179 (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
180 (set-time-zone-rule value))
85142
740ac1a0736b (let-environment): Remove. Unused.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84751
diff changeset
181 (setq process-environment (setenv-internal process-environment
740ac1a0736b (let-environment): Remove. Unused.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 84751
diff changeset
182 variable value t))
39554
c1fb5574fc7a (substitute-env-vars): New function.
Gerd Moellmann <gerd@gnu.org>
parents: 39126
diff changeset
183 value)
584
4cd7543be581 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 489
diff changeset
184
83427
2afc49c9f0c0 Store local environment in frame (not terminal) parameters.
Karoly Lorentey <lorentey@elte.hu>
parents: 83425
diff changeset
185 (defun getenv (variable &optional frame)
28917
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
186 "Get the value of environment variable VARIABLE.
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
187 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
188 the environment. Otherwise, value is a string.
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
189
83427
2afc49c9f0c0 Store local environment in frame (not terminal) parameters.
Karoly Lorentey <lorentey@elte.hu>
parents: 83425
diff changeset
190 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
191 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
192 parameter.
83421
bb2edc915032 Implement automatic terminal-local environment variables via `local-environment-variables'.
Karoly Lorentey <lorentey@elte.hu>
parents: 64762
diff changeset
193
83427
2afc49c9f0c0 Store local environment in frame (not terminal) parameters.
Karoly Lorentey <lorentey@elte.hu>
parents: 83425
diff changeset
194 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
195 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
196 in the environment list of the selected frame."
28917
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
197 (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
198 (let ((value (getenv-internal (if (multibyte-string-p variable)
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
199 (encode-coding-string
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
200 variable locale-coding-system)
83594
2716535391b7 Rudimentary fix for environment variable handling.
Miles Bader <miles@gnu.org>
parents: 83568
diff changeset
201 variable)
101930
a7b014166b41 * env.el (getenv): When FRAME is non-nil, pass the frame environment
Juanma Barranquero <lekktu@gmail.com>
parents: 101437
diff changeset
202 (and frame
a7b014166b41 * env.el (getenv): When FRAME is non-nil, pass the frame environment
Juanma Barranquero <lekktu@gmail.com>
parents: 101437
diff changeset
203 (assq 'environment
a7b014166b41 * env.el (getenv): When FRAME is non-nil, pass the frame environment
Juanma Barranquero <lekktu@gmail.com>
parents: 101437
diff changeset
204 (frame-parameters frame))))))
49968
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
205 (if (and enable-multibyte-characters value)
80ed3e75ba10 (read-envvar-name): Decode names.
Dave Love <fx@gnu.org>
parents: 49588
diff changeset
206 (setq value (decode-coding-string value locale-coding-system)))
105372
bd2966850aac Use `called-interactively-p' instead of `interactive-p'.
Juanma Barranquero <lekktu@gmail.com>
parents: 101930
diff changeset
207 (when (called-interactively-p 'interactive)
28917
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
208 (message "%s" (if value value "Not set")))
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
209 value))
845292e36d62 (getenv): New function, interactively callable.
Gerd Moellmann <gerd@gnu.org>
parents: 21201
diff changeset
210
2403
05d8916e4cde renamed to env.el; changed setenv to putenv.
Noah Friedman <friedman@splode.com>
parents: 2315
diff changeset
211 (provide 'env)
05d8916e4cde renamed to env.el; changed setenv to putenv.
Noah Friedman <friedman@splode.com>
parents: 2315
diff changeset
212
83797
f86e7a61b05e Trivial spacing and comment.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 83648
diff changeset
213 ;; 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
214 ;;; env.el ends here