emacs-devel
[Top][All Lists]
Advanced

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

Re: What's the best (i.e. least bad) way to re-redisplay?


From: Stefan Monnier
Subject: Re: What's the best (i.e. least bad) way to re-redisplay?
Date: Thu, 26 Aug 2021 09:49:33 -0400
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux)

>> > I think something along the lines of
>> 
>> >     (run-with-timer 0 nil
>> >                     (lambda (buf)
>> >                       (with-current-buffer buf (font-lock-flush)))
>> >                     (current-buffer))
>> 
>> > is the cleanest that comes to mind.
>> 
>> Thanks.  That's probably cleaner than a direct use of
>> jit-lock-force-redisplay.
>
> Why is it cleaner?  jit-lock and font-lock include provision for the
> fontification function to tell jit-lock what was the region actually
> fontified, and that will trigger a call to jit-lock-force-redisplay in
> a timer.  Why not use an existing mechanism?

That's indeed another option.  I assumed that the situation is such that
while fontifying region POS1..POS2 we discover a new type that forces
the whole buffer to be refontified (or at least some region POS3..POS4),
in which case it's best to use `font-lock-flush` and let this
refontification happen lazily.

But if indeed we can cheaply adjust the few places in the buffer that
are affected without performing a full "refontify" it might indeed be
a good idea to do that and adjust the `jit-lock-bounds` return value,
but in that case we have to be sure that the new bounds indeed describe
an area of the buffer that is now fully fontified, which is likely to be
a problem because there is no reason to assume that the buffer outside
of POS1..POS2 had already been fontified, so it may force us to eagerly
fontify additional parts of POS3..POS4.

Another option if we can cheaply adjust the few places in the buffer that
are affected without performing a full "refontify", is to do those
adjustments and then only force a redisplay but not a refontification.
I think this can be done with something like:

    (run-with-timer 0 nil
                    (lambda (buf)
                      (with-current-buffer buf
                        (put-text-property (point-min) (point-max) 'cc-dummy t)
                        (remove-text-properties (point-min) (point-max) 
'(cc-dummy))))
                    (current-buffer))


-- Stefan




reply via email to

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