]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow splitting strings in Eshell expansions with "plain" strings
authorJim Porter <jporterbugs@gmail.com>
Wed, 2 Mar 2022 02:53:42 +0000 (18:53 -0800)
committerLars Ingebrigtsen <larsi@gnus.org>
Thu, 3 Mar 2022 13:59:33 +0000 (14:59 +0100)
Since '$var[hello 0]' doesn't make sense when 'var' is a string, the
previous restriction was unnecessary.

* lisp/eshell/esh-var.el (Commentary): Update documentation.
(eshell-apply-indices): Allow "plain" strings to split strings.

* test/lisp/eshell/esh-var-test.el
(esh-var-test/interp-var-string-split-indices)
(esh-var-test/quoted-interp-var-string-split-indices): Update tests.

* doc/misc/eshell.texi (Dollars expansion): Update documentation.

doc/misc/eshell.texi
lisp/eshell/esh-var.el
test/lisp/eshell/esh-var-tests.el

index 3301a854eb9befc6a1881a225347e269cd722381..5581e5cd9ee3abae21a3364e62ee391c4ffb147d 100644 (file)
@@ -1055,9 +1055,9 @@ Multiple sets of indices can also be specified. For example, if
 
 @item $@var{expr}[@var{regexp} @var{i...}]
 As above (when @var{expr} expands to a string), but use @var{regexp}
-to split the string.  @var{regexp} can be any form other than a number
-or a plain variable name.  For example, @samp{$@var{var}[: 0]} will
-return the first element of a colon-delimited string.
+to split the string.  @var{regexp} can be any form other than a
+number.  For example, @samp{$@var{var}[: 0]} will return the first
+element of a colon-delimited string.
 
 @item $#@var{expr}
 Expands to the length of the result of @var{expr}, an expression in
index 6f08a3fbc45b8208347f170639e2c4f5a244b7b8..af89e35f553ccb4a0ad08b5ba85d922140d7fca5 100644 (file)
@@ -74,9 +74,8 @@
 ;;   $EXPR["\\\\" 10]
 ;;
 ;; Separate on backslash characters.  Actually, the first argument --
-;; if it doesn't have the form of a number, or a plain variable name
-;; -- can be any regular expression.  So to split on numbers, use
-;; '$EXPR["[0-9]+" 10 20]'.
+;; if it doesn't have the form of a number -- can be any regular
+;; expression.  So to split on numbers, use '$EXPR["[0-9]+" 10 20]'.
 ;;
 ;;   $EXPR[hello]
 ;;
@@ -566,13 +565,11 @@ For example, to retrieve the second element of a user's record in
   (while indices
     (let ((refs (car indices)))
       (when (stringp value)
-       (let (separator)
-         (if (not (or (not (stringp (caar indices)))
-                      (string-match
-                       (concat "^" eshell-variable-name-regexp "$")
-                       (caar indices))))
-             (setq separator (caar indices)
-                   refs (cdr refs)))
+       (let (separator (index (caar indices)))
+          (when (and (stringp index)
+                     (not (get-text-property 0 'number index)))
+            (setq separator index
+                  refs (cdr refs)))
          (setq value
                (mapcar #'eshell-convert
                        (split-string value separator)))))
index e679174939bfe65efaab0abd7029e585001521a8..d09dd614de841859f157d39b5bf31284f652fd32 100644 (file)
     (should (equal (eshell-test-command-result "echo $eshell-test-value[: 0]")
                    "zero"))
     (should (equal (eshell-test-command-result "echo $eshell-test-value[: 0 2]")
+                   '("zero" "two"))))
+  (let ((eshell-test-value "zeroXoneXtwoXthreeXfour"))
+    (should (equal (eshell-test-command-result "echo $eshell-test-value[X 0]")
+                   "zero"))
+    (should (equal (eshell-test-command-result "echo $eshell-test-value[X 0 2]")
                    '("zero" "two")))))
 
 (ert-deftest esh-var-test/interp-var-regexp-split-indices ()
@@ -216,6 +221,13 @@ inside double-quotes"
                    "zero"))
     (should (equal (eshell-test-command-result
                     "echo \"$eshell-test-value[: 0 2]\"")
+                   '("zero" "two"))))
+  (let ((eshell-test-value "zeroXoneXtwoXthreeXfour"))
+    (should (equal (eshell-test-command-result
+                    "echo \"$eshell-test-value[X 0]\"")
+                   "zero"))
+    (should (equal (eshell-test-command-result
+                    "echo \"$eshell-test-value[X 0 2]\"")
                    '("zero" "two")))))
 
 (ert-deftest esh-var-test/quoted-interp-var-regexp-split-indices ()