1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-29 07:58:28 +00:00

Allow splitting strings in Eshell expansions with "plain" strings

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.
This commit is contained in:
Jim Porter 2022-03-01 18:53:42 -08:00 committed by Lars Ingebrigtsen
parent 990f36fa10
commit d72cd4a2b7
3 changed files with 22 additions and 13 deletions

View 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

View 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)))))

View File

@ -84,6 +84,11 @@
(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 ()