1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 10:30:25 -08:00

Handle escaped characters in Eshell special references (e.g. buffers)

* lisp/eshell/esh-arg.el (eshell-parse-special-reference): Unescape
escaped characters.

* test/lisp/eshell/eshell-tests-helpers.el (with-temp-eshell): Restore
current buffer after evaluating BODY.

* test/lisp/eshell/eshell-tests.el (eshell-test/redirect-buffer)
(eshell-test/redirect-buffer-escaped): New tests (bug#55204).
This commit is contained in:
Jim Porter 2022-04-26 21:53:00 -07:00 committed by Lars Ingebrigtsen
parent bb40507fed
commit 32ab756d82
3 changed files with 34 additions and 12 deletions

View file

@ -401,7 +401,9 @@ If the form has no `type', the syntax is parsed as if `type' were
(if (eshell-arg-delimiter (1+ end))
(prog1
(list (if buffer-p 'get-buffer-create 'get-process)
(buffer-substring-no-properties (point) end))
(replace-regexp-in-string
(rx "\\" (group (or "\\" "<" ">"))) "\\1"
(buffer-substring-no-properties (point) end)))
(goto-char (1+ end)))
(ignore (goto-char here)))))))

View file

@ -38,17 +38,18 @@ See `eshell-wait-for-subprocess'.")
(defmacro with-temp-eshell (&rest body)
"Evaluate BODY in a temporary Eshell buffer."
`(ert-with-temp-directory eshell-directory-name
(let* (;; We want no history file, so prevent Eshell from falling
;; back on $HISTFILE.
(process-environment (cons "HISTFILE" process-environment))
(eshell-history-file-name nil)
(eshell-buffer (eshell t)))
(unwind-protect
(with-current-buffer eshell-buffer
,@body)
(let (kill-buffer-query-functions)
(kill-buffer eshell-buffer))))))
`(save-current-buffer
(ert-with-temp-directory eshell-directory-name
(let* (;; We want no history file, so prevent Eshell from falling
;; back on $HISTFILE.
(process-environment (cons "HISTFILE" process-environment))
(eshell-history-file-name nil)
(eshell-buffer (eshell t)))
(unwind-protect
(with-current-buffer eshell-buffer
,@body)
(let (kill-buffer-query-functions)
(kill-buffer eshell-buffer)))))))
(defun eshell-wait-for-subprocess (&optional all)
"Wait until there is no interactive subprocess running in Eshell.

View file

@ -114,6 +114,25 @@ e.g. \"{(+ 1 2)} 3\" => 3"
(eshell-wait-for-subprocess)
(eshell-match-result "OLLEH\n")))
(ert-deftest eshell-test/redirect-buffer ()
"Check that piping to a buffer works"
(with-temp-buffer
(rename-buffer "eshell-temp-buffer" t)
(let ((bufname (buffer-name)))
(with-temp-eshell
(eshell-insert-command (format "echo hi > #<%s>" bufname)))
(should (equal (buffer-string) "hi")))))
(ert-deftest eshell-test/redirect-buffer-escaped ()
"Check that piping to a buffer with escaped characters works"
(with-temp-buffer
(rename-buffer "eshell\\temp\\buffer" t)
(let ((bufname (buffer-name)))
(with-temp-eshell
(eshell-insert-command (format "echo hi > #<%s>"
(string-replace "\\" "\\\\" bufname))))
(should (equal (buffer-string) "hi")))))
(ert-deftest eshell-test/inside-emacs-var ()
"Test presence of \"INSIDE_EMACS\" in subprocesses"
(with-temp-eshell