Свойства оверлеев
Свойства оверлеев похожи на свойства текста в том, что свойства, изменяющие отображение символа, могут задаваться обоими способами. Но в большинстве отношений они различаются. Для сравнения см. Свойства текста.
Свойства текста считаются частью текста; оверлеи и их свойства, напротив, специально считаются не частью текста. Поэтому при копировании текста между различными буферами и строками свойства текста сохраняются, а оверлеи сохранять не пытаются. Изменение свойств текста в буфере помечает буфер как изменённый, а перемещение оверлея или изменение его свойств — нет. В отличие от изменений свойств текста, изменения свойств оверлея не записываются в список отмены буфера.
Поскольку для одного и того же символа значение свойства могут задавать несколько оверлеев, Emacs позволяет указать приоритет каждого оверлея. Значение приоритета используется для определения того, какой из перекрывающихся оверлеев «победит».
Эти функции считывают и задают свойства оверлея:
- Функция: overlay-get overlay prop
Эта функция возвращает значение свойства prop, записанное в overlay, если оно есть. Если в overlay не записано значение этого свойства, но имеется свойство
category, являющееся символом, используется свойство prop этого символа. В противном случае возвращается значениеnil.
- Функция: overlay-put overlay prop value
Эта функция задаёт для свойства prop, записанного в overlay, значение value. Она возвращает value.
- Функция: overlay-properties overlay
Эта функция возвращает копию списка свойств overlay.
См. также функцию get-char-property, которая проверяет как свойства оверлея, так и свойства текста для заданного символа. См. Просмотр свойств текста.
Многие свойства оверлеев имеют особое значение; ниже приведена таблица таких свойств:
-
priority -
Значение этого свойства определяет приоритет оверлея. Чтобы задать значение приоритета, используйте либо
nil(или ноль), либо положительное целое число, либо пару из двух значений. Любое другое значение приводит к неопределённому поведению.Приоритет имеет значение, когда два или более оверлеев покрывают один и тот же символ и задают для одного свойства разные значения: значение оверлея с более высоким значением
priorityпереопределяет другое. (Для свойстваfaceзначение оверлея с более высоким приоритетом не полностью переопределяет другое значение; вместо этого отдельные атрибуты его лица переопределяют соответствующие атрибуты лица свойстваfaceс более низким приоритетом.) Если у двух оверлеев одинаковое значение приоритета и один «вложен» в другой (то есть охватывает меньше позиций буфера или строки), преимущество имеет внутренний оверлей. Если ни один оверлей не вложен в другой, не следует предполагать, какой из них будет иметь преимущество.Если программа на Lisp помещает на текст оверлеи с заданными приоритетами, на котором могут быть оверлеи без приоритетов, это может привести к нежелательным результатам, поскольку любой оверлей с положительным значением приоритета переопределит все оверлеи без приоритета. Поскольку большинство функций Emacs, использующих оверлеи, не задают для них приоритеты, целочисленные приоритеты следует использовать с осторожностью. Вместо целочисленных приоритетов, которые могут переопределять другие оверлеи, можно использовать значения приоритета вида
(primary . secondary), где значение primary используется, как описано выше, а secondary — как резервное значение, когда с помощью primary и правил вложенности не удаётся определить порядок оверлеев. В частности, значение приоритета(nil . n), где n — положительное целое число, позволяет при необходимости упорядочивать оверлеи по приоритету, не переопределяя полностью другие оверлеи.В настоящее время все оверлеи имеют приоритет над свойствами текста.
Чтобы расположить оверлеи в порядке приоритета, используйте аргумент sorted функции
overlays-at. См. Поиск оверлеев. -
window -
Если свойство
windowне равноnil, оверлей применяется только в этом окне. -
category -
Если у оверлея есть свойство
category, его называют категорией оверлея. Это свойство должно быть символом. Свойства символа используются как значения по умолчанию для свойств оверлея. -
face -
Это свойство управляет внешним видом текста (см. Лица). Значение свойства может быть одним из следующих:
- Имя лица (символ или строка).
- Анонимное лицо: список свойств вида
(keyword value …), где каждое keyword — имя атрибута лица, а value — значение этого атрибута. - Список лиц. Каждый элемент списка должен быть либо именем лица, либо анонимным лицом. Так задаётся лицо, объединяющее атрибуты всех перечисленных лиц. Лица, стоящие в списке раньше, имеют более высокий приоритет.
- Пара вида
(foreground-color . color-name)или(background-color . color-name). Она задаёт цвет переднего плана или фона, аналогично(:foreground color-name)или(:background color-name). Эта форма поддерживается только для обратной совместимости, и её следует избегать.
-
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, оверлей автоматически удаляется, если становится пустым (то есть его длина становится равной нулю). Если задать пустому оверлею (см. пустые оверлеи) свойствоevaporateсо значением, отличным отnil, он будет немедленно удалён. Обратите внимание: если у оверлея нет этого свойства, он не удаляется при удалении из буфера текста между его начальной и конечной позициями. -
display-line-numbers-disable -
Это свойство предотвращает отображение номеров строк (см. display-line-numbers в Руководстве GNU Emacs) для текста, находящегося внутри оверлея с этим свойством. Например, полезно использовать оверлей с этим свойством в конце буфера, поскольку иначе невозможно предотвратить отображение там номера строки.
-
keymap -
Если это свойство не равно
nil, оно задаёт карту клавиш для части текста. Эта карта клавиш имеет приоритет над большинством других карт клавиш (см. Активные карты клавиш) и используется, когда точка находится внутри оверлея; свойства продвижения переднего и заднего края определяют, считаются ли границы внутренней частью оверлея. -
local-map Свойство
local-mapпохоже наkeymap, но заменяет локальную карту буфера, а не дополняет существующие карты клавиш. Это также означает, что оно имеет более низкий приоритет, чем карты клавиш второстепенных режимов.
Свойства keymap и local-map не влияют на строку, отображаемую свойствами before-string, after-string или display. Это важно только для щелчков мышью и других событий мыши, приходящихся на строку, поскольку точка никогда не находится в строке. Чтобы привязать специальные события мыши к строке, назначьте ей текстовое свойство keymap или local-map. См. Свойства с особыми значениями.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Overlay-Properties.html