33.19.4 Свойства со специальными значениями

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

Примечание: свойства composition, display, invisible и intangible также могут приводить к перемещению точки в приемлемое место после каждой команды Emacs. См. Корректировка точки после команд.

category

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

face

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

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

Режим Font Lock (см. Режим Font Lock) работает в большинстве буферов путем динамического обновления свойства face символов на основе контекста.

Функция add-face-text-property предоставляет удобный способ установки этого свойства текста. См. Изменение свойств текста.

font-lock-face

Это свойство задает значение для свойства face, которое режим Font Lock должен применить к основному тексту. Это один из методов подсветки, используемых режимом Font Lock, и он полезен для специальных режимов, реализующих собственную подсветку. См. Предварительно вычисленная подсветка. Когда режим Font Lock отключен, font-lock-face не действует.

mouse-face

Это свойство используется вместо face, когда указатель мыши наводится на текст, имеющий это свойство. Когда это происходит, подсвечивается весь участок текста с тем же значением свойства mouse-face, а не только символ под курсором мыши.

Emacs игнорирует все атрибуты лица из свойства mouse-face, которые изменяют размер текста (например, :height, :weight и :slant). Эти атрибуты всегда такие же, как и для неподсвеченного текста.

cursor-face

Это свойство похоже на mouse-face, но используется, когда точка (а не мышь) находится внутри текста, имеющего это свойство. Подсветка происходит только в том случае, если включен режим cursor-face-highlight-mode. Когда переменная cursor-face-highlight-nonselected-window не равна nil, текст с этим лицом подсвечивается, даже если окно не выбрано, аналогично тому, как highlight-nonselected-windows работает для области (см. Отметка и область в Руководстве GNU Emacs).

fontified

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

display

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

help-echo

Если текст имеет строку в качестве свойства help-echo, то когда вы наводите мышь на этот текст, Emacs отображает эту строку в области эхо или в окне всплывающей подсказки (см. Всплывающие подсказки) после передачи ее через substitute-command-keys.

Если значение свойства help-echo является функцией, эта функция вызывается с тремя аргументами: окно, объект и позиция и должна возвращать строку помощи или nil для отсутствия. Первый аргумент, окно — это окно, в котором была найдена подсказка. Второй, объект — это буфер, оверлей или строка, имеющие свойство help-echo. Аргумент позиция следующий:

  • Если объект — буфер, то позиция — это позиция в буфере.
  • Если объект — оверлей, этот оверлей имеет свойство help-echo, а позиция — это позиция в буфере оверлея.
  • Если объект — строка (строка оверлея или строка, отображаемая со свойством display), то позиция — это позиция в этой строке.

Если значение свойства help-echo не является ни функцией, ни строкой, оно вычисляется для получения строки помощи.

Вы можете изменить способ отображения текста помощи, установив переменную show-help-function (см. Отображение помощи).

Эта функция используется в строке режима и для другого активного текста.

help-echo-inhibit-substitution

Если первый символ строки help-echo имеет ненулевое свойство help-echo-inhibit-substitution, то она отображается как есть функцией show-help-function без передачи через substitute-command-keys.

left-fringe-help
right-fringe-help

Если какой-либо видимый текст строки экрана имеет свойство текста left-fringe-help или right-fringe-help, значение которого является строкой, то эта строка будет отображаться, когда указатель мыши наводится на соответствующее поле строки через show-help-function (см. Отображение помощи). Это полезно при использовании вместе с курсорами полей и растровыми изображениями (см. Поля).

keymap

Свойство keymap задает дополнительную карту клавиш для команд. Когда эта карта клавиш применяется, она используется для поиска клавиш перед картами клавиш второстепенных режимов и перед локальной картой буфера. См. Активные карты клавиш. Если значение свойства является символом, определение функции символа используется как карта клавиш.

Значение свойства для символа перед точкой применяется, если оно не равно nil и является липким сзади, а значение свойства для символа после точки применяется, если оно не равно nil и является липким спереди. (Для щелчков мыши используется позиция щелчка вместо позиции точки.)

local-map

