[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#32874: Unwanted scrolling in edebug `f' command when follow-mode is
From: |
Alan Mackenzie |
Subject: |
bug#32874: Unwanted scrolling in edebug `f' command when follow-mode is active |
Date: |
Sun, 30 Sep 2018 14:45:29 +0000 |
User-agent: |
Mutt/1.10.1 (2018-07-13) |
Hello, yet again, Eli.
On Sat, Sep 29, 2018 at 17:35:43 +0300, Eli Zaretskii wrote:
> > Date: Sat, 29 Sep 2018 14:09:57 +0000
> > From: Alan Mackenzie <acm@muc.de>
[ .... ]
> > The best available hooks which might serve seem to be
> > pre-redisplay-function or pre-redisplay-functions. Unfortunately,
> > these are called too late, after redisplay has already determined
> > which windows to operate on.
> That's not true: pre-redisplay-function is called _before_ the display
> engine determines what window(s) might need to be redrawn.
Indeed, pre-redisplay-function appears to work well. The following
patch, which moves follow-mode's embedding in Emacs from
post-command-hook to pre-redisplay-function appears to solve the
original bug (Unwanted scrolling after `f' in edebug) completely.
Any objection from anybody to me committing this change to master?
diff --git a/lisp/follow.el b/lisp/follow.el
index 7aa7b51473..54ece9cd4f 100644
--- a/lisp/follow.el
+++ b/lisp/follow.el
@@ -187,8 +187,8 @@
;; Implementation:
;;
;; The main method by which Follow mode aligns windows is via the
-;; function `follow-post-command-hook', which is run after each
-;; command. This "fixes up" the alignment of other windows which are
+;; function `follow-pre-redisplay-function', which is run before each
+;; redisplay. This "fixes up" the alignment of other windows which are
;; showing the same Follow mode buffer, on the same frame as the
;; selected window. It does not try to deal with buffers other than
;; the buffer of the selected frame, or windows on other frames.
@@ -418,7 +418,8 @@ follow-mode
(if follow-mode
(progn
(add-hook 'compilation-filter-hook 'follow-align-compilation-windows t
t)
- (add-hook 'post-command-hook 'follow-post-command-hook t)
+ ;; (add-hook 'post-command-hook 'follow-post-command-hook t)
+ (add-function :before pre-redisplay-function
'follow-pre-redisplay-function)
(add-hook 'window-size-change-functions 'follow-window-size-change t)
(add-hook 'after-change-functions 'follow-after-change nil t)
(add-hook 'isearch-update-post-hook 'follow-post-command-hook nil t)
@@ -445,7 +446,7 @@ follow-mode
(setq following (buffer-local-value 'follow-mode (car buffers))
buffers (cdr buffers)))
(unless following
- (remove-hook 'post-command-hook 'follow-post-command-hook)
+ ;; (remove-hook 'post-command-hook 'follow-post-command-hook)
(remove-hook 'window-size-change-functions 'follow-window-size-change)))
(kill-local-variable 'move-to-window-group-line-function)
@@ -1260,10 +1261,27 @@ follow-avoid-tail-recenter
(not (eq win top)))) ;; Loop while this is true.
(set-buffer orig-buffer))))
-;;; Post Command Hook
+;;; Pre Display Function
+
+;; This function is added to `pre-display-function' and is thus called
+;; before each redisplay operation. It supersedes (2018-09) the
+;; former use of the post command hook, and now does the right thing
+;; when a program calls `redisplay' or `sit-for'.
+
+(defun follow-pre-redisplay-function (wins)
+ (if (or (eq wins t)
+ (null wins)
+ (and (listp wins)
+ (memq (selected-window) wins)))
+ (follow-post-command-hook)))
-;; The magic little box. This function is called after every command.
+;;; Post Command Hook
+;; The magic little box. This function was formerly called after every
+;; command. It is now called before each redisplay operation (see
+;; `follow-pre-redisplay-function' above), and at the end of several
+;; search/replace commands. It retains its historical name.
+;;
;; This is not as complicated as it seems. It is simply a list of common
;; display situations and the actions to take, plus commands for redrawing
;; the screen if it should be unaligned.
@@ -1284,6 +1302,12 @@ follow-post-command-hook
(setq follow-windows-start-end-cache nil))
(follow-adjust-window win)))))
+;; NOTE: to debug follow-mode with edebug, it is helpful to add
+;; `follow-post-command-hook' to `post-command-hook' temporarily. Do
+;; this locally to the target buffer with, say,:
+;; M-: (add-hook 'post-command-hook 'follow-post-command-hook t t)
+;; .
+
(defun follow-adjust-window (win)
;; Adjust the window WIN and its followers.
(cl-assert (eq (window-buffer win) (current-buffer)))
--
Alan Mackenzie (Nuremberg, Germany).
- bug#32874: Unwanted scrolling in edebug `f' command when follow-mode is active, Alan Mackenzie, 2018/09/29
- bug#32874: Unwanted scrolling in edebug `f' command when follow-mode is active, Eli Zaretskii, 2018/09/29
- bug#32874: Unwanted scrolling in edebug `f' command when follow-mode is active, Alan Mackenzie, 2018/09/29
- bug#32874: Unwanted scrolling in edebug `f' command when follow-mode is active, Eli Zaretskii, 2018/09/29
- bug#32874: Unwanted scrolling in edebug `f' command when follow-mode is active, Alan Mackenzie, 2018/09/29
- bug#32874: Unwanted scrolling in edebug `f' command when follow-mode is active, Eli Zaretskii, 2018/09/30
- bug#32874: Unwanted scrolling in edebug `f' command when follow-mode is active, Alan Mackenzie, 2018/09/30
- bug#32874: Unwanted scrolling in edebug `f' command when follow-mode is active, Eli Zaretskii, 2018/09/30
bug#32874: Unwanted scrolling in edebug `f' command when follow-mode is active,
Alan Mackenzie <=