| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本章では、カスタマイズのためのユーザーオプションの宣言方法、 および、それらを分類するカスタマイズグループの宣言方法を説明します。 フェイスの定義(see 節 38.10.2 フェイスを定義する)に加えて、 カスタマイズの両方の種類を含めて、 カスタマイズ項目(customization item)という用語を使います。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
(変数やグループ、フェイスの)すべての種類のカスタマイズ宣言では、 さまざまな情報を指定するためのキーワード引数を受け付けます。 本節では、全種類に適用できるキーワードを説明します。
:tagを除くこれらのキーワードすべては、各項目で複数回使えます。 キーワードのそれぞれの使用には、独立の効果があります。 キーワード:tagは例外です。 任意の項目には名前を1つしか表示できないからです。
:tag name:group groupdefgroupの中で:groupを使うと、 新たなグループをgroupの下位グループにする。
このキーワードを複数回使うと、 1つの項目を複数のグループに入れることができる。 それらのグループのどれを表示しても、この項目が表示される。 これを多用しすぎないように注意すること!
:link link-datalink-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 fileload-libraryでロードする。
:require featurerequireを呼び出す。
:requireを使うもっとも一般的な理由は、 変数がマイナモードなどの機能をオンにするとき、 そのモードを実装するコードをロードしてないと、 変数にはなんの効果もないからである。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
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 節 13.1 すべての種類の項目に共通のキーワード)に加えて、 defgroupではつぎのキーワードも使える。
:prefix prefix1つのグループにprefixがいくつあってもよい。
接頭辞を取りさる機能は、現在、オフにしてあります。 つまり、:prefixは、現在、なんの効果もありません。 このようにしたのは、指定した接頭辞を取りさると、 オプション名がしばしば混乱するからです。 さまざまなグループのdefgroup定義を書く人は、 論理的と考えられるとき、つまり、ライブラリに共通の接頭辞があるときには キーワード:prefixを追加するので、このようになるのです。
:prefixを使ってよい結果を得るには、 グループ内の特定の項目とそれらの名前と説明文字列に関して、 特定の接頭辞を取りさった場合の効果を調べる必要があります。 その結果、テキストがわかり難ければ、 その場面では、:prefixを使うべきではないのでしょう。
カスタマイズグループすべてを調べ直して、 わかり難くなる結果をもたらす:prefix指定を削除し、 この機能をオンにすることは、誰かが頑張れば、可能です。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
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 setfunctionset-default。
:get getfunctiondefault-value。
:initialize functiondefcustomを評価したときに変数の初期化に使う関数。 この関数は、2つの引数、つまり、シンボルと値を取ること。 このように使うことを意図した定義済みの関数がいくつかある。
custom-initialize-set:set関数を使って変数を初期化するが、 変数の値が空でないときには再初期化しない。 これは:initializeのデフォルト。
custom-initialize-defaultcustom-initialize-setに似ているが、 変数の:set関数のかわりに関数set-defaultを使って変数を設定する。 変数の:set関数がマイナモードをオン/オフする場合には、 普通はこれを選ぶ。 これを選ぶと、変数を定義してもマイナモード関数を呼び出さないが、 変数をカスタマイズするとマイナモード関数を呼び出す。
custom-initialize-reset:set関数を使う。 変数の値が空でない場合には、(:getで得られる)現在値で :set関数を呼び出して、変数をリセットする。
custom-initialize-changed:set関数を使う。 さもなければ、set-defaultを使う。:requireオプションは、 特定の機能をオンにするようなオプションには便利です。 パッケージがオプション変数の値を検査するように書かれていたとしても、 パッケージをロードするようにする必要があります。 これを:requireで行えるのです。 See 節 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が値に評価される式です。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
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 節 13.4.4 型キーワード)。
型シンボルには、引数を取らないものもあります。 これらを単純型(simple types)と呼びます。 単純型では、キーワード・値の対を指定しなければ、 型シンボルを囲む括弧を省略できます。 たとえば、カスタマイズ型としてのstringは、 (string)と等価です。
13.4.1 単純型 13.4.2 複合型 13.4.3 リストに繋ぎ合わせる 13.4.4 型キーワード
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本節では、すべての単純型を説明します。
sexpsexpを使うことができる。
integernumberstringregexpstringと同様であるが、 文字列は正規表現である必要がある。
characterfile(file :must-match t)directoryhookdefcustomで:optionsキーワードを使用できる。 see 節 13.3 カスタマイズ変数を定義する。
symbolfunctionvariablefacebooleannilかtである必要がある。 choiceとconstを同時に使うと(次節参照)、 値はnilかtである必要があることを指定し、 さらに、どちらの値がどの選択肢に合うかを記述するテキストを 指定できることに注意。| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
単純型が適切でない場合には、 他の型から新たな型を作り上げる複合型を使えます。 これには、いくつかの方法があります。
(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 節 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)| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
: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要素は文字列である必要があります。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
型名のシンボルのあとに、カスタマイズ型内にキーワード・引数の対を指定できます。 使えるキーワードとその意味を以下に示します。
:value defaultchoiceの内側の選択肢として現れる型に使う。 これは、カスタマイズバッファのメニューでユーザーがこの選択肢を選ぶと、 使用するデフォルト値をまず指定する。
もちろん、オプションの実際の値がこの選択肢に合えば、 defaultではなく実際の値が表示される。
選択肢の値としてnilが不正であるときには、 :valueで正当なデフォルトを指定することが本質的である。
:format format-string:action属性は、ユーザーがボタンを起動したらなにを行うかを指定する。 その値は2つの引数、つまり、ボタンが現れるウィジェットとイベント を取る関数であること。
異なるアクションを有する異なるボタンを指定する方法はない。
:sample-faceで指定した特別なフェイスでsampleを表示する。
:tagキーワードで指定する。
:action action:button-face face:button-prefix prefix:button-suffix suffixnil:tag tag:doc doc:formatの値を指定し、かつ、 その値の中で`%d'や`%h'を使う必要がある。
型に対して説明文字列を指定するのは、 :choiceの選択肢や他の複合型の一部の意味について より多くの情報をユーザーに与えるためである。
:help-echo motion-docwidget-forwardやwidget-backwardでこの項目に移動すると、 エコー領域に文字列motion-docを表示する。
:match functionnil以外を返すこと。
| [ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |