From d9af04ef829a9a1db2240d3b17c5819e97c5bc56 Mon Sep 17 00:00:00 2001 From: Akib Azmain Turja Date: Tue, 17 Oct 2023 11:27:31 +0600 Subject: [PATCH] Don't mess up terminal when switching to line mode * eat.el (eat--line-mode-enter-auto-1) (eat--line-mode-exit-auto-1): New function. * eat.el (eat--line-mode-enter-auto, eat--line-mode-exit-auto): Do everything after the output is processed. --- eat.el | 57 ++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/eat.el b/eat.el index fc7c68b..b9072bd 100644 --- a/eat.el +++ b/eat.el @@ -5141,32 +5141,47 @@ If HOST isn't the host Emacs is running on, don't do anything." (defvar eat--semi-char-mode) (defvar eat--char-mode) +(defun eat--line-mode-enter-auto-1 (buffer) + "Enter line mode in BUFFER." + (with-current-buffer buffer + (unless (or eat--inhibit-auto-line-mode eat--line-mode) + (unless eat--line-mode + (setq eat--auto-line-mode-prev-mode + (cond (eat--semi-char-mode 'semi-char) + (eat--char-mode 'char) + (t 'emacs))) + (eat-line-mode) + ;; We're entering automatically, so we should be able to exit it + ;; automatically. + (setq eat--inhibit-auto-line-mode nil))))) + (defun eat--line-mode-enter-auto () "Enter line mode." - (unless (or eat--inhibit-auto-line-mode eat--line-mode) - (unless eat--line-mode - (setq eat--auto-line-mode-prev-mode - (cond (eat--semi-char-mode 'semi-char) - (eat--char-mode 'char) - (t 'emacs))) - (eat-line-mode) - ;; We're entering automatically, so we should be able to exit it - ;; automatically. - (setq eat--inhibit-auto-line-mode nil)))) + (run-with-idle-timer 0 nil #'eat--line-mode-enter-auto-1 + (current-buffer))) + +(defun eat--line-mode-exit-auto-1 (buffer) + "Exit line mode in BUFFER." + (with-current-buffer buffer + (when (and (not eat--inhibit-auto-line-mode) + eat--auto-line-mode-prev-mode) + (pcase eat--auto-line-mode-prev-mode + ('emacs (eat-emacs-mode)) + ('semi-char (eat-semi-char-mode)) + ('char (eat-char-mode))) + (setq eat--auto-line-mode-prev-mode nil) + (when (/= (eat-term-end eat-terminal) (point-max)) + (eat-line-send)) + ;; Toggle line mode _after_ we exit from + ;; `eat-term-process-output'. + (run-with-idle-timer 0 nil #'eat-line-mode) + (eat--line-mode -1) + (setq buffer-undo-list nil)))) (defun eat--line-mode-exit-auto () "Exit line mode." - (when (and (not eat--inhibit-auto-line-mode) - eat--auto-line-mode-prev-mode) - (pcase eat--auto-line-mode-prev-mode - ('emacs (eat-emacs-mode)) - ('semi-char (eat-semi-char-mode)) - ('char (eat-char-mode))) - (setq eat--auto-line-mode-prev-mode nil) - (when (/= (eat-term-end eat-terminal) (point-max)) - (eat-line-send)) - (eat--line-mode -1) - (setq buffer-undo-list nil))) + (run-with-idle-timer 0 nil #'eat--line-mode-exit-auto-1 + (current-buffer))) (defun eat--post-prompt () "Put a mark in the marginal area and enter line mode."