Send input to correct process in Eshell pipeline

* eat.el (eat--process): Remove.
* eat.el (eat-mode): Don't make 'eat--process' buffer-local.
Use 'eat--terminal' to determine whether terminal is live.
* eat.el (eat--eshell-set-input-process): New function.
* eat.el (eat--eshell-local-mode): Don't make 'eat--process'
buffer-local.  Add 'eat--eshell-set-input-process' as a advice
after 'eshell-resume-eval'.
* eat.el (eat-exec): Use the terminal parameters
'eat--process', 'eat--input-process' and 'eat--output-process'
instead of the buffer-local variable 'eat--process' store the
process object.
* eat.el (eat--sentinel): Don't set 'eat--process' to nil.
* eat.el (eat--eshell-setup-proc-and-term): Set the terminal
parameters instead of buffer-local 'eat--process'.
* eat.el (eat--pre-prompt, eat--pre-cmd, eat-kill-process, eat)
(eat--send-input, eat--trace-eshell-adjust-make-process-args)
(eat--eshell-cleanup, eat--eshell-output-filter): Get the
process from terminal parameter.
This commit is contained in:
Akib Azmain Turja 2023-03-20 23:54:33 +06:00
parent d7034f5ab5
commit 532f7221b7
No known key found for this signature in database
GPG key ID: 5535FCF54D88616B

87
eat.el
View file

