Що таке накладки та чим вони відрізняються від властивостей тексту?


23

У посібнику зазначено:

Ви можете використовувати накладки, щоб змінити вигляд тексту буфера на екрані заради функцій презентації.

З назви це говорить про те, що його можна використовувати для створення "шарів" над існуючим текстом, але опис вище, схоже, вказує на те, що він змінює зовнішній вигляд тексту, який дуже схожий на те, що властивості тексту.

Що таке конкретне використання накладок? Що вони пропонують, щоб властивості тексту не мали? Чи можна їх використовувати для написання тексту над текстом у буфер, як спливаюче вікно, інформаційне поле тощо?


Прочитайте більше цього посібника, ніж лише одне речення. Це досить чітко пояснено, ІМО. Включаючи відмінності від властивостей тексту. Дивіться також (у цьому ж посібнику) i text properties, звичайно.
Дрю

Відповіді:


10

Що таке накладки?

Перш за все, це об’єкти елісп. Це буде актуально пізніше.

Як ви самі сказали, вони представляють шари, які наносяться на регіони буфера. Ці шари мають властивості тексту, як і фактичний текст у буфері. Будь-яке звичайне властивість, яке має накладення, стосується тексту під ним. Однак є деякі властивості, особливі для накладок (вони не роблять нічого, якщо застосовуються до тексту).

Чому вони корисні?

З двох причин, на які я натякав вище:

Вони є об'єктами

Це означає, що ви можете зберігати їх у списках та обробляти їх легко. Ви можете змінити їх властивості, не відстежуючи, де вони зараз перебувають. Ще краще, ви можете використовувати їх для відстеження того, де знаходяться речі в буфері.

Ця відповідь Стефана є хорошим прикладом накладок, які використовуються для відстеження буферних областей. Ось короткий фрагмент його.

(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!")

Коли вони погані?

Накладки набагато більш вимогливі (мудро обробляються), ніж властивості тексту. Деякі відповідні операції (такі як вставка тексту, якщо я не помиляюся) займають час, пропорційний кількості накладок у буфері. З цієї причини вони непридатні, коли вам потрібна велика їх кількість. У цьому випадку вам слід відмовитися від властивостей тексту.


12

Накладки та властивості тексту мають абсолютно однакові можливості. Вони додають поля зміни, кнопки, обличчя, піктограми бахроми, підказки, зображення, виділення тощо тощо до певної частини тексту. Однак існує величезна концептуальна різниця:

Накладки незалежні , властивості тексту - ні. Emacs має чіткий тип накладення, але "тип властивості тексту" не існує. Властивості тексту по суті пов'язані з рядком, на який вони були встановлені. Накладки з іншого боку прикріплені до буфера.

Є кілька практичних наслідків цієї різниці:

  • Ви можете встановити властивості тексту на рядках, які не входять до жодного буфера, тоді як буфер для накладок завжди потрібен.
  • Ви не можете зберегти список властивостей тексту, які ви десь додали, тоді як легко зберігати список накладок, доданих до буфера, і, наприклад, видаляти всі свої накладки за один раз.
  • Ви можете мати одну накладку, яка встановлює декілька накладок на текст (наприклад, обличчя, підказку та значок бахроми), тому ви можете використовувати накладку для управління "групою" властивостей як єдиного підрозділу, тоді як немає така річ для властивостей тексту. Ви встановлюєте їх індивідуально, а ви керуєте ними окремо.

Суть всього цього полягає в тому, що ви можете керувати накладками окремо від текстового вмісту. Концептуально ви використовуєте їх для речей, які ви показуватимете в буфері, навіть якщо це не залежить від тексту.

Практично ви використовуєте накладки, якщо матеріал, який ви хочете додати до тексту, часто змінюється, тоді як ви використовуєте властивості тексту, якщо матеріал постійний.

Наприклад, Emacs використовує властивості тексту для створення кнопок і введення віджетів у M-x customizeбуфер. Ці віджети створені один раз, і залишаються там, поки буфер живий, тому не потрібно вводити накладки.

Однак Flycheck використовує накладки для виділення помилок у буфері, оскільки часто потрібно видаляти та додавати яскраві моменти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.