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.