Определение пользовательских переменных
Настраиваемые переменные, также называемые пользовательскими параметрами, являются глобальными переменными Lisp, значения которых могут быть установлены через интерфейс настройки. В отличие от других глобальных переменных, которые определяются с помощью defvar (см. Определение переменных), настраиваемые переменные определяются с помощью макроса defcustom. Помимо вызова defvar в качестве подпрограммы, defcustom указывает, как переменная должна отображаться в интерфейсе настройки, какие значения она может принимать и т. д.
- Макрос: defcustom option standard doc [keyword value]…
-
Этот макрос объявляет option в качестве пользовательского параметра (т. е. настраиваемой переменной). Не следует заключать option в кавычки.
Аргумент standard — это выражение, которое задаёт стандартное значение для option. Вычисление формы
defcustomвычисляет standard, но не обязательно связывает параметр с этим значением. Если у option уже есть значение по умолчанию, оно остаётся неизменным. Если пользователь уже сохранил настройку для option, пользовательское значение устанавливается в качестве значения по умолчанию. В противном случае результат вычисления standard устанавливается в качестве значения по умолчанию.Как и
defvar, этот макрос помечаетoptionкак специальную переменную, что означает, что она всегда должна быть динамически связана. Если option уже связан лексически, эта лексическая связь остаётся в силе до выхода конструкции связывания. См. Область действия переменных.Выражение standard может быть вычислено и в другие моменты — всякий раз, когда модуль настройки нуждается в стандартном значении option. Поэтому следует использовать выражение, безопасно вычисляемое в любое время.
Аргумент doc задаёт строку документации для переменной.
Если в
defcustomне указано никаких:group, будет использоваться последняя группа, определённая с помощьюdefgroupв том же файле. Таким образом, большинствоdefcustomне нуждаются в явном:group.При вычислении формы
defcustomс помощью C-M-x в режиме Emacs Lisp (eval-defun), специальная функцияeval-defunобеспечивает безусловное установление переменной, не проверяя, является ли её значение пустым. (Такая же функция применяется кdefvar, см. Определение переменных.) Использованиеeval-defunдля уже определённого defcustom вызывает функцию:set(см. ниже), если она существует.Если вы помещаете
defcustomв предварительно загруженный файл Emacs Lisp (см. Создание Emacs), стандартное значение, установленное при сохранении, может быть некорректным, например, потому что другая переменная, от которой оно зависит, ещё не получила правильное значение. В этом случае воспользуйтесьcustom-reevaluate-setting, описанной ниже, для повторного вычисления стандартного значения после запуска Emacs.
Помимо ключевых слов, перечисленных в Общие ключевые слова, этот макрос принимает следующие ключевые слова:
:type type-
Используйте type в качестве типа данных для этого параметра. Он определяет допустимые значения и способ их отображения (см. Типы настройки). Каждый
defcustomдолжен указывать значение для этого ключевого слова. :options value-list-
Укажите список допустимых значений для этого параметра. Пользователь не ограничен использованием только этих значений, но они предлагаются в качестве удобных альтернатив.
Это имеет смысл только для определённых типов, в настоящее время включая
hook,plistиalist. См. определение отдельных типов для описания использования:options.Повторное вычисление формы
defcustomс другим значением:optionsне очищает значения, добавленные предыдущими вычислениями, или добавленные вызовамиcustom-add-frequent-value(см. ниже). :set setfunction-
Укажите setfunction как способ изменения значения этого параметра при использовании интерфейса настройки. Функция setfunction должна принимать два аргумента: символ (имя параметра) и новое значение, и должна выполнять все необходимые действия для корректного обновления значения этого параметра (что может не означать простое присвоение параметра как переменной Lisp); предпочтительно, однако, она не должна разрушать свой аргумент value.
Если вы указываете это ключевое слово, строка документации переменной должна описывать, как выполнить ту же задачу в написанном вручную коде Lisp.
:get getfunction-
Укажите getfunction как способ извлечения значения этого параметра. Функция getfunction должна принимать один аргумент — символ — и возвращать то, что Custom должен использовать в качестве текущего значения для этого символа (что не обязательно должно быть значением символа в Lisp).
Для корректного использования
:getнеобходимо хорошо понимать принципы работы Custom. Она предназначена для значений, которые в Custom обрабатываются как переменные, но фактически не хранятся в переменных Lisp. Указание getfunction для значения, которое действительно хранится в переменной Lisp, почти наверняка является ошибкой. :initialize function-
function должна быть функцией, используемой для инициализации переменной при вычислении
defcustom. Она должна принимать два аргумента: имя параметра (символ) и значение. Вот некоторые предопределённые функции, предназначенные для использования таким образом:custom-initialize-set-
Используйте функцию
:setпеременной для инициализации переменной, но не повторно инициализируйте её, если она уже не пустая. custom-initialize-default-
Как
custom-initialize-set, но используйте функциюset-defaultдля установки переменной вместо функции:setпеременной. Это обычный выбор для переменной, чья функция:setвключает или выключает макрос; с этим выбором определение переменной не вызовет функцию макроса, но настройка переменной это сделает. custom-initialize-reset-
Всегда используйте функцию
:setдля инициализации переменной. Если переменная уже не пустая, сбросьте её, вызвав функцию:setс использованием текущего значения (возвращённого методом:get). Это стандартная функция:initialize. custom-initialize-changed-
Используйте функцию
:setдля инициализации переменной, если она уже установлена или была настроена; в противном случае просто используйтеset-default. custom-initialize-delayЭта функция ведет себя как
custom-initialize-set, но откладывает фактическую инициализацию до следующего запуска Emacs. Это следует использовать в файлах, которые загружаются предварительно (или для автоматически загружаемых переменных), чтобы инициализация выполнялась в контексте выполнения, а не в контексте сборки. Это также имеет побочный эффект, заключающийся в том, что (отложенная) инициализация выполняется с помощью функции:set. См. Создание Emacs.
:local value-
Если value равно
t, пометьте option как автоматически локальный для буфера; если значение равноpermanent, также установите свойство optionpermanent-localвt. См. Создание локальных для буфера. :risky value-
Установите свойство переменной
risky-local-variableв value (см. Локальные переменные файла). :safe function-
Установите свойство переменной
safe-local-variableв function (см. Локальные переменные файла). :set-after variables-
При установке переменных в соответствии с сохранёнными настройками убедитесь, что переменные variables установлены перед этой; т. е. отложите установку этой переменной до обработки других. Используйте
:set-after, если установка этой переменной не будет работать должным образом, пока другие переменные не получат свои целевые значения.
Полезно указывать ключевое слово :require для параметра, включающего определённую функцию. Это заставляет Emacs загружать функцию, если она ещё не загружена, всякий раз, когда параметр устанавливается. См. Общие ключевые слова. Вот пример:
(defcustom frobnicate-automatically nil "Non-nil means automatically frobnicate all buffers." :type 'boolean :require 'frobnicate-mode :group 'frobnicate)
Если элемент настройки имеет тип, такой как hook или alist, который поддерживает :options, вы можете добавить дополнительные значения в список вне объявления defcustom , вызвав custom-add-frequent-value. Например, если вы определяете функцию my-lisp-mode-initialization , предназначенную для вызова из emacs-lisp-mode-hook, вам, возможно, захочется добавить её в список допустимых значений для emacs-lisp-mode-hook, но не редактируя её определение. Вы можете сделать это так:
(custom-add-frequent-value 'emacs-lisp-mode-hook 'my-lisp-mode-initialization)
- Функция: custom-add-frequent-value symbol value
-
Для пользовательского параметра symbol добавьте value в список допустимых значений.
Точное действие добавления значения зависит от типа настройки symbol.
Поскольку вычисление формы
defcustomне очищает ранее добавленные значения, программы Lisp могут использовать эту функцию для добавления значений для пользовательских параметров, которые ещё не определены.
Внутренне, defcustom использует свойство символа standard-value для записи выражения стандартного значения, saved-value для записи значения, сохранённого пользователем с помощью буфера настройки, и customized-value для записи значения, установленного пользователем с помощью буфера настройки, но не сохранённого. См. Свойства символов. Кроме того, существует themed-value, который используется для записи значения, установленного темой (см. Темы Custom). Эти свойства представляют собой списки, первым элементом которых является выражение, вычисляющееся в значение.
- Функция: custom-reevaluate-setting символ
-
Эта функция переоценивает стандартное значение символа, который должен быть пользовательским параметром, объявленным через
defcustom. Если переменная была настраиваемой, эта функция переоценивает сохранённое значение вместо этого. Затем она устанавливает пользовательский параметр в это значение (используя свойство параметра:set, если оно определено).Это полезно для настраиваемых параметров, которые определяются до того, как их значение может быть вычислено правильно. Например, во время запуска Emacs вызывает эту функцию для некоторых пользовательских параметров, которые были определены в загруженных заранее файлах Emacs Lisp, но чьи начальные значения зависят от информации, доступной только во время выполнения.
- Функция: custom-variable-p арг
Эта функция возвращает не-
nilесли арг является настраиваемой переменной. Настраиваемая переменная — это либо переменная, которая имеет свойствоstandard-valueилиcustom-autoload(обычно означающее, что она была объявлена сdefcustom), либо псевдоним для другой настраиваемой переменной.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Variable-Definitions.html