Don't queue input

* eat.el (eat--pending-input-chunks)
(eat--defer-input-processing, eat--process-input-queue-timer):
Remove.
All references updated.
* eat.el (eat--send-input): Send the input immediately.
* eat.el (eat--process-input-queue): Remove.
* eat.el (eat--eshell-process-output-queue)
(eat--process-output-queue): Loop while output queue isn't
empty, set 'eat--output-queue-first-chunk-time' to 't' in the
loop.
* eat.el (eat--filter, eat--eshell-filter): Don't start a timer
if 'eat--output-queue-first-chunk-time' is 't'.
This commit is contained in:
Akib Azmain Turja 2023-10-26 13:58:24 +06:00
parent c890bb240b
commit 440b816f8e
No known key found for this signature in database
GPG key ID: 5535FCF54D88616B

133
eat.el
View file

@ -6598,9 +6598,6 @@ END if it's safe to do so."
isearch-search-fun-function
isearch-wrap-function
isearch-push-state-function
eat--pending-input-chunks
eat--process-input-queue-timer
eat--defer-input-processing
eat--pending-output-chunks
eat--output-queue-first-chunk-time
eat--process-output-queue-timer
@ -6732,17 +6729,6 @@ The output chunks are pushed, so last output appears first.")
(defvar eat--process-output-queue-timer nil
"Timer to process output queue.")
(defvar eat--pending-input-chunks nil
"The list of pending input chunks.
The input chunks are pushed, so last input appears first.")
(defvar eat--process-input-queue-timer nil
"Timer to process input queue.")
(defvar eat--defer-input-processing nil
"Non-nil meaning process input later.")
(defvar eat--shell-prompt-annotation-correction-timer nil
"Timer to correct shell prompt annotations.")
@ -6772,30 +6758,9 @@ OS's."
(defun eat--send-input (_ input)
"Send INPUT to subprocess."
(push input eat--pending-input-chunks)
(unless eat--process-input-queue-timer
(setq eat--process-input-queue-timer
(run-with-idle-timer 0 nil #'eat--process-input-queue
(current-buffer)))))
(defun eat--process-input-queue (buffer)
"Process the input queue on BUFFER."
(when (buffer-live-p buffer)
(with-current-buffer buffer
;; We don't want to recurse this function.
(unless eat--defer-input-processing
(let ((inhibit-quit t) ; Don't disturb!
(eat--defer-input-processing t)
(when-let* ((eat-terminal)
(proc (eat-term-parameter eat-terminal 'eat--process)))
(when (process-live-p proc)
(while eat--pending-input-chunks
(let ((chunks (nreverse eat--pending-input-chunks)))
(setq eat--pending-input-chunks nil)
(dolist (str chunks)
(eat--send-string proc str)))))))
(when eat--process-input-queue-timer
(cancel-timer eat--process-input-queue-timer))
(setq eat--process-input-queue-timer nil))))
(eat--send-string proc input)))
(defun eat--process-output-queue (buffer)
"Process the output queue on BUFFER."
@ -6813,10 +6778,12 @@ OS's."
(when eat--process-output-queue-timer
(cancel-timer eat--process-output-queue-timer))
(setq eat--output-queue-first-chunk-time nil)
(let ((queue eat--pending-output-chunks))
(setq eat--pending-output-chunks nil)
(dolist (output (nreverse queue))
(eat-term-process-output eat-terminal output)))
(while eat--pending-output-chunks
(let ((queue eat--pending-output-chunks)
(eat--output-queue-first-chunk-time t))
(setq eat--pending-output-chunks nil)
(dolist (output (nreverse queue))
(eat-term-process-output eat-terminal output))))
(eat-term-redisplay eat-terminal)
;; Truncate output of previous dead processes.
(when (and eat-term-scrollback-size
@ -6853,17 +6820,19 @@ OS's."
(unless eat--output-queue-first-chunk-time
(setq eat--output-queue-first-chunk-time (current-time)))
(push output eat--pending-output-chunks)
(let ((time-left
(- eat-maximum-latency
(float-time
(time-subtract
nil eat--output-queue-first-chunk-time)))))
(if (<= time-left 0)
(eat--process-output-queue (current-buffer))
(setq eat--process-output-queue-timer
(run-with-timer
(min time-left eat-minimum-latency) nil
#'eat--process-output-queue (current-buffer))))))))
(unless (eq eat--output-queue-first-chunk-time t)
(let ((time-left
(- eat-maximum-latency
(float-time
(time-subtract
nil eat--output-queue-first-chunk-time)))))
(if (<= time-left 0)
(eat--process-output-queue (current-buffer))
(setq eat--process-output-queue-timer
(run-with-timer
(min time-left eat-minimum-latency) nil
#'eat--process-output-queue
(current-buffer)))))))))
(defun eat--sentinel (process message)
"Sentinel for Eat buffers.
@ -7415,20 +7384,22 @@ PROGRAM can be a shell command."
(when eat--process-output-queue-timer
(cancel-timer eat--process-output-queue-timer))
(setq eat--output-queue-first-chunk-time nil)
(let ((queue eat--pending-output-chunks))
(setq eat--pending-output-chunks nil)
(if (eval-when-compile (< emacs-major-version 27))
(eshell-output-filter
process (string-join (nreverse queue)))
(combine-change-calls
(eat-term-beginning eat-terminal)
(eat-term-end eat-terminal)
;; TODO: Is `string-join' OK or should we use a loop?
(if (eval-when-compile (< emacs-major-version 30))
(eshell-output-filter
process (string-join (nreverse queue)))
(eshell-interactive-process-filter
process (string-join (nreverse queue))))))))))
(while eat--pending-output-chunks
(let ((queue eat--pending-output-chunks)
(eat--output-queue-first-chunk-time t))
(setq eat--pending-output-chunks nil)
(if (eval-when-compile (< emacs-major-version 27))
(eshell-output-filter
process (string-join (nreverse queue)))
(combine-change-calls
(eat-term-beginning eat-terminal)
(eat-term-end eat-terminal)
;; TODO: Is `string-join' OK or should we use a loop?
(if (eval-when-compile (< emacs-major-version 30))
(eshell-output-filter
process (string-join (nreverse queue)))
(eshell-interactive-process-filter
process (string-join (nreverse queue)))))))))))
(defun eat--eshell-filter (process string)
"Process output STRING from PROCESS."
@ -7439,19 +7410,20 @@ PROGRAM can be a shell command."
(unless eat--output-queue-first-chunk-time
(setq eat--output-queue-first-chunk-time (current-time)))
(push string eat--pending-output-chunks)
(let ((time-left
(- eat-maximum-latency
(float-time
(time-subtract
nil eat--output-queue-first-chunk-time)))))
(if (<= time-left 0)
(eat--eshell-process-output-queue
process (current-buffer))
(setq eat--process-output-queue-timer
(run-with-timer
(min time-left eat-minimum-latency) nil
#'eat--eshell-process-output-queue process
(current-buffer))))))))
(unless (eq eat--output-queue-first-chunk-time t)
(let ((time-left
(- eat-maximum-latency
(float-time
(time-subtract
nil eat--output-queue-first-chunk-time)))))
(if (<= time-left 0)
(eat--eshell-process-output-queue
process (current-buffer))
(setq eat--process-output-queue-timer
(run-with-timer
(min time-left eat-minimum-latency) nil
#'eat--eshell-process-output-queue process
(current-buffer)))))))))
(declare-function eshell-sentinel "esh-proc" (proc string))
@ -7586,9 +7558,6 @@ symbol `buffer', in which case the point of current buffer is set."
eat-terminal
eat--synchronize-scroll-function
eat--mouse-grabbing-type
eat--pending-input-chunks
eat--process-input-queue-timer
eat--defer-input-processing
eat--pending-output-chunks
eat--output-queue-first-chunk-time
eat--process-output-queue-timer