プログラムでカスタム変数をデフォルト値にリセットする


25

Q: Elispを使用して、変数の値を知らずに変数をデフォルト値にリセットするにはどうすればよいですか?

initファイルでデフォルト以外の値に設定した変数のカスタマイズインターフェースを表示し、を押しC-h kてから[元に戻す...]ボタンをクリックすることで、これを行う方法を見つけようとしました。これにより、のドキュメントが表示されましたがwidget-button-click、明らかにあまり役に立ちませんでした。(同様C-h k RETに、ボタン上のポイントでのヘルプが表示されますがCustom-newline、これも私が探しているものではありません。)


3
関連、非カスタム変数の場合:emacs.stackexchange.com/q/10800/50
Malabarba

回答:


23

C-hig (elisp) Variable Definitions

内部的にdefcustomは、symbolプロパティstandard-valueを使用して、標準値の式saved-valueを記録し、ユーザーが保存した値をカスタマイズバッファーcustomized-valueに記録し、ユーザーが設定した値をカスタマイズバッファーに保存しますが、保存しません。シンボルのプロパティを参照してください。これらのプロパティはリストであり、そのリストcarは値に評価される式です。

したがって:

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

これはdefcustom変数(つまり「ユーザーオプション」)にのみ適用されることに注意してください。Emacsはdefvar変数の初期値をどこにも保存しません。


3
実際には、plistの値を評価する必要があります。例は次のように変更する必要があり(setq foo (eval (car (get 'foo 'standard-value))))ます。によって生成されるデフォルト値フォームdefcustomは、funcallとクロージャーを含むフォームです(これは、おそらく字句バインディングが有効な場合にのみ発生します)
エリアスマーテンソン14年

この場合setq-defaultよりもsetq、おそらく使用したいでしょう。
sanityinc 14年

11

変数の値をリセットする別の、おそらくよりクリーンな方法:

custom-reevaluate-settingはでコンパイルされたLisp関数ですcustom.el

(custom-reevaluate-setting SYMBOL)

SYMBOL保存した値または標準値を再評価して、値をリセットします。:setこれを行うには、関数を使用します。これは、標準値を実際に計算する前に定義されているカスタマイズ可能なオプションに役立ちます。たとえば、デフォルトが実行時情報に依存するダンプ変数。

たとえば、次のとおりです。

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

前の値をそのシンボルのに置き換えstandard-valueます。

編集

この関数に関する非常に重要な詳細については、以下の@philsコメントをお読みください。


5
保存値または標準値」に注意してください。その優先順位。ユーザーが変数の値をカスタマイズして保存している場合、この関数saved-valueはその値をにではなくにリセットしますstandard-value
phils
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.