カスタマイズ可能な変数(ユーザーオプションとも呼ばれる)は、Customizeインターフェースを通じて値を設定できるLispのグローバル変数です。defvarで定義される他のグローバル変数(グローバル変数の定義を参照)とは異なり、カスタマイズ可能な変数はdefcustomマクロを用いて定義されます。defcustomは、サブルーチンとしてdefvarを呼び出すだけでなく、Customizeインターフェース上でその変数をどのように表示するか、許容される値などを定めます。
このマクロは option をユーザーオプション(すなわちカスタマイズ可能な変数)として宣言します。option をクォートしてはいけません。
引数 standard は、option
の標準値を指定する式です。defcustom 形式を評価すると standard が評価されますが、必ずしもその値にオプションがバインドされるとは限りません。option に既にデフォルト値が設定されている場合は、そのまま保持されます。ユーザーが option
のカスタマイズを既に保存している場合は、そのカスタマイズ値がデフォルト値として設定されます。それ以外の場合は、standard を評価した結果がデフォルト値として設定されます。
defvarと同様に、このマクロはoptionを特殊変数としてマークします。つまり、常に動的に束縛される必要があります。optionがすでに字句的に束縛されている場合、その字句束縛は束縛構文を抜けるまで有効なままとなります。変数束縛のスコープ規則を参照してください。
式 standard は、カスタマイズ機能が option の標準値を知る必要がある場合など、その他のさまざまなタイミングでも評価可能です。そのため、いつ評価しても問題のない式を使用するようにしてください。
引数 doc は、変数のドキュメント文字列を指定します。
defcustom が :group
を何も指定していない場合は、同一ファイル内で defgroup
を用いて定義された最後のグループが使用されます。これにより、ほとんどの defcustom
で明示的な :group は不要となります。
Emacs Lispモード(eval-defun)で defcustom 形式を C-M-x で評価すると、eval-defun の特殊な機能により、変数の値が void
であるかどうかの判定を行うことなく、無条件に変数が設定されます。(同様の機能は defvar
にも適用されます。グローバル変数の定義
を参照してください。)すでに定義されている defcustom に対して eval-defun
を使用すると、:set 関数(後述)が存在する場合にそれが呼び出されます。
プリロード済みのEmacs Lispファイル(Building
Emacsを参照)にdefcustomを記述した場合、ダンプ時に設定された標準値が正しくない可能性があります。例えば、その値が依存している別の変数にまだ正しい値が代入されていない場合などが考えられます。その場合は、後述するcustom-reevaluate-settingを使用して、Emacs起動後に標準値を再評価してください。
このマクロは、共通項目キーワードに挙げられているキーワードに加えて、以下のキーワードを受け付けます。
:type typeこのオプションのデータ型には type
を指定してください。これにより、有効な値と値の表示方法が指定されます(カスタマイズタイプを参照)。すべての defcustom では、このキーワードに対応する値を指定する必要があります。
:options value-list
¶このオプションで使用する妥当な値の一覧を指定してください。ユーザーはこれらの値のみに限定されるわけではありませんが、便利な代替案として提示されます。
これは特定の型においてのみ有効であり、現在は hook、plist、alist が含まれます。:options の使用方法については、各型の定義を参照してください。
異なる :options 値を用いて defcustom フォームを再評価しても、以前の評価で追加された値や、custom-add-frequent-value の呼び出しで追加された値は消去されません(後述)。
:set
setfunction ¶Customizeインターフェースを使用する際、このオプションの値を変更する方法として setfunction を指定してください。関数 setfunction は、シンボル(オプション名)、新しい値、およびオプションの buffer-local インジケータという2つまたは3つの引数を取る必要があります。setfunction
は、このオプションの値を適切に更新するために必要な処理を行う必要があります(これは単にオプションをLisp変数として設定することを意味するとは限りません)。ただし、可能な限り、値の引数を破壊的に変更しないようにしてください。オプションの
buffer-local が nil
でない場合、新しい値はバッファローカルに設定され、グローバル値やデフォルト値に影響を与えないようにしてください。setfunction のデフォルト値は set-default-toplevel-value です。
定義されている場合、Emacs LispモードでC-M-xを用いてdefcustomフォームを評価する際や、setoptマクロを介してoptionの値が変更される際にも、setfunctionが呼び出されます(setoptを参照)。
このキーワードを指定した場合、変数のドキュメント文字列には、setfunctionを直接呼び出すか、あるいはsetoptやsetopt-localを使用することで、手書きのLispコードで同様の処理を行う方法を記述する必要があります。
:get
getfunction ¶このオプションの値を抽出する方法として getfunction を指定してください。関数 getfunction はシンボルを1つの引数として受け取り、customize
がそのシンボルの現在の値として使用すべき値(必ずしもそのシンボルの Lisp 値である必要はありません)を返す必要があります。デフォルトは default-toplevel-value です。
:getを正しく使うには、Customの仕組みを十分に理解しておく必要があります。これは、Customでは変数として扱われるものの、実際にはLispの変数に格納されていない値のためのものです。実際にはLispの変数に格納されている値に対してgetfunctionを指定するのは、ほぼ間違いなく間違いです。
:initialize function
¶function は、defcustom
が評価される際に変数を初期化するための関数である必要があります。この関数は、オプション名(シンボル)と値の2つの引数を取る必要があります。以下に、このような用途で使用するための定義済み関数をいくつか挙げます。
custom-initialize-set変数の :set 関数を使用して変数を初期化してください。ただし、すでに non-void
である場合は、再初期化しないでください。
custom-initialize-defaultcustom-initialize-setと同様ですが、変数の:set関数ではなく、関数set-default-toplevel-valueを用いて変数を設定します。これは、:set関数でマイナーモードの有効・無効を切り替える変数に通常用いられる手法です。この方法では、変数を定義してもマイナーモード関数は呼び出されませんが、変数をカスタマイズすると呼び出されます。
custom-initialize-reset変数の初期化には、必ず :set 関数を使用してください。変数がすでに non-void
である場合は、現在の値(:get メソッドから返される値)を用いて :set 関数を呼び出し、リセットしてください。これがデフォルトの :initialize 関数です。
custom-initialize-changed変数が既に設定されているかカスタマイズされている場合は、:set
関数を使用して初期化してください。そうでない場合は、単に set-default-toplevel-value を使用してください。
custom-initialize-after-file-loadこの関数は custom-initialize-set
と同様に動作しますが、実際の初期化を包含ファイルの読み込み後まで遅延させます。これは、セッターが変数の後に定義される必要がある関数である(あるいはその関数を使用している)というよくある依存関係を解消する際に有用です。例えば、グローバルなマイナーモードが
nil :init-value
ではない場合などが挙げられます。
custom-initialize-delayこの関数は custom-initialize-set と同様に動作しますが、実際の初期化を次回の
Emacs 起動時まで遅延させます。これは、プリロード済み(Emacs のビルド時にロード済み)の Lisp
ファイルにおいて、実行時コンテキスト(別のシステムやプログラミング環境である可能性があります)で初期化が行われることを確実にする必要がある場合に使用してください。custom-initialize-delay
を参照してください。
:local value
¶value が t の場合は option を自動的にバッファローカルとしてマークし、値が permanent の場合は option の permanent-local プロパティも t
に設定します。最後に、値が permanent-only
の場合は、自動的にバッファローカルとしてマークすることなく、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
があります(カスタムテーマ
を参照)。これらのプロパティはリストであり、その先頭要素は値として評価される式となっています。
この関数は、defcustom 経由で宣言されたユーザーオプションであるはずの symbol
の標準値を再評価します。変数がカスタマイズされている場合は、代わりに保存済みの値を再評価します。その後、ユーザーオプションをその値に設定します(オプションの
:set プロパティが定義されている場合は、それを使用します)。
これは、値が正しく計算される前に定義されるカスタマイズ可能なオプションに有用です。例えば、起動時にEmacsは、プリロード済みのEmacs Lispファイルで定義されているものの、初期値が実行時にしか得られない情報に依存する一部のユーザーオプションに対して、この関数を呼び出します。
この関数は、arg がカスタマイズ可能な変数である場合に non-nil を返します。カスタマイズ可能な変数とは、standard-value または custom-autoload プロパティを持つ変数(通常は defcustom で宣言されたことを意味します)、あるいは別のカスタマイズ可能な変数のエイリアスのことです。