[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
本章では、カスタマイズのためのユーザーオプションの宣言方法、 および、それらを分類するカスタマイズグループの宣言方法を説明します。 フェイスの定義(see section 38.10.2 フェイスを定義する)に加えて、 カスタマイズの両方の種類を含めて、 カスタマイズ項目(customization item)という用語を使います。
13.1 すべての種類の項目に共通のキーワード | ||
13.2 カスタマイズグループを定義する | ||
13.3 カスタマイズ変数を定義する | ||
13.4 カスタマイズ型 |
(変数やグループ、フェイスの)すべての種類のカスタマイズ宣言では、 さまざまな情報を指定するためのキーワード引数を受け付けます。 本節では、全種類に適用できるキーワードを説明します。
:tag
を除くこれらのキーワードすべては、各項目で複数回使えます。
キーワードのそれぞれの使用には、独立の効果があります。
キーワード:tag
は例外です。
任意の項目には名前を1つしか表示できないからです。
:tag name
:group group
defgroup
の中で:group
を使うと、
新たなグループをgroupの下位グループにする。
このキーワードを複数回使うと、 1つの項目を複数のグループに入れることができる。 それらのグループのどれを表示しても、この項目が表示される。 これを多用しすぎないように注意すること!
:link link-data
link-dataとして使えるものは3種類ある。
(custom-manual info-node)
"(emacs)Top"
のようなノード名を指定する文字列。
リンクは、カスタマイズバッファでは`[manual]'のように表示される。
(info-link info-node)
custom-manual
と同様であるが、
カスタマイズバッファに現れるリンクはinfoのノード名になる。
(url-link url)
link-dataの先頭要素のうしろに: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 13.1 すべての種類の項目に共通のキーワード)に加えて、
defgroup
ではつぎのキーワードも使える。
:prefix prefix
1つのグループに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 13.1 すべての種類の項目に共通のキーワード。
ライブラリ`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が値に評価される式です。
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 13.4.4 型キーワード)。
型シンボルには、引数を取らないものもあります。
これらを単純型(simple types)と呼びます。
単純型では、キーワード・値の対を指定しなければ、
型シンボルを囲む括弧を省略できます。
たとえば、カスタマイズ型としてのstring
は、
(string)
と等価です。
13.4.1 単純型 | ||
13.4.2 複合型 | ||
13.4.3 リストに繋ぎ合わせる | ||
13.4.4 型キーワード |
本節では、すべての単純型を説明します。
sexp
sexp
を使うことができる。
integer
number
string
regexp
string
と同様であるが、
文字列は正規表現である必要がある。
character
file
(file :must-match t)
directory
hook
defcustom
で:options
キーワードを使用できる。
see section 13.3 カスタマイズ変数を定義する。
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 13.4.4 型キーワード。
(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
以外を返すこと。
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |