]> git.eshelyaron.com Git - emacs.git/commitdiff
Don't split Eshell expansions by line when using split-subscript operator
authorJim Porter <jporterbugs@gmail.com>
Tue, 7 Jun 2022 02:53:39 +0000 (19:53 -0700)
committerLars Ingebrigtsen <larsi@gnus.org>
Wed, 8 Jun 2022 12:10:55 +0000 (14:10 +0200)
* lisp/eshell/esh-var.el (eshell-apply-indices): Use
'eshell-convert-to-number' instead of 'eshell-convert'.

* test/lisp/eshell/esh-var-tests.el
(esh-var-test/interp-convert-var-split-indices): Expand test
(bug#55838).

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

index 186f6358bca52eb748587e15c7f9f0793ba314bd..27be6e1b1a8cc551f2be1b4ebd9be4023a64bbca 100644 (file)
@@ -582,10 +582,11 @@ Otherwise, each INT-OR-NAME refers to an element of the list value.
 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:
@@ -599,9 +600,9 @@ For example, to retrieve the second element of a user's record in
                      (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"
index 4e2a18861e50692752aef8fa6881989c45ef731b..072cdb9b40cbf3aa0206bee096004441805d1b74 100644 (file)
@@ -357,11 +357,18 @@ inside double-quotes"
 
 (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"