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:
parent
c890bb240b
commit
440b816f8e
1 changed files with 51 additions and 82 deletions
133
eat.el
133
eat.el
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue