Package: emacs;
Reported by: E Sabof <esabof <at> gmail.com>
Date: Sun, 2 Nov 2014 01:17:03 UTC
Severity: wishlist
Done: Lars Ingebrigtsen <larsi <at> gnus.org>
Bug is archived. No further changes may be made.
View this message in rfc822 format
From: E Sabof <esabof <at> gmail.com> To: Eli Zaretskii <eliz <at> gnu.org> Cc: 18923 <at> debbugs.gnu.org Subject: bug#18923: Alternative scrolling model Date: Sun, 02 Nov 2014 18:25:28 +0000
Eli Zaretskii <eliz <at> gnu.org> writes: >> From: E Sabof <esabof <at> gmail.com> >> Date: Sun, 02 Nov 2014 02:31:28 +0000 >> >> > Sounds nice. Do you imagine it as a replacement for the existing >> > scroll-up/down functions? Or rather (at least at first) as a separate >> > package? >> > Also, if something's missing for st-height to get more accurate >> > measurements, I suggest you make it a bug report asking for that missing >> > info/feature. >> >> I was mostly thinking the first. > > If this is intended as a replacement for the existing functionality, > then it needs to support all the features that the current code > supports. The list of those features should include at least the > following: > > . the argument to the commands can be nil, which means "almost the > full window", where "almost full" depends on the value of > next-screen-context-lines Easy to implement naively, and heuristics should probably be considered. > . the auto-window-vscroll variable I think the variable would no longer be useful with this approach. > . the scroll-preserve-screen-position option Ideally I'd measure the pixel distance from the top and try to restore it, but alternatives can be considered if this affects performance. > . signal an error at beginning and end of buffer, subject to the > value of scroll-error-top-bottom I think I already have the code that determines this case, I just need to throw errors. > . don't let point enter the scroll margin as result of scrolling > > . the window's old_point marker needs to be set after scrolling I don't fully understand these, but they don't seem too complicated. > There's also a bug when scrolling near the end of buffer: the result > is that the cursor us shown on a line beyond EOB, which should never > happen. I've noticed this. The point flashes at a wrong position, and then goes back to "legal" position. I thought this was a display engine bug. >> The only potentially downside I can think of >> is that it might be slower -- then again I'm just measuring line-heights, and >> of these there is (at most) only one line that won't eventually be displayed. > > It is indeed much slower. I timed it on xdisp.c using Dmitry's > scroll-up-benchmark function, and found this code to be 3 times slower > than the current implementation. Turning off font-lock slashes about > 40% of the benchmark time, so CC mode fontifications are not the main > reason for the slowdown. If I compare the existing implementation > with this one on xdisp.c with font-lock-mode turned off in both cases, > this implementation is 16 times slower than what we have now. > > For the record, my timings are from an unoptimized build of a recent > trunk, with your code byte-compiled. > > The general algorithm seems to be the same as in the current C > implementation, so I doubt an ELisp implementation could match what we > have in speed, let alone be faster. > > Now, I personally don't regard the scrolling command as something that > needs to be lightning-fast (although others obviously do, see the > on-going discussions on emacs-devel about that). But in this case, a > single PageDown keypress takes close to a second to execute, which is > slow enough to annoy. By contrast, the current implementation is > almost instantaneous. (Again, this is in an unoptimized build; an > optimized build should be about twice faster, but I think 0.4 sec for > a single scroll might still annoy.) I'm aware of some inefficiencies in my code. My guess probably doesn't mean much, but maybe something along 2X could be achieved. > Finally, it looks like this code forces Emacs to display every single > screen it scrolls through, even when it cannot keep up. I guess > that's due to the 'redisplay' calls. This makes the situation where > someone leans on the PageDown key and then releases it very > unpleasant: Emacs keeps scrolling for a long time, and I didn't find a > way of interrupting that. st-move probably shouldn't call (redisplay) at all. I'll see if I can convert my comments to reproducible bugs. >> If it were to remain mostly elisp, it would need a reliable way to measure the >> height of a line (essentially a `st-height' replacement), irrespective of >> whether it's displayed. > > Did you try to use pos-visible-in-window-p? AFAIU, it gives you what > you want, including for lines that are taller than the window. > >> It has also proven rather difficult to set the window >> start "absolutely". I've documented my findings in `st-move'. > > Does this happen only when point is on an image? (The comments in > st-move seem to talk only about this situation.) If so, could you > show a simple test case to demonstrate the problem? I think there are ~3 different bugs involved (vscroll not being displayed, vscroll being nullified, and the point-on-image cases). I'll see if I can describe them better. Evgeni
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.