summaryrefslogtreecommitdiff
path: root/lisp/env.el
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2013-10-10 17:42:38 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2013-10-10 17:42:38 -0400
commitee041f2d07b6ed485dc34c115588f973f046c9d4 (patch)
tree8152e54e2d2552d52629c7455837f85d07ee9503 /lisp/env.el
parent00036e1dd2f2194fbc7938076defbe2d7228c8a3 (diff)
downloademacs-ee041f2d07b6ed485dc34c115588f973f046c9d4.tar.gz
* src/fileio.c (Fsubstitute_in_file_name): Use substitute-env-in-file-name.
(Qsubstitute_env_in_file_name): New var. (syms_of_fileio): Define it. * lisp/env.el (substitute-env-in-file-name): New function. (substitute-env-vars): Extend the meaning of the optional arg.
Diffstat (limited to 'lisp/env.el')
-rw-r--r--lisp/env.el30
1 files changed, 23 insertions, 7 deletions
diff --git a/lisp/env.el b/lisp/env.el
index 5618404cb67..044673d5e68 100644
--- a/lisp/env.el
+++ b/lisp/env.el
@@ -1,4 +1,4 @@
-;;; env.el --- functions to manipulate environment variables
+;;; env.el --- functions to manipulate environment variables -*- lexical-binding:t -*-
;; Copyright (C) 1991, 1994, 2000-2013 Free Software Foundation, Inc.
@@ -60,30 +60,46 @@ If it is also not t, RET does not exit if it does non-null completion."
(defconst env--substitute-vars-regexp
"\\$\\(?:\\(?1:[[:alnum:]_]+\\)\\|{\\(?1:[^{}]+\\)}\\|\\$\\)")
-(defun substitute-env-vars (string &optional only-defined)
+(defun substitute-env-vars (string &optional when-undefined)
"Substitute environment variables referred to in STRING.
`$FOO' where FOO is an environment variable name means to substitute
the value of that variable. The variable name should be terminated
with a character not a letter, digit or underscore; otherwise, enclose
the entire variable name in braces. For instance, in `ab$cd-x',
`$cd' is treated as an environment variable.
-If ONLY-DEFINED is nil, references to undefined environment variables
-are replaced by the empty string; if it is non-nil, they are left unchanged.
+
+If WHEN-DEFINED is nil, references to undefined environment variables
+are replaced by the empty string; if it is a function, the function is called
+with the variable name as argument and should return the text with which
+to replace it or nil to leave it unchanged.
+If it is non-nil and not a function, references to undefined variables are
+left unchanged.
Use `$$' to insert a single dollar sign."
(let ((start 0))
(while (string-match env--substitute-vars-regexp string start)
(cond ((match-beginning 1)
- (let ((value (getenv (match-string 1 string))))
- (if (and (null value) only-defined)
+ (let* ((var (match-string 1 string))
+ (value (getenv var)))
+ (if (and (null value)
+ (if (functionp when-undefined)
+ (null (setq value (funcall when-undefined var)))
+ when-undefined))
(setq start (match-end 0))
- (setq string (replace-match (or value "") t t string)
+ (setq string (replace-match (or value "") t t string)
start (+ (match-beginning 0) (length value))))))
(t
(setq string (replace-match "$" t t string)
start (+ (match-beginning 0) 1)))))
string))
+(defun substitute-env-in-file-name (filename)
+ (substitute-env-vars filename
+ ;; How 'bout we lookup other tables than the env?
+ ;; E.g. we could accept bookmark names as well!
+ (if (memq system-type '(windows-nt ms-dos))
+ (lambda (var) (getenv (upcase var)))
+ t)))
(defun setenv-internal (env variable value keep-empty)
"Set VARIABLE to VALUE in ENV, adding empty entries if KEEP-EMPTY.