本章では、カスタマイズのためのユーザーオプションの宣言方法、 および、それらを分類するカスタマイズグループの宣言方法を説明します。 フェイスの定義(see section フェイスを定義する)に加えて、 カスタマイズの両方の種類を含めて、 カスタマイズ項目(customization item)という用語を使います。
(変数やグループ、フェイスの)すべての種類のカスタマイズ宣言では、 さまざまな情報を指定するためのキーワード引数を受け付けます。 本節では、全種類に適用できるキーワードを説明します。
:tag
を除くこれらのキーワードすべては、各項目で複数回使えます。
キーワードのそれぞれの使用には、独立の効果があります。
キーワード:tag
は例外です。
任意の項目には名前を1つしか表示できないからです。
:tag name
:group group
defgroup
の中で:group
を使うと、
新たなグループをgroupの下位グループにする。
このキーワードを複数回使うと、
1つの項目を複数のグループに入れることができる。
それらのグループのどれを表示しても、この項目が表示される。
これを多用しすぎないように注意すること!
:link link-data
(custom-manual info-node)
"(emacs)Top"
のようなノード名を指定する文字列。
リンクは、カスタマイズバッファでは`[manual]'のように表示される。
(info-link info-node)
custom-manual
と同様であるが、
カスタマイズバッファに現れるリンクはinfoのノード名になる。
(url-link url)
:tag name
を使うことで、
カスタマイズバッファに使うテキストを指定できる。
たとえば、(info-link :tag "foo" "(emacs)Top")
とすると、
バッファでは`foo'と表示されるEmacsマニュアルへのリンクを作れる。
1つの項目に複数個の外部リンクがあってもよいが、
ほとんどの項目には外部リンクはない。
:load file
load-library
でロードする。
:require feature
require
を呼び出す。
:require
を使うもっとも一般的な理由は、
変数がマイナモードなどの機能をオンにするとき、
そのモードを実装するコードをロードしてないと、
変数にはなんの効果もないからである。
Emacs Lispの各パッケージには、 そのパッケージのすべてのオプション、フェイス、他のグループを含んだ 1つの主要なカスタマイズグループがあるべきです。 パッケージに少数のオプションやフェイスしかなければ、 それらを1つのグループにまとめます。 12個を超えるオプションやフェイスがある場合には、 それらを下位グループに構造化して、 下位グループすべてをパッケージの主カスタマイズグループに入れておきます。 パッケージの主グループに下位グループとともにいくつかのオプションやフェイスを 入れておくのもよいでしょう。
パッケージの主グループや単一のグループは、
標準カスタマイズグループの1つかそれ以上のメンバであるべきです。
(それらの完全な一覧を表示するにはM-x customizeを使う。)
それらの中から1個か数個を選び(多すぎないこと)、
キーワード:group
を使って、それぞれに読者のグループを追加します。
新たなカスタマイズグループは、defgroup
で宣言します。
引数membersは、グループのメンバとなる
カスタマイズ項目の初期集合を指定するリストである。
しかし、ほとんどの場合、membersはnil
であり、
それらのメンバを定義するときに、キーワード:group
を使って、
グループのメンバであることを指定する。
membersでグループのメンバを指定する場合には、
各要素は(name widget)
という形式であること。
ここで、nameはシンボル、
widgetはそのシンボルを編集するためのウィジェット型である。
有用なウィジェットは、変数に対してはcustom-variable
、
フェイスに対してはcustom-face
、
グループに対してはcustom-group
である。
共通のキーワード(see section すべての種類の項目に共通のキーワード)に加えて、
defgroup
ではつぎのキーワードも使える。
:prefix prefix
prefix
がいくつあってもよい。
接頭辞を取りさる機能は、現在、オフにしてあります。
つまり、:prefix
は、現在、なんの効果もありません。
このようにしたのは、指定した接頭辞を取りさると、
オプション名がしばしば混乱するからです。
さまざまなグループのdefgroup
定義を書く人は、
論理的と考えられるとき、つまり、ライブラリに共通の接頭辞があるときには
キーワード:prefix
を追加するので、このようになるのです。
:prefix
を使ってよい結果を得るには、
グループ内の特定の項目とそれらの名前と説明文字列に関して、
特定の接頭辞を取りさった場合の効果を調べる必要があります。
その結果、テキストがわかり難ければ、
その場面では、:prefix
を使うべきではないのでしょう。
カスタマイズグループすべてを調べ直して、
わかり難くなる結果をもたらす:prefix
指定を削除し、
この機能をオンにすることは、誰かが頑張れば、可能です。
defcustom
を使って、ユーザーが編集可能な変数を宣言します。
optionが空であると、defcustom
はdefaultで初期化する。
defaultは値を計算する式であること。
これは複数回評価される可能性があるので、書き方には注意すること。
defcustom
では、つぎの追加キーワードも使えます。
:type type
:options list
hook
のときだけ意味を持つ。
その場合、listの要素は、フックの値の要素として使える関数であること。
ユーザーはこれらの関数以外も使えるが、便利な選択肢として提示する。
:version version
(defcustom foo-max 34 "*Maximum number of foo's allowed." :type 'integer :group 'foo :version "20.3")
:set setfunction
set-default
。
:get getfunction
default-value
。
:initialize 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 section すべての種類の項目に共通のキーワード。
ライブラリ`paren.el'からとった例をつぎに示します。
(defcustom show-paren-mode nil "Toggle Show Paren mode@enddots{}" :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が値に評価される式です。
defcustom
でユーザーオプションを定義するときには、
そのカスタマイズ型(customization type)を定義する必要があります。
これはLispオブジェクトであり、
(1)どのような値が正しいものであり、
(2)編集用にカスタマイズバッファに表示する方法、
を示します。
カスタマイズ型は、defcustom
内の:type
キーワードで指定します。
:type
の引数は評価されます。
実行時に型が変わるものはほとんど使い途がないので、
普通、クォートした型を指定します。
たとえば、つぎのとおりです。
(defcustom diff-command "diff" "*The command to use to run diff." :type '(string) :group 'diff)
一般に、カスタマイズ型はリストであり、 その先頭要素はシンボルで、次節以降で定義するカスタマイズ型名の1つです。 このシンボルのあとには、シンボルに依存した数個の引数が続きます。 型シンボルとその引数のあいだには、 キーワード・値の対を書くこともできます (see section 型キーワード)。
型シンボルには、引数を取らないものもあります。
これらを単純型(simple types)と呼びます。
単純型では、キーワード・値の対を指定しなければ、
型シンボルを囲む括弧を省略できます。
たとえば、カスタマイズ型としてのstring
は、
(string)
と等価です。
本節では、すべての単純型を説明します。
sexp
sexp
を使うことができる。
integer
number
string
regexp
string
と同様であるが、
文字列は正規表現である必要がある。
character
file
(file :must-match t)
directory
hook
defcustom
で:options
キーワードを使用できる。
see section カスタマイズ変数を定義する。
symbol
function
variable
face
boolean
nil
かt
である必要がある。
choice
とconst
を同時に使うと(次節参照)、
値はnil
かt
である必要があることを指定し、
さらに、どちらの値がどの選択肢に合うかを記述するテキストを
指定できることに注意。
単純型が適切でない場合には、 他の型から新たな型を作り上げる複合型を使えます。 これには、いくつかの方法があります。
(restricted-sexp :match-alternatives criteria)
nil
かnil
以外を返す。
リスト内の述語がオブジェクトに対してnil
以外を返せば
そのオブジェクトを受理することを意味する。
'object
。
リスト内のこの種の要素は、
objectそのものが受理できる値であることを意味する。
(restricted-sexp :match-alternatives (integerp 't 'nil))は、整数、
t
、nil
が正しい値である。
カスタマイズバッファでは、すべての正しい値はその入力構文で表示し、
ユーザーはそれらをテキストとして編集する。
(cons car-type cdr-type)
(cons string symbol)
は、
("foo" . foo)
などの値に一致するカスタマイズ型である。
カスタマイズバッファでは、
CARとCDRは、
それらに指定した型に応じて別々に表示され、個別に編集できる。
(list element-types...)
(list integer string function)
は、
3要素のリストを意味し、
第1要素は整数、第2要素は文字列、第3要素は関数であることを指定する。
カスタマイズバッファでは、
各要素は、それらに指定した型に応じて別々に表示され、個別に編集できる。
(vector element-types...)
list
と同様だが、値はリストではなくベクトルである必要がある。
その要素はlist
の場合と同じ。
(choice alternative-types...)
(choice integer string)
は、整数か文字列を許す。
カスタマイズバッファでは、ユーザーはメニューを使って選択肢を選び、
その選択肢において普通の方法で値を編集する。
通常、このメニューの選択肢名は、選択肢から自動的に決定されるが、
選択肢に:tag
キーワードを含めることで、
メニューに異なる名前を指定できる。
たとえば、整数が空白の個数を表し、文字列がそのまま使うテキストを表す場合には、
つぎのようにカスタマイズ型を書く。
(choice (integer :tag "Number of spaces") (string :tag "Literal text"))そうすると、メニューには、 `Number of spaces'と`Literal Text'が表示される。
const
以外のnil
が正当な値ではない選択肢では、
そのような選択肢には:value
キーワードを使って
正当なデフォルト値を指定すること。
See section 型キーワード。
(const value)
const
の主な用途はchoice
の内側である。
たとえば、(choice integer (const nil))
は、整数かnil
を許す。
choice
の内側では、const
にしばしば:tag
を使う。
たとえば、
(choice (const :tag "Yes" t) (const :tag "No" nil) (const :tag "Ask" foo))は、
t
は『yes』(はい)、nil
は『no』(いいえ)、
foo
は『ask』(問い合わせる)を意味する変数を記述する。
(other value)
other
は、主に、choice
の最後の要素として使うことである。
たとえば、
(choice (const :tag "Yes" t) (const :tag "No" nil) (other :tag "Ask" foo))は、
t
は『yes』(はい)、nil
は『no』(いいえ)、
それ以外は『ask』(問い合わせる)を意味することを示す。
ユーザーが選択肢のメニューから`Ask'を選ぶと、値foo
を指定する。
しかし、(t
でもnil
でもfoo
でもない)それ以外の値は、
foo
と同様に`Ask'と表示される。
(function-item function)
const
と同様だが、関数であるような値に使う。
これは、関数名に加えて説明文字列を表示する。
説明文字列は、:doc
に指定したものか、
functionそのものの説明文字列である。
(variable-item variable)
const
と同様だが、変数名であるような値に使う。
これは、変数名に加えて説明文字列を表示する。
説明文字列は、:doc
に指定したものか、
variableそのものの説明文字列である。
(set elements...)
(repeat element-type)
:inline
機能により、可変個数の要素をリストやベクトルの
途中に繋ぎ合わせることができます。
list
やvector
の要素型に現れる
set
型、choice
型、repeat
型の中に使います。
通常、list
やvector
のおのおのの要素型は、
リストやベクトルのたった1つの要素を記述します。
したがって、要素型がrepeat
であると、
1要素として表示される長さを指定しないリストを指定します。
しかし、要素型に:inline
を使うと、
これに一致する値は、:inline
を含むシーケンスに直接に併合されます。
たとえば、3要素のリストに一致すると、
それがシーケンス全体の3つの要素になります。
これはバッククォート構文の`,@'の使い方に似ています。
たとえば、先頭要素がt
であり、
残りがfoo
かbar
の0個以上の繰り返しであるリストを指定するには、
つぎのカスタマイズ型を使います。
(list (const t) (set :inline t foo bar))
これは、(t)
、(t foo)
、(t bar)
、(t foo bar)
などの
値に一致します。
要素型がchoice
であるときには、
choice
そのものには:inline
を使いませんが、
choice
の選択肢(のどれか)に:inline
を使います。
たとえば、ファイル名で始まりシンボルt
か2つの文字列が続くような
リストに一致するようにするには、
つぎのカスタマイズ型を使います。
(list file (choice (const t) (list :inline t string string)))
ユーザーが最初の選択肢を選ぶと、全体としてのリストは2要素になり、
第2要素はt
です。
ユーザーが2番目の選択肢を選ぶと、
全体としてのリストは3要素になり、
第2要素と第3要素は文字列である必要があります。
型名のシンボルのあとに、カスタマイズ型内にキーワード・引数の対を指定できます。 使えるキーワードとその意味を以下に示します。
:value default
choice
の内側の選択肢として現れる型に使う。
これは、カスタマイズバッファのメニューでユーザーがこの選択肢を選ぶと、
使用するデフォルト値をまず指定する。
もちろん、オプションの実際の値がこの選択肢に合えば、
defaultではなく実際の値が表示される。
選択肢の値としてnil
が不正であるときには、
:value
で正当なデフォルトを指定することが本質的である。
:format format-string
:action
属性は、ユーザーがボタンを起動したらなにを行うかを指定する。
その値は2つの引数、つまり、ボタンが現れるウィジェットとイベント
を取る関数であること。
異なるアクションを有する異なるボタンを指定する方法はない。
:sample-face
で指定した特別なフェイスでsampleを表示する。
:tag
キーワードで指定する。
:action action
:button-face face
:button-prefix prefix
:button-suffix suffix
nil
:tag tag
:doc doc
:format
の値を指定し、かつ、
その値の中で`%d'や`%h'を使う必要がある。
型に対して説明文字列を指定するのは、
:choice
の選択肢や他の複合型の一部の意味について
より多くの情報をユーザーに与えるためである。
:help-echo motion-doc
widget-forward
やwidget-backward
でこの項目に移動すると、
エコー領域に文字列motion-docを表示する。
:match function
nil
以外を返すこと。
Go to the first, previous, next, last section, table of contents.