elisp: Lazy Properties
31.19.7 Lazy Computation of Text Properties
-------------------------------------------
Instead of computing text properties for all the text in the buffer, you
can arrange to compute the text properties for parts of the text when
and if something depends on them.
The primitive that extracts text from the buffer along with its
properties is ‘buffer-substring’. Before examining the properties, this
function runs the abnormal hook ‘buffer-access-fontify-functions’.
-- Variable: buffer-access-fontify-functions
This variable holds a list of functions for computing text
properties. Before ‘buffer-substring’ copies the text and text
properties for a portion of the buffer, it calls all the functions
in this list. Each of the functions receives two arguments that
specify the range of the buffer being accessed. (The buffer itself
is always the current buffer.)
The function ‘buffer-substring-no-properties’ does not call these
functions, since it ignores text properties anyway.
In order to prevent the hook functions from being called more than
once for the same part of the buffer, you can use the variable
‘buffer-access-fontified-property’.
-- Variable: buffer-access-fontified-property
If this variable’s value is non-‘nil’, it is a symbol which is used
as a text property name. A non-‘nil’ value for that text property
means the other text properties for this character have already
been computed.
If all the characters in the range specified for ‘buffer-substring’
have a non-‘nil’ value for this property, ‘buffer-substring’ does
not call the ‘buffer-access-fontify-functions’ functions. It
assumes these characters already have the right text properties,
and just copies the properties they already have.
The normal way to use this feature is that the
‘buffer-access-fontify-functions’ functions add this property, as
well as others, to the characters they operate on. That way, they
avoid being called over and over for the same text.