Обычный способ определения лица — это использование макроса defface.
Этот макрос связывает имя лица (символ) с заданным face spec по умолчанию. Face spec — это конструкция, которая определяет, какие атрибуты должно иметь
лицо на любом терминале; например, face spec может указывать один цвет переднего плана для терминалов с поддержкой высокого цвета и другой цвет переднего плана для терминалов с поддержкой низкого цвета.
Иногда люди пытаются создать переменную, значением которой является имя лица. В подавляющем большинстве случаев это не нужно; обычная процедура — определить лицо с помощью defface, а затем использовать его имя напрямую.
Обратите внимание, что после того, как вы определили лицо (обычно с помощью defface), вы не сможете безопасно удалить это лицо позже, кроме как перезапустив Emacs.
Этот макрос объявляет face как именованное лицо, чье заданное face spec по умолчанию определяется spec. Вы не должны заключать символ face в кавычки, и он не должен оканчиваться на '-face' (это было бы избыточно). Аргумент doc — это строка документации для лица. Дополнительные аргументы keyword имеют то же значения, что и в defgroup и defcustom (см. Общие ключевые слова).
Если face уже имеет заданный face spec по умолчанию, этот макрос ничего не делает.
Заданный face spec по умолчанию определяет внешний вид face, когда не применяются пользовательские настройки (см. Настройки пользовательских настроек). Если face уже был настроен (через пользовательские темы или через настройки, прочитанные из файла инициализации), его внешний вид определяется пользовательским face spec(ами), которые переопределяют заданный face spec spec. Однако, если эти настройки впоследствии удаляются, внешний вид face снова определяется его заданным face spec.
В качестве исключения, если вы вычисляете форму defface с помощью C-M-x (eval-defun) или с помощью C-x C-e (eval-last-sexp) в режиме Emacs Lisp, специальная функция этих команд переопределяет любые пользовательские face specs для лица, заставляя лицо отображать в точности то, что указано в defface.
Аргумент spec — это face spec, который указывает, как лицо должно выглядеть на разных типах терминалов. Это должен быть alist, элементы которого имеют вид
(display . plist)
display указывает класс терминалов (см. ниже). plist — это список свойств атрибутов лица и их значений, определяющий, как лицо выглядит на таких терминалах. Для обратной совместимости вы также можете записать элемент как (display plist).
Часть display элемента spec определяет, какие терминалы соответствует этот элемент. Если более одного элемента spec соответствует заданному терминалу, используется первый соответствующий элемент. Существует три возможности для display:
defaultЭтот элемент spec не соответствует ни одному терминалу; вместо этого он определяет значения по умолчанию, которые применяются ко всем терминалам. Этот элемент, если он используется, должен быть первым элементом spec. Каждый из следующих элементов может переопределять любые или все эти значения по умолчанию.
tЭтот элемент spec соответствует всем терминалам. Следовательно, любые последующие элементы spec никогда не используются. Обычно t используется в последнем (или единственном) элементе spec.
Если display — это список, каждый элемент должен иметь вид
(characteristic value…). Здесь characteristic определяет способ классификации терминалов, а value — это возможные классификации, к которым display должен применяться. Вот возможные значения characteristic:
typeТип системы окон, которую использует терминал — либо graphic (любой дисплей с поддержкой графики), x, pc (для консоли MS-DOS), w32 (для MS Windows 9X/NT/2K/XP), haiku (для Haiku), pgtk (для чистого GTK), android (для Android) или tty (дисплей без поддержки графики). См. window-system.
classКакие типы цветов поддерживает терминал — либо color, grayscale или mono.
backgroundТип фона — либо light или dark.
min-colorsЦелое число, представляющее минимальное количество цветов, которые должен поддерживать терминал. Это соответствует терминалу, если его значение display-color-cells не меньше указанного целого числа.
supportsПоддерживает ли терминал атрибуты лица, указанные в value… (см. Атрибуты лиц). См. Проверка атрибутов лица дисплея, для получения более подробной информации о том, как именно выполняется эта проверка.
Если элемент display указывает более одного value для заданной characteristic, любой из этих значений приемлем. Если display имеет более одного элемента, каждый элемент должен указывать на разную characteristic; тогда каждая характеристика терминала должна соответствовать одному из value, указанных для нее в display.
Например, вот определение стандартного лица highlight:
(defface highlight
'((((class color) (min-colors 88) (background light))
:background "darkseagreen2")
(((class color) (min-colors 88) (background dark))
:background "darkolivegreen")
(((class color) (min-colors 16) (background light))
:background "darkseagreen2")
(((class color) (min-colors 16) (background dark))
:background "darkolivegreen")
(((class color) (min-colors 8))
:background "green" :foreground "black")
(t :inverse-video t))
"Базовое лицо для выделения."
:group 'basic-faces)
Внутренне Emacs хранит заданный face spec каждого лица в его символьном свойстве face-defface-spec (см. Свойства символов). Свойство saved-face хранит любой face spec, сохраненный пользователем с помощью буфера настройки; свойство customized-face хранит face spec, настроенный для текущей сессии, но не сохранен; а свойство theme-face хранит alist, связывающий активные настройки пользовательских настроек и пользовательские темы с face specs для этого лица. Строка документации лица хранится в свойстве face-documentation.
Обычно лицо объявляется только один раз, с помощью defface, а любые дальнейшие изменения его внешнего вида применяются с помощью фреймворка Customize (например, через пользовательский интерфейс Customize или через функцию custom-set-faces; см. Применение настроек), или путем переназначения лиц (см. Переназначение лиц). В редком случае, если вам необходимо изменить face spec напрямую из Lisp, вы можете использовать функцию face-spec-set.
Эта функция применяет spec как face spec для face. spec должен быть face spec, как описано в вышеуказанной документации для defface.
Эта функция также объявляет face как допустимое имя лица, если оно еще не является таковым, и (пере)вычисляет его атрибуты на существующих фреймах.
Необязательный аргумент spec-type определяет, какой spec установить. Если он опущен или равен nil или face-override-spec, эта функция устанавливает override spec, который переопределяет face specs для face всех других типов, упомянутых ниже. Это полезно при вызове этой функции вне кода Customize. Если spec-type равен customized-face или saved-face, эта функция устанавливает настроенный spec или сохраненный пользовательский spec соответственно. Если это face-defface-spec, эта функция устанавливает заданный face spec по умолчанию (тот же, что и тот, который был установлен defface). Если это reset, эта функция очищает все пользовательские specs и override specs для face (в этом случае значение spec игнорируется). Эффект любого другого значения spec-type на face specs зарезервирован для внутреннего использования, но функция все равно объявит face и пересчитает его атрибуты, как описано выше.