unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Jim Porter <jporterbugs@gmail.com>
To: Morgan Smith <Morgan.J.Smith@outlook.com>, 61310@debbugs.gnu.org
Subject: bug#61310: Eshell modifying and running output regression
Date: Sun, 5 Feb 2023 21:59:07 -0800	[thread overview]
Message-ID: <91f958e5-1f95-647a-2524-1cd87aa10e46@gmail.com> (raw)
In-Reply-To: <8ab1105d-539a-d268-f891-268f18890aa1@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 267 bytes --]

On 2/5/2023 9:51 PM, Jim Porter wrote:
> So instead, let's make the output field sticky as you say. Here's a fix 
> for that plus regression tests so this won't break in the future.

... and here's a fixed patch that un-breaks a couple other Eshell 
regression tests.

[-- Attachment #2: 0001-Ensure-that-Eshell-users-can-run-lines-of-command-ou.patch --]
[-- Type: text/plain, Size: 6567 bytes --]

From a754e711e21cd306e7c4307d8f86819b6e8c672c Mon Sep 17 00:00:00 2001
From: Jim Porter <jporterbugs@gmail.com>
Date: Sun, 5 Feb 2023 21:37:08 -0800
Subject: [PATCH] Ensure that Eshell users can run lines of command output as
 input

Previously, this failed to work properly because any additional input
the user entered would have no 'field' property, confusing
'eshell-get-old-input'.  To fix this, we simply ensure that any
user-entered text in the output field retains said output field
(bug#61310).

* lisp/eshell/esh-util.el (eshell-command-output-properties): New
variable...
* lisp/eshell/esh-proc.el (eshell-interactive-process-filter):
* lisp/eshell/esh-mode.el (eshell-interactive-print): ... use it.
(eshell-get-old-input): Remove properties from the returned string
just to be safe.

* test/lisp/eshell/eshell-tests.el (eshell-test-value): New variable.
(eshell-test/get-old-input/rerun-command)
(eshell-test/get-old-input/run-output): New tests.

* test/lisp/eshell/em-prompt-tests.el
(em-prompt-test/field-properties)
(em-prompt-test/field-properties/no-highlight): Check for new
'front-sticky' property on output.
---
 lisp/eshell/esh-mode.el             |  5 ++---
 lisp/eshell/esh-proc.el             |  4 ++--
 lisp/eshell/esh-util.el             |  4 ++++
 test/lisp/eshell/em-prompt-tests.el |  6 ++++--
 test/lisp/eshell/eshell-tests.el    | 28 ++++++++++++++++++++++++++++
 5 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/lisp/eshell/esh-mode.el b/lisp/eshell/esh-mode.el
index 503d9ba1b63..e7ccf2b3aef 100644
--- a/lisp/eshell/esh-mode.el
+++ b/lisp/eshell/esh-mode.el
@@ -526,8 +526,7 @@ eshell-interactive-print
   "Print STRING to the eshell display buffer."
   (when string
     (add-text-properties 0 (length string)
-                         '(field command-output rear-nonsticky (field))
-                         string)
+                         eshell-command-output-properties string)
     (eshell-interactive-filter nil string)))
 
 (defsubst eshell-begin-on-new-line ()
@@ -891,7 +890,7 @@ eshell-get-old-input
       (let ((inhibit-field-text-motion)
             (end (point)))
         (beginning-of-line)
-        (buffer-substring (point) end)))))
+        (buffer-substring-no-properties (point) end)))))
 
 (defun eshell-copy-old-input ()
   "Insert after prompt old input at point as new input to be edited."
diff --git a/lisp/eshell/esh-proc.el b/lisp/eshell/esh-proc.el
index 27cd521e82e..02de619864a 100644
--- a/lisp/eshell/esh-proc.el
+++ b/lisp/eshell/esh-proc.el
@@ -24,6 +24,7 @@
 ;;; Code:
 
 (require 'esh-io)
+(require 'esh-util)
 
 (defgroup eshell-proc nil
   "When Eshell invokes external commands, it always does so
@@ -412,8 +413,7 @@ eshell-interactive-process-filter
 This is done after all necessary filtering has been done."
   (when string
     (add-text-properties 0 (length string)
-                         '(field command-output rear-nonsticky (field))
-                         string)
+                         eshell-command-output-properties string)
     (require 'esh-mode)
     (declare-function eshell-interactive-filter "esh-mode" (buffer string))
     (eshell-interactive-filter (if process (process-buffer process)
diff --git a/lisp/eshell/esh-util.el b/lisp/eshell/esh-util.el
index 9549e7f1a10..fc0aee22f33 100644
--- a/lisp/eshell/esh-util.el
+++ b/lisp/eshell/esh-util.el
@@ -132,6 +132,10 @@ eshell-user-names
 (defvar eshell-user-timestamp nil
   "A timestamp of when the user file was read.")
 
+(defvar eshell-command-output-properties
+  '(field command-output front-sticky (field) rear-nonsticky (field))
+  "A list of text properties to apply to command output.")
+
 ;;; Obsolete variables:
 
 (define-obsolete-variable-alias 'eshell-host-names
diff --git a/test/lisp/eshell/em-prompt-tests.el b/test/lisp/eshell/em-prompt-tests.el
index db45e2ae3a7..c4cdc2dffc5 100644
--- a/test/lisp/eshell/em-prompt-tests.el
+++ b/test/lisp/eshell/em-prompt-tests.el
@@ -54,7 +54,8 @@ em-prompt-test/field-properties
      (should (equal last-input "echo hello\n"))
      (should (equal-including-properties
               last-output
-              (propertize "hello\n" 'rear-nonsticky '(field)
+              (propertize "hello\n" 'front-sticky '(field)
+                          'rear-nonsticky '(field)
                           'field 'command-output))))))
 
 (ert-deftest em-prompt-test/field-properties/no-highlight ()
@@ -77,7 +78,8 @@ em-prompt-test/field-properties/no-highlight
        (should (equal last-input "echo hello\n"))
        (should (equal-including-properties
                 last-output
-                (propertize "hello\n" 'rear-nonsticky '(field)
+                (propertize "hello\n" 'front-sticky '(field)
+                            'rear-nonsticky '(field)
                             'field 'command-output)))))))
 
 (ert-deftest em-prompt-test/next-previous-prompt ()
diff --git a/test/lisp/eshell/eshell-tests.el b/test/lisp/eshell/eshell-tests.el
index 776cfb9b92f..f6a688b1b56 100644
--- a/test/lisp/eshell/eshell-tests.el
+++ b/test/lisp/eshell/eshell-tests.el
@@ -34,6 +34,8 @@
                            (file-name-directory (or load-file-name
                                                     default-directory))))
 
+(defvar eshell-test-value nil)
+
 ;;; Tests:
 
 (ert-deftest eshell-test/pipe-headproc ()
@@ -160,6 +162,32 @@ eshell-test/get-old-input
      (beginning-of-line))
    (should (string= (eshell-get-old-input) "echo alpha"))))
 
+(ert-deftest eshell-test/get-old-input/rerun-command ()
+  "Test that we can rerun an old command when point is on it."
+  (with-temp-eshell
+   (let ((eshell-test-value "first"))
+     (eshell-match-command-output "echo $eshell-test-value" "first"))
+   ;; Go to the previous prompt.
+   (forward-line -2)
+   (let ((inhibit-field-text-motion t))
+     (end-of-line))
+   ;; Rerun the command, but with a different variable value.
+   (let ((eshell-test-value "second"))
+     (eshell-send-input))
+   (eshell-match-output "second")))
+
+(ert-deftest eshell-test/get-old-input/run-output ()
+  "Test that we can run a line of output as a command when point is on it."
+  (with-temp-eshell
+   (eshell-match-command-output "echo \"echo there\"" "echo there")
+   ;; Go to the output, and insert "hello" after "echo".
+   (forward-line -1)
+   (forward-word)
+   (insert-and-inherit " hello")
+   ;; Run the line as a command.
+   (eshell-send-input)
+   (eshell-match-output "(\"hello\" \"there\")")))
+
 (provide 'eshell-tests)
 
 ;;; eshell-tests.el ends here
-- 
2.25.1


  reply	other threads:[~2023-02-06  5:59 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-06  4:18 bug#61310: Eshell modifying and running output regression Morgan Smith
2023-02-06  5:51 ` Jim Porter
2023-02-06  5:59   ` Jim Porter [this message]
2023-02-07 18:20     ` miha--- via Bug reports for GNU Emacs, the Swiss army knife of text editors
2023-02-07 23:37       ` Jim Porter
2023-02-10  6:39         ` Jim Porter
2023-02-24 17:59           ` Jim Porter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=91f958e5-1f95-647a-2524-1cd87aa10e46@gmail.com \
    --to=jporterbugs@gmail.com \
    --cc=61310@debbugs.gnu.org \
    --cc=Morgan.J.Smith@outlook.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).