Сброс пользовательской переменной на значение по умолчанию программно

25

Q: Используя Elisp, как я могу сбросить переменную к ее значению по умолчанию, не зная, что это за значение?

Я попытался выяснить, как это сделать, вызвав интерфейс Customize для переменной, для которой я установил значение, отличное от значения по умолчанию, в моем файле инициализации и нажав, C-h kа затем щелкнув по кнопке «Revert ...». Это вызвало документацию widget-button-click, которая, очевидно, не сильно помогла. (Точно так же, C-h k RETкогда точка на кнопке показывает справку Custom-newline, это тоже не то, что я ищу.)

itsjeyd
источник
3
Связанные, для нестандартных переменных: emacs.stackexchange.com/q/10800/50
Малабарба,

Ответы:

23

C-hig (elisp) Variable Definitions

Внутренне defcustomиспользует свойство символа standard-valueдля записи выражения для стандартного значения, saved-valueдля записи значения, сохраненного пользователем в буфере настройки, и customized-valueдля записи значения, установленного пользователем в буфере настройки, но не сохраненного. См. Свойства символа . Эти свойства являются списками, carиз которых является выражением, которое оценивает значение.

Следовательно:

(setq foo (eval (car (get 'foo 'standard-value))))

Обратите внимание, что это относится только к defcustomпеременным (т. Е. «Параметры пользователя»). Emacs нигде не сохраняет начальное значение defvarпеременной.

Phils
источник
3
На самом деле, вам нужно оценить вейл в листе. Ваш пример должен быть изменен на: (setq foo (eval (car (get 'foo 'standard-value))))Форма значения по умолчанию, сгенерированная с помощью defcustom- это форма с funcall и замыканием (возможно, это происходит только при включенной лексической привязке)
Elias Mårtenson
Вы, вероятно, хотите использовать, setq-defaultа не setqв этом случае.
sanityinc
11

Другой, возможно, более чистый способ сброса значения переменной:

custom-reevaluate-settingявляется скомпилированной лисповской функцией в custom.el.

(custom-reevaluate-setting SYMBOL)

Сбросьте значение SYMBOL, повторно оценив его сохраненное или стандартное значение. Используйте :setфункцию, чтобы сделать это. Это полезно для настраиваемых параметров, которые определены до того, как их стандартное значение действительно может быть вычислено. Например, выгруженные переменные, чьи значения по умолчанию зависят от информации времени выполнения

Так, например:

(custom-reevaluate-setting 'emms-player-next-function)

заменит предыдущее значение с этим символом standard-value.

РЕДАКТИРОВАТЬ

Прочитайте комментарий @phils ниже для получения очень важной информации об этой функции.

undostres
источник
5
Отметьте « сохраненное или стандартное значение». В этом порядке приоритета. Если пользователь настроил и сохранил значение для переменной, эта функция сбрасывает его saved-value, а не его standard-value.
phils