カスタマイズ可能変数(customizable variable)はユーザーオプション(user
option)とも呼ばれ、これはCustomizeインターフェースを通じてセットできるグローバルなLisp変数です。defvar
(グローバル変数の定義を参照)デ定義される他のグローバル変数と異なり、カスタマイズ可能変数はdefcustom
マクロを使用して定義されます。サブルーチンとしてdefvar
を呼び出すことに加えテ、defcustom
はCustomizeインターフェースでその変数が表示される方法や、その変数がとることができる値などを明示します。
このマクロはユーザーオプション(かカスタマイズ可能変数)としてoptionを宣言する。optionはクォートしないこと。
引数standardはoptionの標準値を指定する式である。defcustom
フォームの評価によりstandardが評価されるが、その値にそのオプションをバインドする必要はない。optionがすでにデフォルト値をもつなら、それは変更されずに残る。ユーザーがすでにoptionにたいするカスタマイゼーションを保存していれば、ユーザーによりカスタマイズされた値がデフォルト値としてインストールされる。それ以外ならstandardを評価した結果がデフォルト値としてインストールされる。
defvar
と同様、このマクロはoption
をスペシャル変数 — 常にダイナミックにバインドされることを意味する —
としてマークする。optionがすでにレキシカルバインドをもつなら、そのレキシカルバインドはバインディング構文を抜けるまで効果をもつ。変数のバインディングのスコーピングルールを参照のこと。
式standardは別の様々な機会 — カスタマイゼーション機能がoptionの標準値を知る必要があるときは常に — にも評価される可能性がある。そのため任意回数の評価を行ても安全な式を使用するように留意されたい。
引数docはその変数にたいするドキュメント文字列を指定する。
defcustom
が何も:group
を指定しなければ、同じファイル内でdefgroup
によって最後に定義されたグループが使用される。この方法ではほとんどのdefcustom
は明示的な:group
が不必要になる。
Emacs
LispモードでC-M-x(eval-defun
)でdefcustom
フォームを評価するとき、eval-defun
の特別な機能は変数の値がvoidかどうかテストせずに、無条件に変数をセットするよう段取りする(同じ機能はdefvar
にも適用される。グローバル変数の定義を参照)。すでに定義されたdefcustomでeval-defun
を使用することにより、(もしあれば):set
関数(以下参照)が呼び出される。
事前ロード(pre-loaded)されたEmacs Lispファイル(Emacsのビルドを参照)にdefcustom
を配置すると、ダンプ時にインストールされた標準値は正しくない —
たとえば依存している他の変数がまだ正しい値を割り当てられていない
— かもしれない。この場合はEmacs起動後に標準値を再評価するために、以下で説明するcustom-reevaluate-setting
を使用する。
一般的なキーワードアイテムにリストされたキーワードに加えて、このマクロには以下のキーワードを指定できる
:type type
このオプションのデータ型としてtypeを使用する。これはどんな値が適正なのか、その値をどのように表示するかを指定する(カスタマイゼーション型を参照)。defcustom
はそれぞれこのキーワードにたいする値を指定すること。
:options value-list
¶このオプションに使用する適正な値のリストを指定する。ユーザーが使用できる値はこれらの値に限定されないが、これらは便利な値の選択肢を提示する。
これは特定の型にたいしてのみ意味をもち現在のところhook
、plist
、alist
が含まれる。:options
を使用する方法は個別の型の定義を参照のこと。
異なる:options
値によるdefcustom
フォームの再評価では以前の評価で追加された値や、custom-add-frequent-value
(以下参照)呼び出しで追加された値はクリアーされない。
:set setfunction
¶Customizeインターフェースを使用してこのオプションの値を変更する方法としてsetfunctionを指定する。関数setfunctionは2つの引数
— シンボル(オプション名)と新しい値 —
を受け取り、このオプションにたいして正しく値を更新するために必要なことは何であれ行うこと(これはおそらくLisp変数として単にオプションをセットすることを意味しない)。この関数は引数の値を破壊的に変更しないことが望ましい。setfunctionのデフォルトはset-default-toplevel-value
。
定義された場合にはEmacs
LispモードからC-M-xによりdefcustom
が評価されたとき、あるいはsetopt
マクロ(setoptを参照)を介してoptionの値が変更された際にもsetfunctionが呼び出される。
このキーワードを指定すると、その変数のドキュメント文字列にはsetfunctionを直接呼び出すか、setopt
を用いることによって手入力のLispコードで同じことを行う方法が記載されていること。
:get getfunction
¶このオプションの値を抽出する方法としてgetfunctionを指定する。関数getfunctionは1つの引数(シンボル)を受け取り、カスタマイズがそのシンボル(シンボルのLisp値である必要はない)にたいするカレント値としてそれを使うべきかどうかをリターンすること。デフォルトはdefault-toplevel-value
。
:get
を正しく使用するためには、Customの機能を真に理解する必要がある。これは変数としてCustom内で扱われる値のためのものだが、実際にはLisp変数には格納されない。実際にLisp変数に格納されている値にgetfunctionを指定するのは、ほとんどの場合は誤りである。
:initialize function
¶functionはdefcustom
が評価されるときに変数を初期化するために使用される関数であること。これは2つの引数 —
オプション名(シンボル)と値を受け取る。この方法での使用のために事前定義された関数がいくつかある:
custom-initialize-set
変数の初期化にその変数の:set
関数を使用するが、値がすでに非voidなら再初期化を行わない。
custom-initialize-default
custom-initialize-set
と同様だが、その変数の:set
のかわりに関数set-default-toplevel-value
を使用して変数をセットする。これは変数の:set
関数がマイナーモードを有効または無効にする場合の通常の選択である。この選択により変数の定義ではマイナーモード関数を呼び出しは行わないが、変数をカスタマイズしたときはマイナーモード関数を呼び出すだろう。
custom-initialize-reset
変数の初期化に常に:set
関数を使用する。変数がすでに非voidなら、(:get
メソッドでリターンされる)カレント値を使用して:set
関数を呼び出して変数をリセットする。これはデフォルトの:initialize
関数である。
custom-initialize-changed
変数がすでにセットされている、またはカスタマイズされていれば:set
関数、それ以外なら単にset-default-toplevel-value
を使用して変数の初期化を行う。
custom-initialize-delay
この関数はcustom-initialize-set
と同様に振る舞うが、実際の初期化をEmacsの次回起動時に遅延させる。これはビルド時ではなく実行時のコンテキストで初期化を行わせるように、事前ロードされるファイル(やautoloadされる変数)で使用すること。これは(遅延された)初期化が:set
関数で処理されるという副作用ももつ。Emacsのビルドを参照のこと。
:local value
¶valueがt
ならoptionをバッファーローカルと自動的にマークする。値がpermanent
ならoptionのpermanent-local
プロパティもt
にセットする。バッファーローカルなバインディングの作成と削除を参照のこと。
:risky value
¶その変数のrisky-local-variable
プロパティをvalueにセットする(ファイルローカル変数を参照)。
:safe function
¶その変数のsafe-local-variable
プロパティをfunctionにセットします(ファイルローカル変数を参照)。
:set-after variables
¶保存されたカスタマイゼーションに合わせて変数をセッティングするときは、その前に変数variables確実にセット —
つまりこれら他のものが処理される後までセッティングを遅延 —
すること。これら他の変数が意図された値をもっていない場合に、この変数のセッティングが正しく機能しなければ:set-after
を使用すること。
特定の機能をオンに切り替えるオプションには、:require
キーワードを指定すると便利です。これはその機能がまだロードされていないときには、そのオプションがセットされればEmacsがその機能をロードするようにします。一般的なキーワードアイテムを参照してください。以下は例です:
(defcustom frobnicate-automatically nil "Non-nil means automatically frobnicate all buffers." :type 'boolean :require 'frobnicate-mode :group 'frobnicate)
あるカスタマイゼーションアイテムが:options
がサポートするhook
やalist
のような型をもつなら、custom-add-frequent-value
を呼び出すことによってdefcustom
宣言の外部から別途値を追加できます。たとえばemacs-lisp-mode-hook
から呼び出されることを意図した関数my-lisp-mode-initialization
を定義する場合は、emacs-lisp-mode-hook
にたいする正当な値として、その定義を編集することなくその関数をリストに追加したいと思うかもしれません。これは以下のようにして行うことができます:
(custom-add-frequent-value 'emacs-lisp-mode-hook 'my-lisp-mode-initialization)
カスタマイズオプションsymbolにたいして正当な値のリストにvalueを追加する。
追加による正確な効果はsymbolのカスタマイズ型に依存する。
以前に追加した値はdefcustom
フォームの評価ではクリアーされないので、Lispプログラムは未定義のユーザーおっしゃるへの値追加にこの関数を使用できる。
defcustom
は内部的に、標準値にたいする式の記録にシンボルプロパティstandard-value
、カスタマイゼーションバッファーでユーザーが保存した値の記録にsaved-value
、カスタマイゼーションバッファーでユーザーがセットして未保存の値の記録にcustomized-value
を使用します。シンボルのプロパティを参照してください。加えてテーマによりセットされた値の記録に使用されるthemed-value
も存在します(Customテーマを参照)。これらのプロパティは、carがその値を評価する式であるようなリストです。
この関数はdefcustom
を通じて宣言されたユーザーオプションsymbolの標準値を再評価する。変数がカスタマイズされたなら、この関数はかわりに保存された値を再評価する。それからこの関数はその値に、(もし定義されていればそのオプションの:set
プロパティを使用して)ユーザーオプションをセットする。
これは値が正しく計算される前に定義されたカスタマイズ可能オプションにたいして有用である。たとえばstartupの間、Emacsは事前ロードされたEmacs Lispファイルで定義されたユーザーオプションにたいしてこの関数を呼び出すが、これらの初期値は実行時だけ利用可能な情報に依存する。
この関数はargがカスタマイズ可能変数なら非nil
をリターンする。カスタマイズ可能変数とは、standard-value
かcustom-autoload
プロパティをもつ(通常はdefcustom
で宣言されたことを意味する)変数、または別のカスタマイズ可能変数にたいするエイリアスのことである。