47

同様の設定関数がいくつかあります。

  1. セット & セットク
  2. デフォルト設定
  3. カスタム定義
  4. カスタム設定値
  5. カスタム セット変数
  6. カスタマイズ設定値
  7. カスタマイズ セット変数

それで、これらの機能の違いは何ですか?

これらのシナリオで、独自の設定をアドオンに設定する場合:

  1. defcustomで変数設定する場合、どの設定機能が良いでしょうか?
  2. また、defvar による変数設定はどうでしょうか。
4

4 に答える 4

5
  1. setおよびsetqは、あらゆる種類の変数を割り当てるために使用される最低レベルのプリミティブです。
  2. set-defaultおよびsetq-defaultは、新しいバッファーに使用されるデフォルト値を設定できるようにするために、バッファーローカル変数と一緒に使用する emacs 拡張機能です。3-7. すべての「カスタム」のものは、ユーザー設定として使用することを目的とした変数を管理するためのユーザー インターフェイスをサポートするように設計された、後で追加されたものです。
  3. defcustomに似てdefvarいますが、オプションの階層内の場所とデータ型情報を指定できるため、UI は値をメニューとして表示したり、ユーザー入力を適切な型に自動的に変換したりできます。
  4. 機能はないと思いcustom-set-valueます。
  5. custom-set-variablesすべてのユーザー オプションを保存するときに、カスタマイズ UI によって使用されます。ユーザーがデフォルトから変更したすべての変数をリストします。6-7。オプション変数の現在の値とデフォルト値の入力をユーザーに促し、それらを割り当てるために、Customize UI によって使用されますcustom-set-valuecustom-set-variable通常、これを自分で呼び出すことはありません。
于 2012-08-21T16:45:27.197 に答える
3

さらに、レキシカルバインディングの導入により、これらのコマンド間の違いが増えましたが、いくつかの変数をカスタマイズしたいだけであれば、これらの違いは実際には関係ありません。

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を参照してください。

于 2013-06-27T12:50:22.677 に答える