33.19.7 Ленивое вычисление свойств текста

Вместо того чтобы вычислять свойства текста для всего текста в буфере, вы можете организовать вычисление свойств текста для частей текста когда и если на них что-то зависит.

Примитивом, который извлекает текст из буфера вместе с его свойствами, является buffer-substring. Прежде чем изучать свойства, эта функция вызывает аномальный хук buffer-access-fontify-functions.

Переменная: buffer-access-fontify-functions

Эта переменная содержит список функций для вычисления свойств текста. Прежде чем buffer-substring скопирует текст и свойства текста для части буфера, она вызывает все функции в этом списке. Каждая из функций принимает два аргумента, которые указывают диапазон доступного буфера. (Сам буфер всегда является текущим буфером.)

Функция buffer-substring-no-properties не вызывает эти функции, поскольку она в любом случае игнорирует свойства текста.

Чтобы предотвратить повторный вызов функций хука для той же части буфера, вы можете использовать переменную buffer-access-fontified-property.

Переменная: buffer-access-fontified-property

Если значение этой переменной не равно nil, то это символ, который используется как имя свойства текста. Неравное nil значение для этого свойства текста означает, что другие свойства текста для этого символа уже были вычислены.

Если все символы в диапазоне, указанном для buffer-substring, имеют не-nil значение для этого свойства, buffer-substring не вызывает функции buffer-access-fontify-functions. Она предполагает, что эти символы уже имеют правильные свойства текста и просто копирует уже имеющиеся свойства.

Обычный способ использования этой функции заключается в том, что функции buffer-access-fontify-functions добавляют это свойство, а также другие, к символам, над которыми они работают. Таким образом, они избегают повторных вызовов для одного и того же текста.