Restablecer la variable personalizada al valor predeterminado mediante programación

25

P: Usando Elisp, ¿cómo puedo restablecer una variable a su valor predeterminado sin saber cuál es ese valor?

Intenté descubrir cómo hacer esto al abrir la interfaz Personalizar para una variable que configuré en un valor no predeterminado en mi archivo de inicio y presionar C-h kseguido de un clic en el botón "Revertir ...". Eso trajo la documentación para widget-button-click, que obviamente no ayudó mucho. (Del mismo modo, C-h k RETcon el punto en el botón muestra ayuda para Custom-newline, que tampoco es lo que estoy buscando).

itsjeyd
fuente
3
Relacionado, para vars no personalizados: emacs.stackexchange.com/q/10800/50
Malabarba

Respuestas:

23

C-hig (elisp) Variable Definitions

Internamente, defcustomutiliza la propiedad de símbolo standard-valuepara registrar la expresión para el valor estándar, saved-valuepara registrar el valor guardado por el usuario con el búfer de personalización y customized-valuepara registrar el valor establecido por el usuario con el búfer de personalización, pero no guardado. Ver Propiedades del símbolo . Estas propiedades son listas, la carcual es una expresión que evalúa el valor.

Por lo tanto:

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

Tenga en cuenta que esto solo se aplica a las defcustomvariables (es decir, "opciones de usuario"). Emacs no guarda el valor inicial de una defvarvariable en ninguna parte.

phils
fuente
3
En realidad, debes evaluar el valle en la lista. Su ejemplo debería cambiarse a: (setq foo (eval (car (get 'foo 'standard-value))))El formulario de valor predeterminado generado por defcustomes un formulario con un funcall y un cierre (esto posiblemente solo ocurre cuando el enlace léxico está habilitado)
Elias Mårtenson
Probablemente desee usar en setq-defaultlugar de setqen este caso.
sanityinc
11

Otra forma, probablemente más limpia, de restablecer el valor de una variable:

custom-reevaluate-settinges una función compilada de Lisp en custom.el.

(custom-reevaluate-setting SYMBOL)

Restablezca el valor de SYMBOLmediante la reevaluación de su valor guardado o estándar. Usa la :setfunción para hacerlo. Esto es útil para las opciones personalizables que se definen antes de que realmente se pueda calcular su valor estándar. Por ejemplo, variables volcadas cuyo valor predeterminado depende de la información del tiempo de ejecución.

Así por ejemplo:

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

reemplazará el valor anterior con ese símbolo standard-value.

EDITAR

Lea el comentario de @phils a continuación para obtener detalles muy importantes sobre esta función.

undostres
fuente
55
Nota " valor guardado o estándar". En ese orden de precedencia. Si el usuario ha personalizado y guardado un valor para la variable, esta función lo restablece a su valor saved-value, no a su valor standard-value.
phils