Integers imply a direct index, and names, an associate lookup using
`assoc'.
-If QUOTED is non-nil, this was invoked inside double-quotes. This
-affects the behavior of splitting strings: without quoting, the
-split values are converted to Lisp forms via `eshell-convert'; with
-quoting, they're left as strings.
+If QUOTED is non-nil, this was invoked inside double-quotes.
+This affects the behavior of splitting strings: without quoting,
+the split values are converted to numbers via
+`eshell-convert-to-number' if possible; with quoting, they're
+left as strings.
For example, to retrieve the second element of a user's record in
'/etc/passwd', the variable reference would look like:
(not (get-text-property 0 'number index)))
(setq separator index
refs (cdr refs)))
- (setq value
- (mapcar (lambda (i) (eshell-convert i quoted))
- (split-string value separator)))))
+ (setq value (split-string value separator))
+ (unless quoted
+ (setq value (mapcar #'eshell-convert-to-number value)))))
(cond
((< (length refs) 0)
(error "Invalid array variable index: %s"
(ert-deftest esh-var-test/interp-convert-var-split-indices ()
"Interpolate and convert string variable with indices"
+ ;; Check that numeric forms are converted to numbers.
(let ((eshell-test-value "000 010 020 030 040"))
(should (equal (eshell-test-command-result "echo $eshell-test-value[0]")
0))
(should (equal (eshell-test-command-result "echo $eshell-test-value[0 2]")
- '(0 20)))))
+ '(0 20))))
+ ;; Check that multiline forms are preserved as-is.
+ (let ((eshell-test-value "foo\nbar:baz\n"))
+ (should (equal (eshell-test-command-result "echo $eshell-test-value[: 0]")
+ "foo\nbar"))
+ (should (equal (eshell-test-command-result "echo $eshell-test-value[: 1]")
+ "baz\n"))))
(ert-deftest esh-var-test/interp-convert-quoted-var-number ()
"Interpolate numeric quoted numeric variable"