次: , 前: Group Definitions, 上: Customization


13.3 カスタマイズ変数を定義する

defcustomを使って、ユーザーが編集可能な変数を宣言します。

— マクロ: defcustom option default doc [keyword value]...

カスタマイズ可能なユーザーオプション変数としてoptionを宣言する。 optionをクォートしないこと。 引数docは変数の説明文字列を指定する。

optionが空であると、defcustomdefaultで初期化する。 defaultは値を計算する式であること。 これは複数回評価される可能性があるので、書き方には注意すること。

defcustomでは、つぎの追加キーワードも使えます。

:type type
このオプションのデータ型としてtypeを使う。 これは、正しい値とその表示方法を指定する。 詳しくは、see Customization Types
:options list
このオプションに使える合理的な値のリストとしてlistを指定する。

これは、現時点では、型がhookのときだけ意味を持つ。 その場合、listの要素は、フックの値の要素として使える関数であること。 ユーザーはこれらの関数以外も使えるが、便利な選択肢として提示する。

:version version
このオプションは、変数を最初に導入したり、デフォルト値を変更したりした Emacsの版versionを指定する。 値versionは、文字列であること。 たとえば、つぎのとおり。
          (defcustom foo-max 34
            "*Maximum number of foo's allowed."
            :type 'integer
            :group 'foo
            :version "20.3")
     

:set setfunction
このオプションの値を変更する方法としてsetfunctionを指定する。 関数setfunctionは、2つの引数、つまり、シンボルと新しい値を取り、 このオプションの値を(Lisp変数としてオプションを設定するだけでなく) 適切に更新するために必要なことを行うこと。 setfunctionのデフォルトはset-default
:get getfunction
このオプションの値を取り出す方法としてgetfunctionを指定する。 関数getfunctionは、1つの引数、つまり、シンボルを取り、 そのシンボル(のLisp値とは必ずしも限らない)の『現在値』を返すこと。 デフォルトはdefault-value
:initialize function
functionは、defcustomを評価したときに変数の初期化に使う関数。 この関数は、2つの引数、つまり、シンボルと値を取ること。 このように使うことを意図した定義済みの関数がいくつかある。
custom-initialize-set
変数の:set関数を使って変数を初期化するが、 変数の値が空でないときには再初期化しない。 これは:initializeのデフォルト。
custom-initialize-default
custom-initialize-setに似ているが、 変数の:set関数のかわりに関数set-defaultを使って変数を設定する。 変数の:set関数がマイナモードをオン/オフする場合には、 普通はこれを選ぶ。 これを選ぶと、変数を定義してもマイナモード関数を呼び出さないが、 変数をカスタマイズするとマイナモード関数を呼び出す。
custom-initialize-reset
変数を初期化するにはつねに:set関数を使う。 変数の値が空でない場合には、(:getで得られる)現在値で :set関数を呼び出して、変数をリセットする。
custom-initialize-changed
変数がすでに設定されていたりカスタマイズしてあるときに、 変数を初期化するために:set関数を使う。 さもなければ、set-defaultを使う。

:requireオプションは、 特定の機能をオンにするようなオプションには便利です。 パッケージがオプション変数の値を検査するように書かれていたとしても、 パッケージをロードするようにする必要があります。 これを:requireで行えるのです。 See Common Keywords。 ライブラリparen.elからとった例をつぎに示します。

     (defcustom show-paren-mode nil
       "Toggle Show Paren mode...."
       :set (lambda (symbol value)
              (show-paren-mode (or value 0)))
       :initialize 'custom-initialize-default
       :type 'boolean
       :group 'paren-showing
       :require 'paren)

内部的には、defcustomは、 デフォルト値を与える式は属性standard-valueを使って記録し、 ユーザーがカスタマイズバッファで保存した値は 属性saved-valueを使って記録しています。 属性saved-valueは実際にはリストであり、 そのcarが値に評価される式です。