From c34339f3a2c425ca37bec0c6a152f913ab61f458 Mon Sep 17 00:00:00 2001 From: Vitalie Spinu Date: Thu, 27 Dec 2012 08:33:47 +0100 Subject: [PATCH] Cleanup comint-postoutput-scroll-to-bottom (Bug#13248). * comint.el (comint-adjust-window-point): New function. (comint-postoutput-scroll-to-bottom): Call comint-adjust-window-point (Bug#13248). --- lisp/ChangeLog | 6 ++++++ lisp/comint.el | 34 +++++++++++++++++++++++----------- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 4b43050ddf5..03122ff5000 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2012-12-27 Vitalie Spinu (tiny change) + + * comint.el (comint-adjust-window-point): New function. + (comint-postoutput-scroll-to-bottom): Call + comint-adjust-window-point (Bug#13248). + 2012-12-26 Dmitry Gutov * progmodes/ruby-mode.el (auto-mode-alist): `purecopy' the diff --git a/lisp/comint.el b/lisp/comint.el index a01e7e58cd7..f3450e3f58e 100644 --- a/lisp/comint.el +++ b/lisp/comint.el @@ -2120,19 +2120,31 @@ This function should be in the list `comint-output-filter-functions'." ((bound-and-true-p follow-mode) (follow-comint-scroll-to-bottom)) (t - (let ((selected (selected-window))) - (dolist (w (get-buffer-window-list current nil t)) - (select-window w) - (unwind-protect - (progn - (comint-adjust-point selected) - ;; Optionally scroll to the bottom of the window. - (and comint-scroll-show-maximum-output - (eobp) - (recenter (- -1 scroll-margin)))) - (select-window selected)))))) + (dolist (w (get-buffer-window-list current nil t)) + (comint-adjust-window-point w process) + ;; Optionally scroll to the bottom of the window. + (and comint-scroll-show-maximum-output + (eq (window-point w) (point-max)) + (with-selected-window w + (recenter (- -1 scroll-margin))))))) (set-buffer current)))) + +(defun comint-adjust-window-point (window process) + "Move point in WINDOW based on Comint settings. +For point adjustment use the process-mark of PROCESS." + (and (< (window-point window) (process-mark process)) + (or (memq comint-move-point-for-output '(t all)) + ;; Maybe user wants point to jump to end. + (eq comint-move-point-for-output + (if (eq (selected-window) window) 'this 'others)) + ;; If point was at the end, keep it at end. + (and (marker-position comint-last-output-start) + (>= (window-point window) comint-last-output-start))) + (set-window-point window (process-mark process)))) + + +;; this function is nowhere used (defun comint-adjust-point (selected) "Move point in the selected window based on Comint settings. SELECTED is the window that was originally selected." -- 2.39.2