[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [ELPA] New package proposal: visual-path-abbrev.el

From: Eli Zaretskii
Subject: Re: [ELPA] New package proposal: visual-path-abbrev.el
Date: Mon, 04 Mar 2019 20:03:40 +0200

> From: Tassilo Horn <address@hidden>
> Cc: address@hidden
> Date: Sun, 03 Mar 2019 16:52:56 +0100
> 1. emacs -Q
> 2. M-x load-file RET visual-file-name-abbrev.el RET
> 3. M-x rgrep RET (defsubst RET *.el RET ~/Repos/el/emacs
> 4. In the *grep* buffer: M-x visual-file-name-abbrev-mode
> As a result, the file names are indeed abbreviated but when I move up
> and down using C-n/C-p, I'd expect the file name under point to be
> displayed normally (so not the 'display spec but the normal text).  With
> emacs -Q, the problem is even worse than with my usual config.  It seems
> the conditional display spec is almost never tested, except when the
> window is scrolled, but then usually after scrolling point is not on the
> file name anymore which is now shown unabbreviated.

Yes, this feature is somewhat tricky to use.  The basic problem here
is that CONDITION is only evaluated when redisplay examines the text
on which you put this display spec, because only then the display
engine bumps into this spec.  And redisplay is extremely conservative
in what portions of text it examines, because doing so is generally
expensive, and makes Emacs less responsive.  So redisplay is full of
shortcuts and optimizations meant to avoid examining portions of text
where no changes are expected.

For your feature to work reliably, you need one or more overlays
examined even if the user just moves point, something that triggers a
heavily optimized version of redisplay (because moving point is a very
frequent operation).  You need to disable some of these optimizations.

One way of disabling those optimizations is to make some immaterial
change in one or more overlays, because overlay changes cause a more
thorough redisplay of the buffer.  You can, for example, change some
overlay property that will have no effect on display.

Another possibility is to have a buffer-local variable that you add to
the list of variables which trigger thorough redisplay of its buffer,
see the end of frame.el for how this is done.  Then whenever you want
redisplay to re-evaluate one or more of your overlays, you change the
value of that variable.

Both of those techniques will need to use post-command-hook, I think.

Caveat: I didn't try any of my suggestions, so I cannot be sure they
will work, although they should, of course.  (I did add the above
caveats to the ELisp manual, so they are now documented.)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]