]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow Eshell variable aliases to point to other aliases
authorJim Porter <jporterbugs@gmail.com>
Sat, 9 Jul 2022 01:41:07 +0000 (18:41 -0700)
committerLars Ingebrigtsen <larsi@gnus.org>
Tue, 12 Jul 2022 13:10:56 +0000 (15:10 +0200)
In particular, this resolves an issue where '$+' referenced the real
environment variable '$PWD' instead of the Eshell variable alias of
the same name.  This meant that changing directories in Eshell
wouldn't update the value of '$+'.

* lisp/eshell/esh-var.el (eshell-get-variable): Allow Eshell variable
aliaes to point to other aliases.

* test/lisp/eshell/em-dirs-tests.el (em-dirs-test/pwd-var)
(em-dirs-test/short-pwd-var): Adapt tests to check this case
(bug#56509).

lisp/eshell/esh-var.el
test/lisp/eshell/em-dirs-tests.el

index 5092d2c6a5065e5b823334ee84c94bf6ec0dcd29..e1535c1c5d56ef732a5a47f2744ddd16cfdf6e29 100644 (file)
@@ -549,27 +549,26 @@ For example, \"[0 1][2]\" becomes:
   "Get the value for the variable NAME.
 INDICES is a list of index-lists (see `eshell-parse-indices').
 If QUOTED is non-nil, this was invoked inside double-quotes."
-  (let* ((alias (assoc name eshell-variable-aliases-list))
-        (var (if alias
-                 (cadr alias)
-               name)))
-    (if (and alias (functionp var))
-       (funcall var indices)
-      (eshell-apply-indices
-       (cond
-       ((stringp var)
-        (let ((sym (intern-soft var)))
-          (if (and sym (boundp sym)
-                   (or eshell-prefer-lisp-variables
-                       (memq sym eshell--local-vars) ; bug#15372
-                       (not (getenv var))))
-              (symbol-value sym)
-            (getenv var))))
-       ((symbolp var)
-        (symbol-value var))
-       (t
-        (error "Unknown variable `%s'" (eshell-stringify var))))
-       indices quoted))))
+  (if-let ((alias (assoc name eshell-variable-aliases-list)))
+      (let ((target (cadr alias)))
+        (cond
+         ((functionp target)
+          (funcall target indices))
+         ((symbolp target)
+          (eshell-apply-indices (symbol-value target) indices quoted))
+         (t
+          (eshell-get-variable target indices quoted))))
+    (unless (stringp name)
+      (error "Unknown variable `%s'" (eshell-stringify name)))
+    (eshell-apply-indices
+     (let ((sym (intern-soft name)))
+       (if (and sym (boundp sym)
+               (or eshell-prefer-lisp-variables
+                   (memq sym eshell--local-vars) ; bug#15372
+                   (not (getenv name))))
+          (symbol-value sym)
+        (getenv name)))
+     indices quoted)))
 
 (defun eshell-apply-indices (value indices &optional quoted)
   "Apply to VALUE all of the given INDICES, returning the sub-result.
index eb27acd208ef45398de104afb0eb906b7c594862..69480051e495a2c68ed962d485ad90341b00d09c 100644 (file)
 
 (ert-deftest em-dirs-test/pwd-var ()
   "Test using the $PWD variable."
-  (should (equal (eshell-test-command-result "echo $PWD")
-                 (expand-file-name (eshell/pwd)))))
+  (let ((default-directory "/some/path"))
+    (should (equal (eshell-test-command-result "echo $PWD")
+                   (expand-file-name default-directory)))))
 
 (ert-deftest em-dirs-test/short-pwd-var ()
   "Test using the $+ (current directory) variable."
-  (should (equal (eshell-test-command-result "echo $+")
-                 (expand-file-name (eshell/pwd)))))
+  (let ((default-directory "/some/path"))
+    (should (equal (eshell-test-command-result "echo $+")
+                   (expand-file-name default-directory)))))
 
 (ert-deftest em-dirs-test/oldpwd-var ()
   "Test using the $OLDPWD variable."