Package: emacs;
Reported by: Keith David Bershatsky <esq <at> lawlist.com>
Date: Tue, 19 Jan 2016 05:50:01 UTC
Severity: wishlist
Found in version 25.1.50
View this message in rfc822 format
From: Keith David Bershatsky <esq <at> lawlist.com> To: Eli Zaretskii <eliz <at> gnu.org> Cc: 22404 <at> debbugs.gnu.org Subject: bug#22404: 25.1.50; Forcing `window-scroll-functions` to run. Date: Thu, 21 Jan 2016 13:11:48 -0800
> What do you need from window-scroll-functions? Only the correct > values of window-start and window-end? Or something else? Correct, I just need the 100% accurate `window-start` and `window-end`. :) :) > The other thing I still don't understand is how forcing > window-scroll-functions to run could fix your problem or _avoiding_ > extra calculations. Where and under what conditions would you call > the function that forces Emacs to run window-scroll-functions? I either need to use BOTH the `post-command-hook` and `window-scroll-functions` hook; OR, just the WSF if it is forced to always run. WSF is needed (for sure) whenever `window-start` and `window-end` have changed -- so PCH must do the work the rest of the time. I had previously been using a poor test to GUESS (from the PCH) whether WSF will run. > Doesn't that waste processing in those cases where normally > window-scroll-functions didn't need to be run (because window-start > and window-end don't change)? IOW, aren't you running those costly > calculations from window-scroll-functions? If point moves left or right, the vertical ruler that tracks the cursor position moves with the cursor -- so recalculation is needed. The vertical ruler is on a 0.3 idle timer, and the horizontal ruler (with line numbers and pilcrows) is on all the time. For the horizontal ruler, I have a test that compares the previous window-start/end to the new window-start/end -- if it is just cursor movement (instead of self-insert-command), then I use the previously recorded list of calculations. Just moving the cursor left/right/up/down within the same window bounds is much faster than typing or deleting a character. ;; HORIZONTAL RULER (snippet) (setq posn-list (if (and hr-prev-start (= hr-prev-start start) hr-prev-end (= hr-prev-end end) +-posn-list (or (eq +-this-command 'lawlist-left-char) (eq +-this-command 'lawlist-right-char) (eq +-this-command 'lawlist-previous-line) (eq +-this-command 'lawlist-next-line) (eq +-this-command 'lawlist-forward-entity) (eq +-this-command 'lawlist-backward-entity) (eq +-this-command 'lawlist-forward-paragraph) (eq +-this-command 'lawlist-backward-paragraph) (eq +-this-command 'lawlist-end-of-visual-line) (eq +-this-command 'lawlist-beginning-of-visual-line))) +-posn-list (posn start end vcol))) The vertical ruler (on an idle timer) will use the previously recorded list of calculations under a few limited circumstances. ;; VERTICAL RULER (snippet) (setq posn-list (if (or (not +-posn-list) (and (not force) (memq last-command '( special-yank special-copy-selected-region copy-selected-region delete-word-or-whitespace delete-forward-char lawlist-backward-delete-char-untabify lawlist-beginning-of-buffer lawlist-end-of-buffer beginning-of-buffer end-of-buffer scroll-up scroll-down lawlist-super-scroll-up lawlist-super-scroll-down lawlist-scroll-up lawlist-scroll-down lawlist-left-char lawlist-right-char left-char right-char lawlist-previous-line lawlist-next-line previous-line next-line lawlist-forward-entity lawlist-backward-entity lawlist-forward-paragraph lawlist-backward-paragraph forward-paragraph backward-paragraph lawlist-end-of-visual-line lawlist-beginning-of-visual-line end-of-visual-line beginning-of-visual-line)))) (posn start end vcol) +-posn-list)) > Finally, wouldn't running from pre-command-hook solve the problem? > The values of window-start and window-end are known by then, and you > can record the old values to compare them against new, to know when > they change. No? Basically any change to the text requires some type of recalculation -- e.g., line got shorter/longer, block of test was deleted/pasted. Keith
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.