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.
(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.
(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"))))
(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