同様の設定関数がいくつかあります。
- セット & セットク
- デフォルト設定
- カスタム定義
- カスタム設定値
- カスタム セット変数
- カスタマイズ設定値
- カスタマイズ セット変数
それで、これらの機能の違いは何ですか?
これらのシナリオで、独自の設定をアドオンに設定する場合:
- defcustomで変数設定する場合、どの設定機能が良いでしょうか?
- また、defvar による変数設定はどうでしょうか。
set
およびsetq
は、あらゆる種類の変数を割り当てるために使用される最低レベルのプリミティブです。set-default
およびsetq-default
は、新しいバッファーに使用されるデフォルト値を設定できるようにするために、バッファーローカル変数と一緒に使用する emacs 拡張機能です。3-7. すべての「カスタム」のものは、ユーザー設定として使用することを目的とした変数を管理するためのユーザー インターフェイスをサポートするように設計された、後で追加されたものです。defcustom
に似てdefvar
いますが、オプションの階層内の場所とデータ型情報を指定できるため、UI は値をメニューとして表示したり、ユーザー入力を適切な型に自動的に変換したりできます。custom-set-value
ます。custom-set-variables
すべてのユーザー オプションを保存するときに、カスタマイズ UI によって使用されます。ユーザーがデフォルトから変更したすべての変数をリストします。6-7。オプション変数の現在の値とデフォルト値の入力をユーザーに促し、それらを割り当てるために、Customize UI によって使用されますcustom-set-value
。custom-set-variable
通常、これを自分で呼び出すことはありません。さらに、レキシカルバインディングの導入により、これらのコマンド間の違いが増えましたが、いくつかの変数をカスタマイズしたいだけであれば、これらの違いは実際には関係ありません。
def...
コンストラクトはグローバル変数を宣言します。set...
関数は、グローバルまたはローカルにかかわらず、変数を設定します。がx
ローカル変数 (現在の関数の仮パラメーターまたはlet
フォームまたは類似のものによって宣言されている) でもdef...
フォームによって定義されていない場合(setq x 0)
、バイト コンパイラーは警告を表示します。
Warning: assignment to free variable `x'
defvar
, defcustom
, で宣言された変数は、defconst
動的にバインドされます。つまり、構造がある場合
(let ((lisp-indent-offset 2))
(pp (some-function)))
関数some-function
はグローバル変数の変更を認識しますlisp-indent-offset
。
変数が動的にバインドされていない場合、次のようになります
(let ((my-local-var 1))
(some-function))
wheremy-local-var
にはグローバル値がなく、some-function
レキシカル スコープであるため、割り当てられた値は表示されません。
一方、動的スコープの変数はレキシカル クロージャーに取り込まれません。
詳細については、http://www.gnu.org/software/emacs/manual/html_node/elisp/Lexical-Binding.htmlを参照してください。