From cbf43bb3d9fbb05f6a67d780cb8053ff5e0d700b Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Thu, 3 Mar 2022 09:37:25 -0800 Subject: [PATCH] Improve wording of Eshell variable interpolation code/documentation * lisp/eshell/esh-arg.el (eshell-unescape-inner-double-quote): Rename from 'eshell-parse-inner-double-quote'. * lisp/eshell/esh-var.el (eshell-parse-variable-ref): Use 'eshell-unescape-inner-double-quote' and improve robustness of quoted variable name matching. (eshell-parse-indices): Use 'eshell-unescape-inner-double-quote'. * doc/misc/eshell.texi (Dollars Expansion): Improve wording of subscript notation. --- doc/misc/eshell.texi | 19 ++++++++++--------- lisp/eshell/esh-arg.el | 4 ++-- lisp/eshell/esh-var.el | 14 ++++++++------ 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/doc/misc/eshell.texi b/doc/misc/eshell.texi index 5581e5cd9e..47f8902d5a 100644 --- a/doc/misc/eshell.texi +++ b/doc/misc/eshell.texi @@ -1043,15 +1043,16 @@ Dollars Expansion index. If @var{expr}'s value is a string, it will first be split at whitespace to make it a list. If @var{expr}'s value is an alist (@pxref{Association List Type, Association Lists, , elisp, The Emacs -Lisp Reference Manual}), this will call @code{assoc} on the result of -@var{expr}, returning the @code{cdr} of the element of the result -whose car is equal to @code{"i"}. Raises an error if the value is not -a sequence (@pxref{Sequences Arrays Vectors, Sequences, , elisp, The -Emacs Lisp Reference Manual}). +Lisp Reference Manual}), this will return the value associated with +the key @code{"i"}. -Multiple sets of indices can also be specified. For example, if -@var{var} is a list of lists, @samp{$@var{var}[0][0]} is equivalent to -@samp{(caar @var{var})}. +Multiple sets of indices can also be specified. For example, if +@var{var} is @samp{((1 2) (3 4))}, then @samp{$@var{var}[0][1]} will +expand to @code{2}. + +Raises an error if the result of @var{expr} is not a string or a +sequence (@pxref{Sequences Arrays Vectors, Sequences, , elisp, The +Emacs Lisp Reference Manual}.) @item $@var{expr}[@var{regexp} @var{i...}] As above (when @var{expr} expands to a string), but use @var{regexp} @@ -1064,7 +1065,7 @@ Dollars Expansion one of the above forms. For example, @samp{$#@var{var}} returns the length of the variable @var{var} and @samp{$#@var{var}[0]} returns the length of the first element of @var{var}. Again, raises an error if -the result of @var{expr} is not a sequence. +the result of @var{expr} is not a string or a sequence. @end table diff --git a/lisp/eshell/esh-arg.el b/lisp/eshell/esh-arg.el index e19481c4ba..a3c961f546 100644 --- a/lisp/eshell/esh-arg.el +++ b/lisp/eshell/esh-arg.el @@ -354,8 +354,8 @@ eshell-parse-double-quote (list 'eshell-escape-arg arg)))) (goto-char (1+ end))))))) -(defun eshell-parse-inner-double-quote (bound) - "Parse the inner part of a double quoted string. +(defun eshell-unescape-inner-double-quote (bound) + "Unescape the inner part of a double quoted string. The string to parse starts at point and ends at BOUND. If Eshell is currently parsing a quoted string and there are any diff --git a/lisp/eshell/esh-var.el b/lisp/eshell/esh-var.el index af89e35f55..8746f2bb93 100644 --- a/lisp/eshell/esh-var.el +++ b/lisp/eshell/esh-var.el @@ -437,7 +437,7 @@ eshell-parse-variable-ref `(eshell-convert (eshell-command-to-value (eshell-as-subcommand - ,(let ((subcmd (or (eshell-parse-inner-double-quote end) + ,(let ((subcmd (or (eshell-unescape-inner-double-quote end) (cons (point) end))) (eshell-current-quoted nil)) (eshell-parse-command subcmd))))) @@ -470,13 +470,15 @@ eshell-parse-variable-ref (condition-case nil `(eshell-command-to-value (eshell-lisp-command - ',(read (or (eshell-parse-inner-double-quote (point-max)) + ',(read (or (eshell-unescape-inner-double-quote (point-max)) (current-buffer))))) (end-of-file (throw 'eshell-incomplete ?\()))) - ((looking-at (rx (or "'" "\"" "\\\""))) - (eshell-with-temp-command (or (eshell-parse-inner-double-quote (point-max)) - (cons (point) (point-max))) + ((looking-at (rx-to-string + `(or "'" ,(if eshell-current-quoted "\\\"" "\"")))) + (eshell-with-temp-command + (or (eshell-unescape-inner-double-quote (point-max)) + (cons (point) (point-max))) (let ((name (if (eq (char-after) ?\') (eshell-parse-literal-quote) (eshell-parse-double-quote)))) @@ -506,7 +508,7 @@ eshell-parse-indices (if (not end) (throw 'eshell-incomplete ?\[) (forward-char) - (eshell-with-temp-command (or (eshell-parse-inner-double-quote end) + (eshell-with-temp-command (or (eshell-unescape-inner-double-quote end) (cons (point) end)) (let (eshell-glob-function (eshell-current-quoted nil)) (setq indices (cons (eshell-parse-arguments -- 2.25.1