Вместо того чтобы вычислять свойства текста для всего текста в буфере, вы можете организовать вычисление свойств текста для частей текста когда и если на них что-то зависит.
Примитивом, который извлекает текст из буфера вместе с его
свойствами, является buffer-substring. Прежде чем изучать свойства,
эта функция вызывает аномальный хук buffer-access-fontify-functions.
Эта переменная содержит список функций для вычисления свойств текста.
Прежде чем buffer-substring скопирует текст и свойства текста для
части буфера, она вызывает все функции в этом списке. Каждая из
функций принимает два аргумента, которые указывают диапазон
доступного буфера. (Сам буфер всегда является текущим
буфером.)
Функция buffer-substring-no-properties не вызывает эти
функции, поскольку она в любом случае игнорирует свойства текста.
Чтобы предотвратить повторный вызов функций хука для той же
части буфера, вы можете использовать переменную
buffer-access-fontified-property.
Если значение этой переменной не равно nil, то это символ, который используется
как имя свойства текста. Неравное nil значение для этого свойства текста
означает, что другие свойства текста для этого символа уже были
вычислены.
Если все символы в диапазоне, указанном для buffer-substring,
имеют не-nil значение для этого свойства, buffer-substring
не вызывает функции buffer-access-fontify-functions. Она
предполагает, что эти символы уже имеют правильные свойства текста и
просто копирует уже имеющиеся свойства.
Обычный способ использования этой функции заключается в том, что
функции buffer-access-fontify-functions добавляют это свойство, а также другие,
к символам, над которыми они работают. Таким образом, они избегают
повторных вызовов для одного и того же текста.