15.6 Пользовательские темы

Пользовательские темы — это наборы настроек, которые можно включать или отключать как единое целое. См. Пользовательские темы в Руководстве по GNU Emacs. Каждая пользовательская тема определяется файлом исходного кода Emacs Lisp, который должен соответствовать соглашениям, описанным в этом разделе. (Вместо того чтобы писать пользовательскую тему вручную, вы также можете создать её с помощью интерфейса, подобного Customize; см. Создание пользовательских тем в Руководстве по GNU Emacs.)

Файл пользовательской темы должен называться foo-theme.el, где foo — это имя темы. Первой формой Lisp в файле должен быть вызов deftheme, а последней формой — вызов provide-theme.

Макрос: deftheme тема &optional описание &rest свойства

Этот макрос объявляет тему (символ) как имя пользовательской темы. Необязательный аргумент описание должен быть строкой, описывающей тему; это описание показывается, когда пользователь вызывает команду describe-theme или нажимает ? в буфере ‘*Custom Themes*’. Остальные аргументы свойства используются для передачи списка свойств с атрибутами темы.

Поддерживаются следующие атрибуты:

:family

Символ, обозначающий, к какому “семейству” принадлежит тема. Семейство тем — это набор похожих тем, отличающихся незначительными аспектами, например, цветами лиц, предназначенными для светлого или тёмного фона кадра.

:kind

Символ. Если тема включена и это свойство имеет значение color-scheme, то команда theme-choose-variant будет искать другие доступные темы, принадлежащие к тому же семейству, чтобы переключить темы. Другие значения в настоящее время не определены и не должны использоваться.

:background-mode

Символ, либо light, либо dark. Этот атрибут в настоящее время не используется, но его всё равно следует указывать.

Два специальных имени тем запрещены (их использование вызывает ошибку): user — это фиктивная тема, хранящая непосредственные настройки пользователя, а changed — это фиктивная тема, хранящая изменения, сделанные вне системы Customize.

Макрос: provide-theme тема

Этот макрос объявляет, что тема с именем тема полностью определена.

Между deftheme и provide-theme находятся формы Lisp, задающие настройки темы: обычно вызов custom-theme-set-variables и/или вызов custom-theme-set-faces.

Функция: custom-theme-set-variables тема &rest аргументы

Эта функция задаёт настройки переменных для пользовательской темы тема. Тема должна быть символом. Каждый аргумент в аргументах должен быть списком вида

(переменная выражение [сейчас [запрос [комментарий]]])

где элементы списка имеют те же значения, что и в custom-set-variables. См. Применение настроек.

Функция: custom-theme-set-faces тема &rest аргументы

Эта функция задаёт настройки лиц для пользовательской темы тема. Тема должна быть символом. Каждый аргумент в аргументах должен быть списком вида

(лицо спецификация [сейчас [комментарий]])

где элементы списка имеют те же значения, что и в custom-set-faces. См. Применение настроек.

Теоретически файл темы может также содержать другие формы Lisp, которые будут вычислены при загрузке темы, но это плохая практика. Для защиты от загрузки тем, содержащих вредоносный код, Emacs отображает исходный файл и запрашивает подтверждение у пользователя перед первой загрузкой любой не встроенной темы. Поэтому темы обычно не компилируются в байт-код, и исходные файлы обычно имеют приоритет, когда Emacs ищет тему для загрузки.

Следующие функции полезны для программного включения и отключения тем:

Функция: custom-theme-p тема

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

Переменная: custom-known-themes

Значение этой переменной — список тем, загруженных в Emacs. Каждая тема представлена символом Lisp (именем темы). Значение по умолчанию этой переменной — список, содержащий две фиктивные темы: (user changed). Тема changed хранит настройки, сделанные до применения каких-либо пользовательских тем (например, переменные, установленные вне Customize). Тема user хранит настройки, которые пользователь настроил и сохранил. Любые дополнительные темы, объявленные с помощью макроса deftheme, добавляются в начало этого списка.

Команда: load-theme тема &optional без-подтверждения без-включения

Эта функция загружает пользовательскую тему с именем тема из её исходного файла, выполняя поиск исходного файла в каталогах, указанных переменной custom-theme-load-path. См. Пользовательские темы в Руководстве по GNU Emacs. Она также включает тему (если только необязательный аргумент без-включения не равен nil), в результате чего её настройки переменных и лиц вступают в силу. Она запрашивает у пользователя подтверждение перед загрузкой темы, если только необязательный аргумент без-подтверждения не равен nil.

Функция: require-theme особенность &optional без-ошибки

Эта функция выполняет поиск в 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 тема

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

Команда: disable-theme тема

Эта функция отключает пользовательскую тему с именем тема. Тема остаётся загруженной, так что последующий вызов enable-theme снова включит её.