[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本章では、カスタマイズのためのユーザーオプションの宣言方法、 および、それらを分類するカスタマイズグループの宣言方法を説明します。 フェイスの定義(see 節 38.10.2 フェイスを定義する)に加えて、 カスタマイズの両方の種類を含めて、 カスタマイズ項目(customization item)という用語を使います。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
(変数やグループ、フェイスの)すべての種類のカスタマイズ宣言では、 さまざまな情報を指定するためのキーワード引数を受け付けます。 本節では、全種類に適用できるキーワードを説明します。
: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
を使うもっとも一般的な理由は、 変数がマイナモードなどの機能をオンにするとき、 そのモードを実装するコードをロードしてないと、 変数にはなんの効果もないからである。
[ < ] | [ > ] | [ << ] | [ 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 prefix
1つのグループに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 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 節 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 ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |
本節では、すべての単純型を説明します。
sexp
sexp
を使うことができる。
integer
number
string
regexp
string
と同様であるが、 文字列は正規表現である必要がある。
character
file
(file :must-match t)
directory
hook
defcustom
で:options
キーワードを使用できる。 see 節 13.3 カスタマイズ変数を定義する。
symbol
function
variable
face
boolean
nil
か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 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
以外を返すこと。
[ << ] | [ >> ] | [表紙] | [目次] | [索引] | [検索] [上端 / 下端] [?] |