42.9.2 Свойства наложений

Свойства наложений похожи на текстовые свойства в том, что свойства, влияющие на отображение символа, могут поступать из любого источника. Но в большинстве аспектов они различаются. См. Текстовые свойства для сравнения.

Текстовые свойства считаются частью текста; наложения и их свойства считаются не частью текста. Таким образом, копирование текста между различными буферами и строками сохраняет текстовые свойства, но не пытается сохранять наложения. Изменение текстовых свойств буфера помечает буфер как изменённый, тогда как перемещение наложения или изменение его свойств этого не делает. В отличие от изменений текстовых свойств, изменения свойств наложений не записываются в список отмены буфера.

Поскольку более одного наложения могут задавать значение свойства для одного и того же символа, Emacs позволяет указать значение приоритета для каждого наложения. Значение приоритета используется для определения того, какое из перекрывающихся наложений «победит».

Эти функции читают и устанавливают свойства наложения:

Функция: overlay-get наложение свойство

Эта функция возвращает значение свойства, записанное в наложении, если оно есть. Если наложение не записывает никакого значения для этого свойства, но имеет свойство category, являющееся символом, то используется свойство свойство этого символа. В противном случае значение равно nil.

Функция: overlay-put наложение свойство значение

Эта функция устанавливает значение свойства, записанного в наложении, равным значению. Она возвращает значение.

Функция: overlay-properties наложение

Эта функция возвращает копию списка свойств наложения.

См. также функцию get-char-property, которая проверяет как свойства наложений, так и текстовые свойства для данного символа. См. Изучение текстовых свойств.

Многие свойства наложений имеют особый смысл; ниже приведена таблица этих свойств:

priority

Значение этого свойства определяет приоритет наложения. Если вы хотите указать значение приоритета, используйте либо nil (или ноль), либо положительное целое число, либо cons из двух значений. Любое другое значение приводит к неопределённому поведению.

Приоритет важен, когда два или более наложений покрывают один и тот же символ и оба задают одно и то же свойство с разными значениями; то, чье значение priority выше, переопределяет другое. (Для свойства face значение наложения с более высоким приоритетом не полностью переопределяет другое значение; вместо этого его отдельные атрибуты лица переопределяют соответствующие атрибуты лица свойства face с более низким приоритетом.) Если два наложения имеют одинаковое значение приоритета, и одно «вложено» в другое (т.е. покрывает меньше позиций буфера или строки), то внутреннее будет преобладать над внешним. Если ни одно не вложено в другое, то не следует строить предположений о том, какое наложение возобладает.

Когда программа на Lisp помещает наложения с определёнными приоритетами на текст, который может иметь наложения без приоритетов, это может привести к нежелательным результатам, потому что любое наложение с положительным значением приоритета переопределит все наложения без приоритета. Поскольку большинство функций Emacs, использующих наложения, не задают приоритеты для своих наложений, целочисленными приоритетами следует пользоваться с осторожностью. Вместо использования целочисленных приоритетов и риска переопределить другие наложения вы можете использовать значения приоритета вида (основной . вторичный), где основное значение используется как описано выше, а вторичное — это резервное значение, используемое, когда основное значение и соображения вложенности не позволяют разрешить старшинство между наложениями. В частности, значение приоритета (nil . n), где n — положительное целое, позволяет упорядочивать наложения по приоритету при необходимости, не переопределяя полностью другие наложения.

В настоящее время все наложения имеют приоритет над текстовыми свойствами.

Если вам нужно упорядочить наложения по приоритету, используйте аргумент sorted функции overlays-at. См. Поиск наложений.

window

Если свойство window не равно nil, то наложение применяется только в этом окне.

category

Если наложение имеет свойство category, мы называем его категорией наложения. Это должен быть символ. Свойства символа служат значениями по умолчанию для свойств наложения.

face

Это свойство управляет внешним видом текста (см. Лица). Значение свойства может быть следующим:

  • Имя лица (символ или строка).
  • Анонимное лицо: список свойств вида (ключ значение …), где каждый ключ — это имя атрибута лица, а значение — значение этого атрибута.
  • Список лиц. Каждый элемент списка должен быть либо именем лица, либо анонимным лицом. Это задаёт лицо, являющееся объединением атрибутов каждого из перечисленных лиц. Лица, встречающиеся раньше в списке, имеют более высокий приоритет.
  • Ячейка cons вида (foreground-color . имя-цвета) или (background-color . имя-цвета). Это задаёт цвет переднего плана или фона, аналогично (:foreground имя-цвета) или (:background имя-цвета). Эта форма поддерживается только для обратной совместимости, и её следует избегать.
mouse-face

Это свойство используется вместо face, когда мышь находится в пределах диапазона наложения. Однако Emacs игнорирует все атрибуты лица из этого свойства, которые изменяют размер текста (например, :height, :weight и :slant); эти атрибуты всегда такие же, как в невыделенном тексте.

display

Это свойство активирует различные функции, изменяющие способ отображения текста. Например, оно может сделать текст выше или ниже, выше или ниже по вертикали, шире или уже, или заменить его изображением. См. Свойство display. Обратите внимание, что если свойство display является замещающим (см. Спецификации отображения, замещающие текст), свойство invisible того же наложения будет проигнорировано.

help-echo

