Що таке накладки?
Перш за все, це об’єкти елісп. Це буде актуально пізніше.
Як ви самі сказали, вони представляють шари, які наносяться на регіони буфера. Ці шари мають властивості тексту, як і фактичний текст у буфері. Будь-яке звичайне властивість, яке має накладення, стосується тексту під ним. Однак є деякі властивості, особливі для накладок (вони не роблять нічого, якщо застосовуються до тексту).
Чому вони корисні?
З двох причин, на які я натякав вище:
Вони є об'єктами
Це означає, що ви можете зберігати їх у списках та обробляти їх легко. Ви можете змінити їх властивості, не відстежуючи, де вони зараз перебувають. Ще краще, ви можете використовувати їх для відстеження того, де знаходяться речі в буфері.
Ця відповідь Стефана є хорошим прикладом накладок, які використовуються для відстеження буферних областей. Ось короткий фрагмент його.
(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
Значенням цього властивості є рядок, який потрібно додати до відображення на початку накладення. Рядок не відображається в буфері в жодному сенсі - лише на екрані.
рядок-префікс
Ця властивість визначає специфікацію відображення для додавання до кожного рядка, що не продовжується, під час відображення. Див. Прорізання.
wrap-prefix
Цей властивість визначає специфікацію дисплея для додавання до кожного рядка продовження під час відображення. Див. Прорізання.
Зокрема, before-string
властивість дозволяє впливати на відображення буфера навіть при накладанні ширини 0. Це те, що ви не можете зробити із властивістю тексту. Все, що ви робите із властивостями тексту, повинно або перейти через існуючий текст (який може приховати цей текст), або перейти через новий рядок тексту, який ви вставляєте (що змінює реальний вміст буфера).
Ось приклад фрагмента про це. Оцініть його за тимчасовим буфером.
(overlay-put (make-overlay (point) (point)) 'before-string "Hi there!")
Коли вони погані?
Накладки набагато більш вимогливі (мудро обробляються), ніж властивості тексту. Деякі відповідні операції (такі як вставка тексту, якщо я не помиляюся) займають час, пропорційний кількості накладок у буфері. З цієї причини вони непридатні, коли вам потрібна велика їх кількість. У цьому випадку вам слід відмовитися від властивостей тексту.
i text properties
, звичайно.