diff --git a/eat.el b/eat.el index 10affab..49599d0 100644 --- a/eat.el +++ b/eat.el @@ -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)