Если наложение имеет свойство help-echo, то когда вы наводите мышь на текст в наложении, Emacs отображает вспомогательную строку в эхо-области или в виде всплывающей подсказки. Подробности см. в Текстовая help-echo.

field

Последовательные символы с одинаковым свойством field образуют поле. Некоторые функции перемещения, включая forward-word и beginning-of-line, останавливаются на границе поля. См. Определение и использование полей.

modification-hooks

Значением этого свойства является список функций, вызываемых, если любой символ внутри наложения изменён или если текст вставлен строго внутрь наложения.

Функции-обработчики вызываются как до, так и после каждого изменения. Если функции сохраняют полученную информацию и сравнивают записи между вызовами, они могут точно определить, какое изменение было сделано в тексте буфера.

При вызове до изменения каждая функция получает четыре аргумента: наложение, nil, начало и конец изменяемого диапазона текста.

При вызове после изменения каждая функция получает пять аргументов: наложение, t, начало и конец только что изменённого диапазона текста и длину текста до изменения, заменённого этим диапазоном. (Для вставки длина до изменения равна нулю; для удаления эта длина равна количеству удалённых символов, а начало и конец после изменения совпадают.)

При вызове этих функций inhibit-modification-hooks привязан к не-nil. Если функции изменяют буфер, вам может потребоваться привязать inhibit-modification-hooks к nil, чтобы вызвать хуки изменений для этих модификаций. Однако это может привести к рекурсивному вызову вашего собственного хука изменений, поэтому будьте готовы к этому. См. Хуки изменений.

Текстовые свойства также поддерживают свойство modification-hooks, но детали несколько иные (см. Свойства с особым смыслом).

insert-in-front-hooks

Значением этого свойства является список функций, вызываемых до и после вставки текста непосредственно в начале наложения. Соглашения о вызове те же, что и для функций modification-hooks.

insert-behind-hooks

Значением этого свойства является список функций, вызываемых до и после вставки текста непосредственно в конце наложения. Соглашения о вызове те же, что и для функций modification-hooks.

invisible

Свойство invisible может сделать текст в наложении невидимым, то есть он не отображается на экране. Однако если текст, покрываемый наложением, имеет замещающее свойство display, свойство invisible будет проигнорировано, поскольку замещающее свойство display пропускает текст без проверки его свойств. См. Невидимый текст для подробностей.

intangible

Свойство intangible на наложении работает так же, как текстовое свойство intangible. Оно устарело. См. Свойства с особым смыслом для подробностей.

isearch-open-invisible

Это свойство сообщает инкрементному поиску (см. Инкрементный поиск в Руководстве GNU Emacs), как сделать невидимое наложение видимым окончательно, если итоговое совпадение перекрывает его. См. Невидимый текст.

isearch-open-invisible-temporary

Это свойство сообщает инкрементному поиску, как сделать невидимое наложение видимым временно во время поиска. См. Невидимый текст.

before-string

Значением этого свойства является строка, добавляемая к отображению в начале наложения. Строка не появляется в буфере в каком-либо смысле — только на экране. Обратите внимание, что если текст в начале наложения сделан невидимым, строка отображаться не будет.

after-string

Значением этого свойства является строка, добавляемая к отображению в конце наложения. Строка не появляется в буфере в каком-либо смысле — только на экране. Обратите внимание, что если текст в конце наложения сделан невидимым, строка отображаться не будет.

line-prefix

Это свойство задаёт спецификацию отображения, добавляемую перед каждой неперенесённой строкой во время отображения. См. Обрезка.

wrap-prefix

Это свойство задаёт спецификацию отображения, добавляемую перед каждой перенесённой строкой во время отображения. См. Обрезка.

evaporate

Если это свойство не равно nil, наложение автоматически удаляется, если оно становится пустым (т.е. если его длина становится нулевой). Если вы зададите пустому наложению (см. пустое наложение) не-nil свойство evaporate, оно будет удалено немедленно. Обратите внимание, что если наложение не имеет этого свойства, оно не будет удалено, когда текст между его начальной и конечной позициями будет удалён из буфера.

display-line-numbers-disable

Это свойство предотвращает отображение номеров строк (см. display-line-numbers в Руководстве GNU Emacs) для текста, который находится внутри наложения с этим свойством. Одна из ситуаций, где использование наложения с этим свойством полезно, — пустое наложение в конце буфера, поскольку в противном случае нет способа предотвратить отображение номера строки там.

keymap

Если это свойство не равно nil, оно задаёт карту клавиш для части текста. Эта карта клавиш имеет приоритет над большинством других карт клавиш (см. Активные карты клавиш), и она используется, когда точка находится внутри наложения, где свойства advance вперёд и назад определяют, считаются ли границы внутри или нет.

local-map

Свойство local-map аналогично keymap, но заменяет локальную карту буфера, а не дополняет существующие карты клавиш. Это также означает, что оно имеет более низкий приоритет, чем карты клавиш второстепенных режимов.

Свойства keymap и local-map не влияют на строку, отображаемую свойствами before-string, after-string или display. Это важно только для щелчков мыши и других событий мыши, попадающих на строку, поскольку точка никогда не находится на строке. Чтобы привязать специальные события мыши для строки, назначьте ей текстовое свойство keymap или local-map. См. Свойства с особым смыслом.