diff lisp/env.el @ 88155:d7ddb3e565de

sync with trunk
author Henrik Enberg <henrik.enberg@telia.com>
date Mon, 16 Jan 2006 00:03:54 +0000
parents 37645a051842
children
line wrap: on
line diff
--- a/lisp/env.el	Sun Jan 15 23:02:10 2006 +0000
+++ b/lisp/env.el	Mon Jan 16 00:03:54 2006 +0000
@@ -1,6 +1,7 @@
 ;;; env.el --- functions to manipulate environment variables
 
-;; Copyright (C) 1991, 1994, 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1991, 1994, 2000, 2001, 2002, 2003, 2004,
+;;   2005 Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 ;; Keywords: processes, unix
@@ -19,8 +20,8 @@
 
 ;; You should have received a copy of the GNU General Public License
 ;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
 
@@ -29,6 +30,10 @@
 ;; program options.  This package permits you to set environment variables
 ;; to be passed to any sub-process run under Emacs.
 
+;; Note that the environment string `process-environment' is not
+;; decoded, but the args of `setenv' and `getenv' are normally
+;; multibyte text and get coding conversion.
+
 ;;; Code:
 
 ;; History list for environment variable names.
@@ -39,10 +44,14 @@
 Optional second arg MUSTMATCH, if non-nil, means require existing envvar name.
 If it is also not t, RET does not exit if it does non-null completion."
   (completing-read prompt
-		   (mapcar (function
-			    (lambda (enventry)
-			      (list (substring enventry 0
-					       (string-match "=" enventry)))))
+		   (mapcar (lambda (enventry)
+			     (list (if enable-multibyte-characters
+				       (decode-coding-string
+					(substring enventry 0
+						   (string-match "=" enventry))
+					locale-coding-system t)
+				     (substring enventry 0
+						(string-match "=" enventry)))))
 			   process-environment)
 		   nil mustmatch nil 'read-envvar-name-history))
 
@@ -55,13 +64,16 @@
 `$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.  Use `$$' to insert a single
-dollar sign."
+the entire variable name in braces.  For instance, in `ab$cd-x',
+`$cd' is treated as an environment variable.
+
+Use `$$' to insert a single dollar sign."
   (let ((start 0))
     (while (string-match
-	    (rx (or (and "$" (submatch (1+ (in "a-zA-Z0-9_"))))
-		    (and "${" (submatch (minimal-match (0+ anything))) "}")
-		    "$$"))
+	    (eval-when-compile
+	      (rx (or (and "$" (submatch (1+ (regexp "[[:alnum:]_]"))))
+		      (and "${" (submatch (minimal-match (0+ anything))) "}")
+		      "$$")))
 	    string start)
       (cond ((match-beginning 1)
 	     (let ((value (getenv (match-string 1 string))))
@@ -76,11 +88,12 @@
 		   start (+ (match-beginning 0) 1)))))
     string))
 
+;; Fixme: Should `process-environment' be recoded if LC_CTYPE &c is set?
 
 (defun setenv (variable &optional value unset substitute-env-vars)
   "Set the value of the environment variable named VARIABLE to VALUE.
-VARIABLE should be a string.  VALUE is optional; if not provided or is
-`nil', the environment variable VARIABLE will be removed.  UNSET
+VARIABLE should be a string.  VALUE is optional; if not provided or
+nil, the environment variable VARIABLE will be removed.  UNSET
 if non-nil means to remove VARIABLE from the environment.
 SUBSTITUTE-ENV-VARS, if non-nil, means to substitute environment
 variables in VALUE with `substitute-env-vars', where see.
@@ -92,7 +105,10 @@
 appears at the front of the history list when you type in the new value.
 Interactively, always replace environment variables in the new value.
 
-This function works by modifying `process-environment'."
+This function works by modifying `process-environment'.
+
+As a special case, setting variable `TZ' calls `set-time-zone-rule' as
+a side-effect."
   (interactive
    (if current-prefix-arg
        (list (read-envvar-name "Clear environment variable: " 'exact) nil t)
@@ -107,10 +123,20 @@
 				   value)
 	     nil
 	     t))))
+  (if (and (multibyte-string-p variable) locale-coding-system)
+      (let ((codings (find-coding-systems-string (concat variable value))))
+	(unless (or (eq 'undecided (car codings))
+		    (memq (coding-system-base locale-coding-system) codings))
+	  (error "Can't encode `%s=%s' with `locale-coding-system'"
+		 variable (or value "")))))
   (if unset
       (setq value nil)
     (if substitute-env-vars
 	(setq value (substitute-env-vars value))))
+  (if (multibyte-string-p variable)
+      (setq variable (encode-coding-string variable locale-coding-system)))
+  (if (and value (multibyte-string-p value))
+      (setq value (encode-coding-string value locale-coding-system)))
   (if (string-match "=" variable)
       (error "Environment variable name `%s' contains `='" variable)
     (let ((pattern (concat "\\`" (regexp-quote (concat variable "="))))
@@ -123,7 +149,8 @@
 	(cond ((string-match pattern (car scan))
 	       (setq found t)
 	       (if (eq nil value)
-		   (setq process-environment (delq (car scan) process-environment))
+		   (setq process-environment (delq (car scan)
+						   process-environment))
 		 (setcar scan (concat variable "=" value)))
 	       (setq scan nil)))
 	(setq scan (cdr scan)))
@@ -142,11 +169,17 @@
 This function consults the variable `process-environment'
 for its value."
   (interactive (list (read-envvar-name "Get environment variable: " t)))
-  (let ((value (getenv-internal variable)))
+  (let ((value (getenv-internal (if (multibyte-string-p variable)
+				    (encode-coding-string
+				     variable locale-coding-system)
+				  variable))))
+    (if (and enable-multibyte-characters value)
+	(setq value (decode-coding-string value locale-coding-system)))
     (when (interactive-p)
       (message "%s" (if value value "Not set")))
     value))
 
 (provide 'env)
 
+;;; arch-tag: b7d6a8f7-bc81-46db-8e39-8d721d4ed0b8
 ;;; env.el ends here