Subject: bug#12401: scroll-preserve-screen-position broken with font height faces

From: Eli Zaretskii <[email-masked]>
Date: Mon, 10 Sep 2012 21:02:04 +0300

> Date: Mon, 10 Sep 2012 20:37:06 +0800
> From: Le Wang <[email-masked]>
> Cc: [email-masked]
> 
> Thanks for the quick response, Eli.
> 
> On Mon, Sep 10, 2012 at 3:23 PM, Eli Zaretskii <[email-masked]> wrote:
> > scroll-preserve-screen-position tries to preserve the
> > _screen_position_ of point, i.e. where you find the cursor, after it
> > executes one of the scrolling commands.  But since arbitrary pixel
> > coordinates on the screen might in general (in the presence of
> > variable-size fonts) correspond to one of 2 possible text lines, Emacs
> > needs to choose where to put the cursor.  What exactly do you expect
> > Emacs to do in such a situation, where it simply _cannot_ keep the
> > same pixel coordinates?
> 
> I understand the problem.
> 
> > IOW, what is the "contract" that you expect Emacs to keep under
> > scroll-preserve-screen-position?  Is it just that doing N C-v's
> > followed by N M-v's brings point to the same location where it was
> > before this sequence of 2N commands?  Or do you also expect something
> > from each individual C-v/M-v, and if so, what exactly?
> 
> The contract should be C-v followed by M-v should bring the point back
> to the same line.

Then that feature is not currently available in Emacs scrolling,
sorry.  scroll-preserve-screen-position simply puts the point at or
near the same screen position after the window is scrolled.  That is
all it does.  The manual says that this returns to the previous point
when you scroll back, but that promise has no basis.  When some faces
are higher than the default font, the way Emacs scrolls windows cannot
make sure you will return to the same place.  It can only work when
all the faces use fonts that are no higher than the default face.

> >> For reference this package works just fine with variable height faces:
> >> http://www.cs.utah.edu/~eeide/emacs/scroll-in-place.el.gz
> >
> > I cannot use it, neither in Emacs 24.2 nor in the current trunk code:
> > it complains about a missing function screen-width.  Please provide a
> > complete recipe for using this package, starting with "emacs -Q", in
> > Emacs 24.2 or newer, so I could study what it does and how.
> 
> Sorry about this.  It seems the version I use comes from XEmacs and
> I've made a small fix.  I've placed it here:
> 
> https://gist.github.com/3690403

This package uses an entirely different method of scrolling, one that
is based on lines, not pixels.  I wonder how well it works when
(large) images, display strings, invisible text, and other calamities
are present in the buffer.  In any case, using such a method would
mean a thorough rewrite of window-scrolling primitives.  Volunteers
welcome.