Это свойство работает как keymap, за исключением того, что оно задает карту клавиш для использования вместо локальной карты буфера. Для большинства целей (возможно, для всех целей) лучше использовать свойство keymap.

syntax-table

Свойство syntax-table переопределяет то, что таблица синтаксиса говорит об этом конкретном символе. См. Свойства синтаксиса.

read-only

Если символ имеет свойство read-only, то изменение этого символа не разрешается. Любая команда, которая попытается это сделать, вызовет ошибку text-read-only. Если значение свойства является строкой, эта строка используется как сообщение об ошибке.

Вставка рядом с символом, доступным только для чтения, вызывает ошибку, если при вставке обычного текста туда наследовалось бы свойство read-only из-за липкости. Таким образом, вы можете управлять разрешением на вставку рядом с текстом только для чтения, контролируя липкость. См. Липкость свойств текста.

Поскольку изменение свойств считается изменением буфера, невозможно удалить свойство read-only, если вы не знаете специальный прием: свяжите inhibit-read-only с ненулевым значением, а затем удалите свойство. См. Буферы только для чтения.

inhibit-read-only

Символы, имеющие свойство inhibit-read-only, могут редактироваться даже в буферах только для чтения. См. Буферы только для чтения.

invisible

Ненулевое свойство invisible может сделать символ невидимым на экране. Подробнее см. Невидимый текст.

inhibit-isearch

Ненулевое свойство inhibit-isearch заставит isearch пропускать текст.

intangible

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

Если последовательные символы имеют неравные ненулевые свойства intangible, они принадлежат к разным группам; каждая группа обрабатывается отдельно, как описано выше.

Когда переменная inhibit-point-motion-hooks не равна nil (как это происходит по умолчанию), свойство intangible игнорируется.

Остерегайтесь: это свойство работает на очень низком уровне и влияет на множество кода неожиданным образом. Поэтому используйте его с особой осторожностью. Частое неправильное использование — это помещение свойства intangible на невидимый текст, что на самом деле не нужно, поскольку командный цикл все равно переместит точку за пределы невидимого текста в конце каждой команды. См. Корректировка точки после команд. По этим причинам это свойство устарело; используйте вместо него свойство cursor-intangible.

cursor-intangible

Когда включен второстепенный режим cursor-intangible-mode, точка перемещается от любой позиции, имеющей ненулевое свойство cursor-intangible, непосредственно перед перерисовкой. Обратите внимание, что «липкость» свойства (см. Липкость свойств текста) учитывается при вычислении допустимых позиций курсора, поэтому (например) чтобы вставить участок из пяти символов ‘x’, в который курсор не может войти, вы должны сделать что-то вроде:

