Subject: bug#61602: [PATCH]: comint-mode redirection

From: Rah Guzar <[email-masked]>
Date: Thu, 11 May 2023 19:45:09 +0200

Dear Emacs Maintainers,
   A while back I sent a patch that addresses the points in this bug report. I have since received the confirmation that I have completed the copyright paperwork, so I am bringing it to your attention again. This is my first time contributing so please let me know if I should do somethings differently or if changes are needed.

Thanks,
Rah Guzar

diff --git a/lisp/comint.el b/lisp/comint.el
index 682b555a33c..98f4d315d64 100644
--- a/lisp/comint.el
+++ b/lisp/comint.el
@@ -161,7 +161,10 @@ comint-prompt-regexp
 Defaults to \"^\", the null string at BOL.
 
 This variable is only used if the variable
-`comint-use-prompt-regexp' is non-nil.
+`comint-use-prompt-regexp' is non-nil.  The exception to
+this is redirection.  Many commands including
+`comint-redirect-send-command-to-process' use it as
+`comint-redirect-finished-regexp'.
 
 Good choices:
   Canonical Lisp: \"^[^> \\n]*>+:? *\" (Lucid, franz, kcl, T, cscheme, oaklisp)
@@ -3637,7 +3640,12 @@ comint-redirect-output-buffer
 (defvar comint-redirect-finished-regexp nil
   "Regular expression that determines when to stop redirection in Comint.
 When the redirection filter function is given output that matches this regexp,
-the output is inserted as usual, and redirection is completed.")
+the output is inserted as usual, and redirection is completed.
+This is an internal variable set by `comint-redirect-setup' and setting it
+directly has no effect.")
+
+(defvar comint-redirect-hook nil
+  "Hook run when a redirection finishes.")
 
 (defvar comint-redirect-insert-matching-regexp nil
   "If non-nil, the text that ends a redirection is included in it.
@@ -3833,11 +3841,13 @@ comint-redirect-send-command
 
 ;;;###autoload
 (defun comint-redirect-send-command-to-process
-  (command output-buffer process echo &optional no-display)
+  (command output-buffer process echo &optional no-display finished-regexp)
   "Send COMMAND to PROCESS, with output to OUTPUT-BUFFER.
 With prefix arg, echo output in process buffer.
 
-If NO-DISPLAY is non-nil, do not show the output buffer."
+If NO-DISPLAY is non-nil, do not show the output buffer.
+If FINISHED-REGEXP is non-nil it is used as `comint-redirect-finished-regexp'
+instead of `comint-prompt-regexp'."
   (interactive "sCommand: \nBOutput Buffer: \nbProcess Buffer: \nP")
   (let* (;; The process buffer
 	 (process-buffer (if (processp process)
@@ -3858,7 +3868,7 @@ comint-redirect-send-command-to-process
       (comint-redirect-setup
        output-buffer
        (current-buffer)                 ; Comint Buffer
-       comint-prompt-regexp             ; Finished Regexp
+       (or finished-regexp comint-prompt-regexp)             ; Finished Regexp
        echo)                            ; Echo input
 
       ;; Set the filter.