42.12.5 Переназначение лиц

Переменная face-remapping-alist используется для буферно-локальных или глобальных изменений внешнего вида лица. Например, она используется для реализации команды text-scale-adjust (см. Масштабирование текста в Руководстве GNU Emacs).

Переменная: face-remapping-alist

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

переназначение может быть любой спецификацией лица, подходящей для текстового свойства face: либо лицо (т.е. имя лица или список свойств вида «атрибут/значение»), либо список лиц. Подробности см. в описании текстового свойства face в Свойства со специальным значением. переназначение служит полной спецификацией для переназначенного лица — оно заменяет обычное определение лицо, а не модифицирует его.

Если face-remapping-alist является буферно-локальным, его локальное значение действует только в этом буфере. Если face-remapping-alist включает лица, применимые только к определённым окнам, через использование (:filtered (:window парам знач) спец), то это лицо действует только в окнах, которые соответствуют условиям фильтра (см. Свойства со специальным значением). Чтобы временно отключить фильтрацию лиц, привяжите face-filters-always-match к значению, отличному от nil, тогда все фильтры лиц будут соответствовать любому окну.

Примечание: переназначение лиц не является рекурсивным. Если переназначение ссылается на то же имя лица лицо, либо напрямую, либо через атрибут :inherit другого лица в переназначение, то эта ссылка использует обычное определение лицо. Например, если лицо mode-line переназначено с использованием этой записи в face-remapping-alist:

(mode-line italic mode-line)

то новое определение лица mode-line наследует от лица italic и обычное (не переназначенное) определение лица mode-line.

Следующие функции реализуют интерфейс более высокого уровня к face-remapping-alist. В большинстве случаев Lisp-код должен использовать эти функции вместо прямой установки face-remapping-alist, чтобы не нарушать переназначения, применённые в других местах. Эти функции предназначены для буферно-локальных переназначений, поэтому все они делают face-remapping-alist буферно-локальным как побочный эффект. Они управляют записями face-remapping-alist вида

  (лицо относительная-спец-1 относительная-спец-2 ... базовая-спец)

где, как объяснено выше, каждая из относительная-спец-N и базовая-спец является либо именем лица, либо списком свойств вида «атрибут/значение». Каждая из записей относительного переназначения, относительная-спец-N, управляется функциями face-remap-add-relative и face-remap-remove-relative; они предназначены для простых модификаций, например изменения размера текста. Запись базового переназначения, базовая-спец, имеет наименьший приоритет и управляется функциями face-remap-set-base и face-remap-reset-base; она предназначена для основных режимов, чтобы переназначать лица в управляемых ими буферах.

Функция: face-remap-add-relative лицо &rest спец-список

Эта функция добавляет спец-список как относительные переназначения для лица лицо в текущем буфере. спец-список должен быть списком, где каждый элемент является либо именем лица, либо списком свойств вида «атрибут/значение».

Возвращаемое значение является Lisp-объектом, который служит маркером; вы можете передать этот объект как аргумент face-remap-remove-relative, если вам нужно будет позднее удалить это переназначение.

;; Переназначить лицо 'escape-glyph' в комбинацию
;; лиц 'highlight' и 'italic':
(face-remap-add-relative 'escape-glyph 'highlight 'italic)

;; Увеличить размер лица 'default' на 50%:
(face-remap-add-relative 'default :height 1.5)

Обратите внимание, что буферно-локальное переназначение лиц не работает надёжно для родительских лиц базовых лиц (см. Базовые лица). (Это лица, которые используются в строках режима, строках заголовка и других базовых украшениях окон и фреймов). Например, mode-line-inactive наследует от mode-line, но переназначение mode-line обычно не даёт желаемого эффекта на mode-line-inactive, особенно если оно выполнено локально для некоторых буферов. Вместо этого вам нужно переназначить mode-line-inactive напрямую.

Функция: face-remap-remove-relative маркер

Эта функция удаляет относительное переназначение, ранее добавленное face-remap-add-relative. маркер должен быть Lisp-объектом, возвращённым face-remap-add-relative при добавлении переназначения.

Функция: face-remap-set-base лицо &rest спец-список

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

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

Функция: face-remap-reset-base лицо

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