Redefinir variável personalizada para o valor padrão programaticamente

25

P: Usando o Elisp, como posso redefinir uma variável para seu valor padrão sem saber qual é esse valor?

Tentei descobrir como fazer isso, exibindo a interface Customize para uma variável que eu defini como um valor não padrão no meu arquivo init e pressionando C-h kseguido de um clique no botão "Revert ...". Isso trouxe a documentação para widget-button-click, o que obviamente não ajudou muito. (Da mesma forma, C-h k RETcom apontar no botão mostra ajuda Custom-newline, o que também não é o que estou procurando.)

itsjeyd
fonte
3
Relacionada, por falta de costume vars: emacs.stackexchange.com/q/10800/50
Malabarba

Respostas:

23

C-hig (elisp) Variable Definitions

Internamente, defcustomusa a propriedade symbol standard-valuepara registrar a expressão para o valor padrão, saved-valuepara registrar o valor salvo pelo usuário com o buffer de customização e customized-valuepara registrar o valor configurado pelo usuário com o buffer de customização, mas não salvo. Consulte Propriedades do símbolo . Essas propriedades são listas, carcuja expressão é avaliada para o valor.

Conseqüentemente:

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

Observe que isso se aplica apenas a defcustomvariáveis ​​(ou seja, "opções do usuário"). O Emacs não salva o valor inicial de uma defvarvariável em nenhum lugar.

phils
fonte
3
Na verdade, você precisa avaliar o vale na lista. Seu exemplo deve ser alterada para: (setq foo (eval (car (get 'foo 'standard-value))))A forma valor padrão gerado por defcustomum formulário com um funcall e um fecho (isto é, possivelmente, a acontecer somente quando lexical ligação é ativada)
Elias Mårtenson
Você provavelmente deseja usar setq-defaulte não setqneste caso.
precisa saber é
11

Outra maneira, provavelmente mais limpa, de redefinir o valor de uma variável:

custom-reevaluate-settingé uma função Lisp compilada em custom.el.

(custom-reevaluate-setting SYMBOL)

Redefina o valor de SYMBOLreavaliando seu valor salvo ou padrão. Use a :setfunção para fazer isso. Isso é útil para opções personalizáveis ​​definidas antes que seu valor padrão possa realmente ser calculado. Por exemplo, variáveis ​​despejadas cujo padrão depende das informações de tempo de execução.

Então, por exemplo:

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

substituirá o valor anterior pelo símbolo standard-value.

EDITAR

Leia o comentário @phils abaixo para obter detalhes muito importantes sobre essa função.

undostres
fonte
5
Observe " valor salvo ou padrão". Nessa ordem de precedência. Se o usuário customizou e salvou um valor para a variável, essa função o redefinirá para seu valor saved-value, não para ele standard-value.
phils