@ -4582,8 +4582,8 @@ If HOST isn't the host Emacs is running on, don't do anything."
(setq eat--shell-prompt-begin (point-marker))
;; FIXME: It's a crime to touch processes in this section.
(when (eq eat-query-before-killing-running-terminal 'auto)
(when (bound-and-true-p eat--process)
(set-process-query-on-exit-flag eat--process nil))))
(set-process-query-on-exit-flag
(eat-term-parameter eat--terminal 'eat--process) nil)))
(defun eat--post-prompt (_)
"Put a mark in the marginal area on current line."
@ -4687,8 +4687,8 @@ BUFFER is the terminal buffer."
"Update shell prompt mark to indicate command is running."
;; FIXME: It's a crime to touch processes in this section.
(when (eq eat-query-before-killing-running-terminal 'auto)
(when (bound-and-true-p eat--process)
(set-process-query-on-exit-flag eat--process t)))
(set-process-query-on-exit-flag
(eat-term-parameter eat--terminal 'eat--process) t))
(when (and eat-enable-shell-prompt-annotation
eat--shell-prompt-mark)
(setf (cadr eat--shell-prompt-mark)
@ -5152,7 +5152,6 @@ END if it's safe to do so."
cursor-type
track-mouse
eat--terminal
eat--process
eat--synchronize-scroll-function
eat--mouse-grabbing-type
eat--shell-command-status
@ -5173,7 +5172,7 @@ END if it's safe to do so."
(setq mode-line-process
'(""
(:eval
(when eat--process
(when eat--terminal
(cond
(eat--semi-char-mode
'("["
@ -5257,9 +5256,6 @@ mouse-3: Switch to char mode"
;;;;; Process Handling.
(defvar eat--process nil
"The running process.")
(defvar eat--pending-output-chunks nil
"The list of pending output chunks.
@ -5277,8 +5273,9 @@ The output chunks are pushed, so last output appears first.")
(defun eat-kill-process ()
"Kill Eat process in current buffer."
(interactive)
(when eat--process
(kill-process eat--process)))
(when-let* ((eat--terminal)
(proc (eat-term-parameter eat--terminal 'eat--process)))
(delete-process proc)))
(defun eat--send-string (process string)
"Send to PROCESS the contents of STRING as input.
@ -5299,8 +5296,9 @@ OS's."
(defun eat--send-input (_ input)
"Send INPUT to subprocess."
(when eat--process
(eat--send-string eat--process input)))
(when-let* ((eat--terminal)
(proc (eat-term-parameter eat--terminal 'eat--process)))
(eat--send-string proc input)))
(defun eat--process-output-queue (buffer)
"Process the output queue on BUFFER."
@ -5385,7 +5383,6 @@ to it."
(setq eat--shell-prompt-mark nil)
(setq eat--shell-prompt-mark-overlays nil))
(eat-emacs-mode)
(setq eat--process nil)
(delete-process process)
(eat-term-delete eat--terminal)
(setq eat--terminal nil)
@ -5424,9 +5421,11 @@ mode. You can use this to cheaply run a series of processes in the
same Eat buffer. The hook `eat-exec-hook' is run after each exec."
(with-current-buffer buffer
(let ((inhibit-read-only t))
(when eat--process
(when-let*
((eat--terminal)
(proc (eat-term-parameter eat--terminal 'eat--process)))
(let ((eat-kill-buffer-on-exit nil))
(delete-process eat--process)))
(delete-process proc)))
;; Ensure final newline.
(goto-char (point-max))
(unless (or (= (point-min) (point-max))
@ -5493,14 +5492,19 @@ same Eat buffer. The hook `eat-exec-hook' is run after each exec."
;; Jump to the end, and set the process mark.
(goto-char (point-max))
(set-marker (process-mark process) (point))
(setq eat--process process)
(setf (eat-term-parameter eat--terminal 'eat--process)
process)
(setf (eat-term-parameter eat--terminal 'eat--input-process)
process)
(setf (eat-term-parameter eat--terminal 'eat--output-process)
process)
;; Feed it the startfile.
(when startfile
;;This is guaranteed to wait long enough
;;but has bad results if the shell does not prompt at all
;; (while (= size (buffer-size))
;; (sleep-for 1))
;;I hope 1 second is enough!
;; This is guaranteed to wait long enough
;; but has bad results if the shell does not prompt at all
;; (while (= size (buffer-size))
;; (sleep-for 1))
;; I hope 1 second is enough!
(sleep-for 1)
(goto-char (point-max))
(insert-file-contents startfile)
@ -5567,7 +5571,8 @@ PROGRAM can be a shell command."
(unless (eq major-mode #'eat-mode)
(eat-mode))
(pop-to-buffer-same-window buffer)
(unless eat--process
(unless (and eat--terminal
(eat-term-parameter eat--terminal 'eat--process))
(eat-exec buffer (buffer-name) "/usr/bin/env" nil
(list "sh" "-c" program)))
buffer)))
@ -5697,6 +5702,8 @@ PROGRAM can be a shell command."
(defvar eshell-last-output-start) ; In `esh-mode'.
(defvar eshell-last-output-end) ; In `esh-mode'.
(declare-function eshell-head-process "esh-cmd" ())
(declare-function eshell-resume-eval "esh-cmd" ())
(defun eat--eshell-term-name (&rest _)
"Return the value of `TERM' environment variable for Eshell."
@ -5717,12 +5724,13 @@ PROGRAM can be a shell command."
(let ((end (eat-term-end eat--terminal)))
(set-marker eshell-last-output-start end)
(set-marker eshell-last-output-end end)
(set-marker (process-mark eat--process) end))))
(set-marker (process-mark (eat-term-parameter
eat--terminal 'eat--output-process))
end))))
(defun eat--eshell-setup-proc-and-term (proc)
"Setup process PROC and a new terminal for it."
(unless (or eat--terminal eat--process)
(setq eat--process proc)
(unless eat--terminal
(process-put proc 'adjust-window-size-function
#'eat--adjust-process-window-size)
(setq eat--terminal (eat-term-make (current-buffer)
@ -5738,6 +5746,9 @@ PROGRAM can be a shell command."
(setf (eat-term-ring-bell-function eat--terminal) #'eat--bell)
(setf (eat-term-set-cwd-function eat--terminal) #'eat--set-cwd)
(setf (eat-term-set-cmd-function eat--terminal) #'eat--set-cmd)
(setf (eat-term-parameter eat--terminal 'eat--process) proc)
(setf (eat-term-parameter eat--terminal 'eat--output-process)
proc)
(when-let* ((window (get-buffer-window nil t)))
(with-selected-window window
(eat-term-resize eat--terminal (window-max-chars-per-line)
@ -5762,9 +5773,10 @@ PROGRAM can be a shell command."
(set-marker eshell-last-output-end (point))
(eat--cursor-blink-mode -1)
(eat--grab-mouse nil nil)
(set-process-filter (eat-term-parameter
eat--terminal 'eat--output-process)
#'eshell-output-filter)
(eat-term-delete eat--terminal)
(set-process-filter eat--process #'eshell-output-filter)
(setq eat--process nil)
(setq eat--terminal nil)
(kill-local-variable 'eshell-output-filter-functions)
(eat--eshell-semi-char-mode -1)
@ -5903,6 +5915,12 @@ sane 2>%s ; if [ $1 = .. ]; then shift; fi; exec \"$@\""
(funcall fn command args))))
(remove-hook 'eshell-exec-hook hook)))))
(defun eat--eshell-set-input-process ()
"Set the process that gets user input."
(when eat--terminal
(setf (eat-term-parameter eat--terminal 'eat--input-process)
(eshell-head-process))))
;;;;; Minor Modes.
@ -5946,7 +5964,6 @@ symbol `buffer', in which case the point of current buffer is set."
track-mouse
filter-buffer-substring-function
eat--terminal
eat--process
eat--synchronize-scroll-function
eat--mouse-grabbing-type
eat--pending-output-chunks
@ -6064,7 +6081,9 @@ symbol `buffer', in which case the point of current buffer is set."
eat-term-shell-integration-directory t)
,@eshell-variable-aliases-list))
(advice-add #'eshell-gather-process-output :around
#'eat--eshell-adjust-make-process-args))
#'eat--eshell-adjust-make-process-args)
(advice-add #'eshell-resume-eval :after
#'eat--eshell-set-input-process))
(t
(let ((buffers nil))
(setq eat-eshell-mode t)
@ -6095,7 +6114,9 @@ symbol `buffer', in which case the point of current buffer is set."
("INSIDE_EMACS" eat-term-inside-emacs t))))
eshell-variable-aliases-list))
(advice-remove #'eshell-gather-process-output
#'eat--eshell-adjust-make-process-args))))
#'eat--eshell-adjust-make-process-args)
(advice-remove #'eshell-resume-eval
#'eat--eshell-set-input-process))))
;;;; Eshell Visual Command Handling.
@ -6363,7 +6384,9 @@ see."
(let ((time (current-time)))
(prog1
(funcall eat--eshell-setup-proc-and-term proc)
(when (eq eat--process proc)
(when (eq (eat-term-parameter
eat--terminal 'eat--output-process)
proc)
(let ((buf (generate-new-buffer
(format "*eat-trace %s*: %s"
(buffer-name)