1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-13 09:32:47 +00:00

Allow using a symbol as an index into an alist in Eshell

* lisp/eshell/esh-var.el (eshell-index-value): If INDEX is a symbol,
use 'assoc' for indexing.

* test/lisp/eshell/esh-var-tests.el (esh-var-test/interp-var-assoc)
(esh-var-test/quoted-interp-var-assoc): Add checks for indexing via
symbol (bug#57787).
This commit is contained in:
Jim Porter 2022-09-13 16:14:00 -07:00
parent 30ca49c8f6
commit b8e9239b47
2 changed files with 26 additions and 21 deletions

View File

@ -646,23 +646,24 @@ For example, to retrieve the second element of a user's record in
"Reference VALUE using the given INDEX."
(when (and (stringp index) (get-text-property 0 'number index))
(setq index (string-to-number index)))
(if (stringp index)
(cdr (assoc index value))
(cond
((ring-p value)
(if (> index (ring-length value))
(error "Index exceeds length of ring")
(ring-ref value index)))
((listp value)
(if (> index (length value))
(error "Index exceeds length of list")
(nth index value)))
((vectorp value)
(if (> index (length value))
(error "Index exceeds length of vector")
(aref value index)))
(t
(error "Invalid data type for indexing")))))
(if (integerp index)
(cond
((ring-p value)
(if (> index (ring-length value))
(error "Index exceeds length of ring")
(ring-ref value index)))
((listp value)
(if (> index (length value))
(error "Index exceeds length of list")
(nth index value)))
((vectorp value)
(if (> index (length value))
(error "Index exceeds length of vector")
(aref value index)))
(t
(error "Invalid data type for indexing")))
;; INDEX is some non-integer value, so treat VALUE as an alist.
(cdr (assoc index value))))
;;;_* Variable name completion

View File

@ -105,9 +105,11 @@
(ert-deftest esh-var-test/interp-var-assoc ()
"Interpolate alist variable with index"
(let ((eshell-test-value '(("foo" . 1))))
(let ((eshell-test-value '(("foo" . 1) (bar . 2))))
(eshell-command-result-equal "echo $eshell-test-value[foo]"
1)))
1)
(eshell-command-result-equal "echo $eshell-test-value[#'bar]"
2)))
(ert-deftest esh-var-test/interp-var-length-list ()
"Interpolate length of list variable"
@ -257,9 +259,11 @@ inside double-quotes"
(ert-deftest esh-var-test/quoted-interp-var-assoc ()
"Interpolate alist variable with index inside double-quotes"
(let ((eshell-test-value '(("foo" . 1))))
(let ((eshell-test-value '(("foo" . 1) (bar . 2))))
(eshell-command-result-equal "echo \"$eshell-test-value[foo]\""
"1")))
"1")
(eshell-command-result-equal "echo \"$eshell-test-value[#'bar]\""
"2")))
(ert-deftest esh-var-test/quoted-interp-var-length-list ()
"Interpolate length of list variable inside double-quotes"