Что такое оверлеи?
Прежде всего, это объекты elisp. Это будет актуально позже.
Как вы сказали сами, они представляют слои, которые наносятся поверх областей буфера. Эти слои имеют свойства текста, так же как и текст в буфере. Любое обычное свойство, которое имеет оверлей, применяется к тексту под ним. Однако есть некоторые свойства, которые являются специальными для наложений (они ничего не делают, если применяются к тексту).
Почему они полезны?
По двум причинам, на которые я намекал выше:
Они объекты
Это означает, что вы можете хранить их в списках и обрабатывать их легко. Вы можете изменить их свойства без необходимости отслеживать, где они находятся сейчас. Более того, вы можете использовать их для отслеживания того, что находится в буфере.
Этот ответ Стефана является хорошим примером наложений, используемых для отслеживания буферных областей. Вот короткий фрагмент этого.
(let ((ol (make-overlay beg end)))
(overlay-put ol 'evaporate t)
(overlay-put ol 'my--auto-align-regexp regexp)
(push ol my--auto-align-overlays))
Он использует наложения для записи того, какие регионы должны быть выровнены, и какие регулярные выражения использовать для каждого из них. my--auto-align-overlays
является
список, где хранятся наложения, и к ним можно легко получить доступ, просматривая этот список.
Напротив, если бы мы использовали свойства текста для этого (что возможно), у нас не было бы простого способа получить к ним доступ. Вам нужно проанализировать буфер, чтобы найти свойства текста.
Они немного мощнее
Есть несколько свойств текста, которые влияют только на оверлеи. Вы можете найти весь список
в руководстве . Он слишком велик, чтобы включать его, но вот краткое изложение.
before-string
Значение этого свойства является строкой, добавляемой к отображению в начале наложения. Строка не появляется в буфере ни в каком смысле - только на экране.
line-prefix
Это свойство определяет спецификацию отображения, которая должна добавляться к каждой строке без продолжения во время отображения. Смотрите усечение.
wrap-prefix
Это свойство определяет спецификацию отображения, которая должна предшествовать каждой строке продолжения во время отображения. Смотрите усечение.
В частности, before-string
свойство позволяет влиять на отображение буфера даже при наложении шириной 0. Что нельзя делать со свойством text. Все, что вы делаете со свойствами текста, должно либо проходить по существующему тексту (который может скрыть этот текст), либо проходить по новой строке текста, которую вы вставляете (которая изменяет реальное содержимое буфера).
Вот пример сниппета об этом. Оцените его во временном буфере.
(overlay-put (make-overlay (point) (point)) 'before-string "Hi there!")
Когда они плохие?
Наложения намного сложнее (мудрее при обработке), чем свойства текста. Некоторые соответствующие операции (например, вставка текста, если я не ошибаюсь) занимают время, пропорциональное количеству оверлеев в буфере. По этой причине они не подходят, когда вам нужно их большое количество. В этом случае вы должны отказаться от свойств текста.
i text properties
, конечно.