From: Jim Porter Date: Mon, 28 Feb 2022 17:31:22 +0000 (-0800) Subject: Partially revert b03f74e0f2a578b1580e8b1c368665850ee7f808 X-Git-Tag: emacs-28.0.92~19 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=9e257aecc9a3456fb3d66596862d44030f7d76c8;p=emacs.git Partially revert b03f74e0f2a578b1580e8b1c368665850ee7f808 That commit regressed '$' forms in Eshell, due to a limitation/bug in how 'eshell-do-eval' works. This fixes bug#54190. * lisp/eshell/esh-var.el (eshell-parse-variable-ref): Quote a lambda. * test/lisp/eshell/eshell-tests.el (eshell-test/interp-temp-cmd): New test. --- diff --git a/lisp/eshell/esh-var.el b/lisp/eshell/esh-var.el index 145a522516d..081938b4e4a 100644 --- a/lisp/eshell/esh-var.el +++ b/lisp/eshell/esh-var.el @@ -460,8 +460,12 @@ Possible options are: (eshell-as-subcommand ,(eshell-parse-command cmd)) (ignore (nconc eshell-this-command-hook - (list (lambda () - (delete-file ,temp))))) + ;; Quote this lambda; it will be evaluated + ;; by `eshell-do-eval', which requires very + ;; particular forms in order to work + ;; properly. See bug#54190. + (list (function (lambda () + (delete-file ,temp)))))) (quote ,temp))) (goto-char (1+ end))))))) ((eq (char-after) ?\() diff --git a/test/lisp/eshell/eshell-tests.el b/test/lisp/eshell/eshell-tests.el index a9b1e2ab4e8..fe4fba294fd 100644 --- a/test/lisp/eshell/eshell-tests.el +++ b/test/lisp/eshell/eshell-tests.el @@ -130,6 +130,10 @@ e.g. \"{(+ 1 2)} 3\" => 3" "Interpolate Lisp form evaluation" (should (equal (eshell-test-command-result "+ $(+ 1 2) 3") 6))) +(ert-deftest eshell-test/interp-temp-cmd () + "Interpolate command result redirected to temp file" + (should (equal (eshell-test-command-result "cat $") "hi"))) + (ert-deftest eshell-test/interp-concat () "Interpolate and concat command" (should (equal (eshell-test-command-result "+ ${+ 1 2}3 3") 36)))