all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Jim Porter <jporterbugs@gmail.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 72018@debbugs.gnu.org
Subject: bug#72018: 30.0.60; [PATCH] Don't emit a prompt when a background Eshell process is killed
Date: Wed, 10 Jul 2024 12:55:25 -0700	[thread overview]
Message-ID: <b320e87a-28ed-8f1f-91f9-6fc679bb89b7@gmail.com> (raw)
In-Reply-To: <86y169m9q6.fsf@gnu.org>

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

On 7/10/2024 10:34 AM, Eli Zaretskii wrote:
>> Date: Wed, 10 Jul 2024 09:16:11 -0700
>> Cc: 72018@debbugs.gnu.org
>> From: Jim Porter <jporterbugs@gmail.com>
>>
>> We want to reset the prompt (this just emits a new command prompt) for
>> foreground commands, but for background commands, we don't need to do
>> anything. Would it be clearer if I inverted the wording in the comment,
>> like, "Don't reset the prompt if the command we just aborted was in the
>> background"?
> 
> I think these subtleties just warrant more detailed comments, and then
> we'll be fine.

How about this?

[-- Attachment #2: 0001-Don-t-emit-a-prompt-in-Eshell-when-a-background-comm.patch --]
[-- Type: text/plain, Size: 3394 bytes --]

From 84fb997a94503e76a65a5b96301d9ff2baac1fc3 Mon Sep 17 00:00:00 2001
From: Jim Porter <jporterbugs@gmail.com>
Date: Tue, 9 Jul 2024 10:45:35 -0700
Subject: [PATCH] Don't emit a prompt in Eshell when a background command is
 killed

* lisp/eshell/esh-cmd.el (eshell-resume-command): Check for
background-ness before resetting the prompt.

* test/lisp/eshell/esh-cmd-tests.el
(esh-cmd-test/background/simple-command): Make the regexp a bit
stricter.
(esh-cmd-test/background/kill): New test.
---
 lisp/eshell/esh-cmd.el            | 11 +++++++++--
 test/lisp/eshell/esh-cmd-tests.el | 14 +++++++++++++-
 2 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/lisp/eshell/esh-cmd.el b/lisp/eshell/esh-cmd.el
index 0b3137127d2..e97e4f6d067 100644
--- a/lisp/eshell/esh-cmd.el
+++ b/lisp/eshell/esh-cmd.el
@@ -1030,6 +1030,9 @@ eshell-resume-command
 PROC is the process that invoked this from its sentinel, and
 STATUS is its status."
   (when proc
+    ;; Iterate over all the commands associated with this process.  Each
+    ;; element is a list of the form (BACKGROUND FORM PROCESSES) (see
+    ;; `eshell-add-command').
     (dolist (command (eshell-commands-for-process proc))
       (unless (seq-some #'eshell-process-active-p (nth 2 command))
         (setf (nth 2 command) nil) ; Clear processes from command.
@@ -1040,8 +1043,12 @@ eshell-resume-command
                  (not (string-match eshell-reset-signals status)))
             (eshell-resume-eval command)
           (eshell-remove-command command)
-          (declare-function eshell-reset "esh-mode" (&optional no-hooks))
-          (eshell-reset))))))
+          ;; Check if the command we just aborted is marked as a
+          ;; background command.  If not, we need to reset the prompt so
+          ;; the user can enter another command.
+          (unless (car command)
+            (declare-function eshell-reset "esh-mode" (&optional no-hooks))
+            (eshell-reset)))))))
 
 (defun eshell-resume-eval (command)
   "Destructively evaluate a COMMAND which may need to be deferred.
diff --git a/test/lisp/eshell/esh-cmd-tests.el b/test/lisp/eshell/esh-cmd-tests.el
index 70e1901c169..d8124a19af6 100644
--- a/test/lisp/eshell/esh-cmd-tests.el
+++ b/test/lisp/eshell/esh-cmd-tests.el
@@ -113,7 +113,7 @@ esh-cmd-test/background/simple-command
     (with-temp-eshell
      (eshell-match-command-output
       (format "*echo hi > #<%s> &" bufname)
-      (rx "[echo" (? ".exe") "] " (+ digit) "\n"))
+      (rx bos "[echo" (? ".exe") "] " (+ digit) "\n"))
      (eshell-wait-for-subprocess t))
     (should (equal (buffer-string) "hi\n"))))
 
@@ -129,6 +129,18 @@ esh-cmd-test/background/subcommand
      (eshell-wait-for-subprocess t))
     (should (equal (buffer-string) "olleh\n"))))
 
+(ert-deftest esh-cmd-test/background/kill ()
+  "Make sure that a background command that gets killed doesn't emit a prompt."
+  (skip-unless (executable-find "sleep"))
+  (let ((background-message (rx bos "[sleep" (? ".exe") "] " (+ digit) "\n")))
+    (with-temp-eshell
+      (eshell-match-command-output "*sleep 10 &" background-message)
+      (kill-process (caar eshell-process-list))
+      (eshell-wait-for-subprocess t)
+      ;; Ensure we didn't emit another prompt after killing the
+      ;; background process.
+      (should (eshell-match-output background-message)))))
+
 \f
 ;; Lisp forms
 
-- 
2.25.1


  reply	other threads:[~2024-07-10 19:55 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-09 18:04 bug#72018: 30.0.60; [PATCH] Don't emit a prompt when a background Eshell process is killed Jim Porter
2024-07-10 11:16 ` Eli Zaretskii
2024-07-10 16:16   ` Jim Porter
2024-07-10 17:34     ` Eli Zaretskii
2024-07-10 19:55       ` Jim Porter [this message]
2024-07-11  4:34         ` Eli Zaretskii
2024-07-11 23:44           ` 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

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

  git send-email \
    --in-reply-to=b320e87a-28ed-8f1f-91f9-6fc679bb89b7@gmail.com \
    --to=jporterbugs@gmail.com \
    --cc=72018@debbugs.gnu.org \
    --cc=eliz@gnu.org \
    /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 external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.