Пользовательские темы — это наборы настроек, которые можно включать или отключать как единое целое. См. Пользовательские темы в Руководстве по GNU Emacs. Каждая пользовательская тема определяется файлом исходного кода Emacs Lisp, который должен соответствовать соглашениям, описанным в этом разделе. (Вместо того чтобы писать пользовательскую тему вручную, вы также можете создать её с помощью интерфейса, подобного Customize; см. Создание пользовательских тем в Руководстве по GNU Emacs.)
Файл пользовательской темы должен называться foo-theme.el, где
foo — это имя темы. Первой формой Lisp в файле должен быть
вызов deftheme, а последней формой — вызов
provide-theme.
Этот макрос объявляет тему (символ) как имя пользовательской
темы. Необязательный аргумент описание должен быть строкой, описывающей
тему; это описание показывается, когда пользователь вызывает
команду describe-theme или нажимает ? в буфере ‘*Custom
Themes*’. Остальные аргументы свойства используются для
передачи списка свойств с атрибутами темы.
Поддерживаются следующие атрибуты:
:familyСимвол, обозначающий, к какому “семейству” принадлежит тема. Семейство тем — это набор похожих тем, отличающихся незначительными аспектами, например, цветами лиц, предназначенными для светлого или тёмного фона кадра.
:kindСимвол. Если тема включена и это свойство имеет значение
color-scheme, то команда theme-choose-variant будет
искать другие доступные темы, принадлежащие к тому же семейству,
чтобы переключить темы. Другие значения в настоящее время не определены
и не должны использоваться.
:background-modeСимвол, либо light, либо dark. Этот атрибут в настоящее
время не используется, но его всё равно следует указывать.
Два специальных имени тем запрещены (их использование вызывает ошибку):
user — это фиктивная тема, хранящая непосредственные настройки
пользователя, а changed — это фиктивная тема, хранящая
изменения, сделанные вне системы Customize.
Этот макрос объявляет, что тема с именем тема полностью определена.
Между deftheme и provide-theme находятся формы Lisp,
задающие настройки темы: обычно вызов
custom-theme-set-variables и/или вызов
custom-theme-set-faces.
Эта функция задаёт настройки переменных для пользовательской темы тема. Тема должна быть символом. Каждый аргумент в аргументах должен быть списком вида
(переменная выражение [сейчас [запрос [комментарий]]])
где элементы списка имеют те же значения, что и в
custom-set-variables. См. Применение настроек.
Эта функция задаёт настройки лиц для пользовательской темы тема. Тема должна быть символом. Каждый аргумент в аргументах должен быть списком вида
(лицо спецификация [сейчас [комментарий]])
где элементы списка имеют те же значения, что и в
custom-set-faces. См. Применение настроек.
Теоретически файл темы может также содержать другие формы Lisp, которые будут вычислены при загрузке темы, но это плохая практика. Для защиты от загрузки тем, содержащих вредоносный код, Emacs отображает исходный файл и запрашивает подтверждение у пользователя перед первой загрузкой любой не встроенной темы. Поэтому темы обычно не компилируются в байт-код, и исходные файлы обычно имеют приоритет, когда Emacs ищет тему для загрузки.
Следующие функции полезны для программного включения и отключения тем:
Эта функция возвращает не nil, если тема (символ)
является именем пользовательской темы (т.е. пользовательской темы, которая
была загружена в Emacs, независимо от того, включена она или нет).
В противном случае она возвращает nil.
Значение этой переменной — список тем, загруженных в Emacs.
Каждая тема представлена символом Lisp (именем темы). Значение
по умолчанию этой переменной — список, содержащий две фиктивные
темы: (user changed). Тема changed хранит
настройки, сделанные до применения каких-либо пользовательских тем (например,
переменные, установленные вне Customize). Тема user хранит настройки,
которые пользователь настроил и сохранил. Любые дополнительные темы, объявленные с
помощью макроса deftheme, добавляются в начало этого списка.
Эта функция загружает пользовательскую тему с именем тема из её исходного
файла, выполняя поиск исходного файла в каталогах, указанных переменной
custom-theme-load-path. См. Пользовательские темы в Руководстве по GNU Emacs. Она также включает тему (если только
необязательный аргумент без-включения не равен nil), в результате
чего её настройки переменных и лиц вступают в силу. Она запрашивает у пользователя
подтверждение перед загрузкой темы, если только необязательный аргумент
без-подтверждения не равен nil.
Эта функция выполняет поиск в custom-theme-load-path файла, который предоставляет
особенность, а затем загружает его. Это похоже на функцию
require (см. Особенности), за исключением того, что поиск выполняется в
custom-theme-load-path вместо load-path
(см. Поиск библиотек). Это может быть полезно в пользовательских темах, которым
необходимо загружать вспомогательные файлы Lisp, когда require для этого
не подходит.
Если особенность (которая должна быть символом) ещё не присутствует в
текущем сеансе Emacs согласно featurep, то
require-theme выполняет поиск файла с именем особенность с
добавленным суффиксом ‘.elc’ или ‘.el’ (в указанном порядке) в
каталогах, заданных custom-theme-load-path.
Если файл, предоставляющий особенность, успешно найден и загружен,
то require-theme возвращает особенность. Необязательный
аргумент без-ошибки определяет, что произойдёт, если поиск или
загрузка завершатся неудачей. Если он равен nil, функция вызывает
ошибку; в противном случае она возвращает nil. Если файл загружается успешно,
но не предоставляет особенность, то require-theme вызывает
ошибку; это нельзя подавить.
Эта функция включает пользовательскую тему с именем тема. Она вызывает ошибку, если такая тема не была загружена.
Эта функция отключает пользовательскую тему с именем тема. Тема
остаётся загруженной, так что последующий вызов enable-theme снова
включит её.