(insert
 (propertize "xxxx" 'cursor-intangible t)
 (propertize "x" 'cursor-intangible t 'rear-nonsticky t))

Когда переменная cursor-sensor-inhibit не равна nil, свойство cursor-intangible и свойство cursor-sensor-functions (описанное ниже) игнорируются.

field

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

cursor

Обычно курсор отображается в начале или конце любых строк оверлеев и свойств текста, которые «скрывают» (т.е. отображаются вместо) текущую позицию буфера. Вместо этого вы можете указать Emacs поместить курсор на любой желаемый символ этих строк, присвоив этому символу ненулевое свойство текста cursor. Кроме того, если значение свойства cursor является целым числом, оно указывает количество позиций символов буфера, начиная с позиции, где начинается оверлей или свойство display, для которых курсор должен отображаться на этом символе. В частности, если значение свойства cursor символа равно числу n, курсор будет отображаться на этом символе для любой позиции буфера в диапазоне [поз-оверлея..поз-оверлея+n), где поз-оверлея — это начальная позиция оверлея, задаваемая overlay-start (см. Управление оверлеями), или позиция, с которой начинается свойство текста display в буфере.

Другими словами, символ строки со свойством cursor любого ненулевого значения — это символ, на котором отображать курсор, когда оверлей или строка отображения делают точку невидимой на экране. Значение свойства указывает, для каких позиций буфера отображать там курсор. Если значение является целым числом n, курсор отображается там, когда точка находится где-либо между началом оверлея или свойства display и n позициями после этого. Если значение является чем-то иным и не nil, курсор отображается там только тогда, когда точка находится в позиции буфера, являющейся началом свойства display, или в overlay-start, если эта позиция не отображается на экране. Обратите внимание, что целочисленное значение свойства cursor может означать, что курсор отображается на этом символе, даже если точка видна на экране.

Одна тонкость этого свойства заключается в том, что оно не работает, если поместить это свойство на символ новой строки, который является частью строки отображения или оверлея. Это связано с тем, что новая строка не имеет графического представления на экране, которое Emacs мог бы найти, когда ищет символ на экране с этим свойством cursor.

Когда в буфере много строк оверлеев (например, см. before-string), которые скрывают часть текста буфера, или свойств display, являющихся строками, рекомендуется использовать свойство cursor для этих строк, чтобы подсказать движку отображения Emacs места, куда помещать курсор при обходе этих строк. Это напрямую сообщает движку отображения, куда программа Lisp хочет поместить курсор или где пользователь ожидает курсор, когда точка находится на некоторой позиции буфера, «покрытой» строкой отображения или оверлея.

pointer

Это задает определенную форму указателя, когда указатель мыши находится над этим текстом или изображением. См. Форма указателя для возможных форм указателя.

line-spacing

Символ новой строки может иметь свойство текста или оверлея line-spacing, которое управляет высотой строки отображения, заканчивающейся этой новой строкой. Значение свойства переопределяет межстрочный интервал кадра по умолчанию и локальную переменную буфера line-spacing. См. Высота строки.

line-height

Символ новой строки может иметь свойство текста или оверлея line-height, которое управляет общей высотой строки отображения, заканчивающейся этой новой строкой. См. Высота строки.

wrap-prefix

Если область текста имеет свойство wrap-prefix, определенный им префикс будет добавлен во время отображения в начало каждой строки продолжения из-за переноса текста (поэтому если строки обрезаются, префикс переноса никогда не используется). Значение свойства может быть строкой или изображением (см. Другие спецификации отображения) или пробельным отступом, заданным свойствами отображения :width или :align-to (см. Заданные пробелы). Обратите внимание, что для того, чтобы свойство wrap-prefix подействовало, оно должно быть установлено для всей области текста, начиная с первого символа первой строки этого текста и до последнего символа последней строки; в противном случае разбиение текста на строки другим способом может не отобразить префикс, потому что движок отображения проверяет это свойство только сразу после продолжения строки.

Префикс переноса также может быть задан для всего буфера с помощью буферно-локальной переменной wrap-prefix (однако свойство текста wrap-prefix имеет приоритет над значением переменной wrap-prefix). См. Обрезание.

line-prefix

Если область текста имеет свойство line-prefix, определенный им префикс будет добавлен во время отображения в начало каждой строки, не являющейся продолжением. Значение свойства может быть строкой или изображением (см. Другие спецификации отображения) или пробельным отступом, заданным свойствами отображения :width или :align-to (см. Заданные пробелы). Обратите внимание, что для того, чтобы свойство line-prefix подействовало, оно должно быть установлено для всей области текста, начиная с первого символа первой строки этого текста и до последнего символа последней строки; в противном случае разбиение текста на строки другим способом может не отобразить префикс, потому что движок отображения проверяет это свойство только при начале новой строки.

Префикс строки также может быть задан для всего буфера с помощью буферно-локальной переменной line-prefix (однако свойство текста line-prefix имеет приоритет над значением переменной line-prefix). См. Обрезание.

modification-hooks

Если символ имеет свойство modification-hooks, его значение должно быть списком функций; изменение этого символа вызывает все эти функции до фактического изменения. Каждая функция получает два аргумента: начало и конец изменяемой части буфера. Обратите внимание, что если конкретная функция хука изменения присутствует у нескольких символов, изменяемых одной примитивной операцией, вы не можете предсказать, сколько раз функция будет вызвана. Кроме того, вставка не изменяет ни одного существующего символа, поэтому этот хук будет запускаться только при удалении некоторых символов, замене их другими или изменении их свойств текста.

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

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

insert-in-front-hooks
insert-behind-hooks

Операция вставки текста в буфер также вызывает функции, перечисленные в свойстве insert-in-front-hooks следующего символа и в свойстве insert-behind-hooks предыдущего символа. Эти функции получают два аргумента: начало и конец вставленного текста. Функции вызываются после фактической вставки.

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

См. также Хуки изменений для других хуков, вызываемых при изменении текста в буфере.

point-entered
point-left

Специальные свойства point-entered и point-left регистрируют функции-хуки, которые сообщают о перемещении точки. Каждый раз, когда точка перемещается, Emacs сравнивает два этих значения свойства:

  • свойство point-left символа после старого местоположения и
  • свойство point-entered символа после нового местоположения.

Если эти два значения различаются, каждое из них вызывается (если не nil) с двумя аргументами: старым значением точки и новым.

Такое же сравнение выполняется для символов перед старым и новым местоположениями. В результате могут быть вызваны две функции point-left (которые могут быть одной и той же функцией) и/или две функции point-entered (которые могут быть одной и той же функцией). В любом случае сначала вызываются все функции point-left, за ними следуют все функции point-entered.

Можно использовать char-after для проверки символов в различных позициях буфера без перемещения точки в эти позиции. Только фактическое изменение значения точки запускает эти функции-хуки.

Переменная inhibit-point-motion-hooks по умолчанию запрещает выполнение хуков point-left и point-entered, см. Запрет хуков перемещения точки.

Эти свойства устарели; используйте вместо них cursor-sensor-functions.

cursor-sensor-functions

Это специальное свойство регистрирует список функций, реагирующих на движение курсора. Каждая функция в списке вызывается непосредственно перед перерисовкой с тремя аргументами: затронутое окно, предыдущая известная позиция курсора и один из символов entered или left, в зависимости от того, входит ли курсор в текст с этим свойством или покидает его. Функции вызываются только тогда, когда включен второстепенный режим cursor-sensor-mode.

Когда переменная cursor-sensor-inhibit не равна nil, свойство cursor-sensor-functions игнорируется.

composition

Это свойство текста используется для отображения последовательности символов как одного глифа, составленного из компонентов. Но значение самого свойства является полностью внутренним для Emacs и не должно изменяться напрямую, например, с помощью put-text-property.

minibuffer-message

Это свойство текста указывает, где отображать временные сообщения в активном минибуфере. В частности, первый символ текста минибуфера, имеющий это свойство, будет отображать временное сообщение перед ним. По умолчанию временные сообщения отображаются в конце текста минибуфера. Это свойство текста используется функцией, которая является значением по умолчанию для set-message-function (см. Отображение сообщений в области эхо).

display-line-numbers-disable

Это свойство текста предотвращает отображение номеров строк (см. display-line-numbers в Руководстве GNU Emacs) для текста, имеющего это свойство.

Переменная: inhibit-point-motion-hooks

Когда эта устаревшая переменная не равна nil, хуки point-left и point-entered не запускаются, а свойство intangible не действует. Не устанавливайте эту переменную глобально; связывайте ее с помощью let. Поскольку затронутые свойства устарели, значение этой переменной по умолчанию — t, чтобы эффективно отключить их.

Переменная: show-help-function

Если эта переменная не равна nil, она задает функцию, вызываемую для отображения строк помощи. Это могут быть свойства help-echo, строки помощи меню (см. Простые пункты меню, см. Расширенные пункты меню) или строки помощи панели инструментов (см. Панели инструментов). Указанная функция вызывается с одним аргументом — строкой помощи для отображения, которая передается через substitute-command-keys перед передачей функции, если только строка помощи не имеет ненулевого свойства help-echo-inhibit-substitution на своем первом символе; см. Подстановка привязок клавиш в документации. См. код режима Tooltip (см. Всплывающие подсказки в Руководстве GNU Emacs) для примера режима, использующего show-help-function.

Переменная: face-filters-always-match

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