diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2013-10-10 17:42:38 -0400 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2013-10-10 17:42:38 -0400 |
commit | ee041f2d07b6ed485dc34c115588f973f046c9d4 (patch) | |
tree | 8152e54e2d2552d52629c7455837f85d07ee9503 /lisp/env.el | |
parent | 00036e1dd2f2194fbc7938076defbe2d7228c8a3 (diff) | |
download | emacs-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.el | 30 |
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. |