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:
parent
30ca49c8f6
commit
b8e9239b47
@ -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
|
||||
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user