Commit 1a90eae6 authored by Dave Love's avatar Dave Love
Browse files

(read-envvar-name): Decode names.

(substitute-env-vars): Use eval-when-compile and char class.
(setenv): Doc fix.  Encode the data (after checking that's
(getenv): Encode the name and decode the result.
parent 9c5b896b
;;; env.el --- functions to manipulate environment variables
;; Copyright (C) 1991, 1994, 2000, 2001 Free Software Foundation, Inc.
;; Copyright (C) 1991, 1994, 2000, 2001, 2003 Free Software Foundation, Inc.
;; Maintainer: FSF
;; Keywords: processes, unix
......@@ -29,6 +29,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 +43,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
(substring enventry 0
(string-match "=" enventry))
locale-coding-system t)
(substring enventry 0
(string-match "=" enventry)))))
nil mustmatch nil 'read-envvar-name-history))
......@@ -59,9 +67,10 @@ the entire variable name in braces. 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))) "}")
(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,6 +85,7 @@ dollar sign."
start (+ (match-beginning 0) 1)))))
;; 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.
......@@ -92,7 +102,10 @@ Interactively, the current value (if any) of the variable
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."
(if current-prefix-arg
(list (read-envvar-name "Clear environment variable: " 'exact) nil t)
......@@ -107,10 +120,22 @@ This function works by modifying `process-environment'."
(if unset
(if (and (multibyte-string-p variable) locale-coding-system)
(unless (memq (coding-system-base locale-coding-system)
(find-coding-systems-string (concat variable value)))
(error "Can't encode `%s=%s' with `locale-coding-system'"
variable (or value "")))
(unless (memq 'undecided (find-coding-systems-string variable))
(error "Can't encode `%s=%s' with unspecified `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 +148,8 @@ This function works by modifying `process-environment'."
(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)
(setcar scan (concat variable "=" value)))
(setq scan nil)))
(setq scan (cdr scan)))
......@@ -142,7 +168,12 @@ the environment. Otherwise, value is a string.
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)
variable locale-coding-system)
(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")))
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment