カテゴリー(categories)は構文的に文字をクラス分けする別の手段を提供します。必要に応じて複数のカテゴリーを定義して、それぞれの文字に独立して1つ以上のカテゴリーを割り当てることができます。構文クラスと異なりカテゴリーは互いに排他ではありません。1つの文字が複数のカテゴリーに属すのは普通のことです。
バッファーはそれぞれカテゴリーテーブル(category table)をもっています。これはどのカテゴリーが定義されていて、各カテゴリーにどの文字が属すかを記録しています。カテゴリーテールは自身のカテゴリーを定義しますが、標準カテゴリーはすべてのモードで利用可能なので、これらは通常は標準カテゴリーテーブルをコピーすることにより初期化されます。
カテゴリーはそれぞれ‘ ’から‘~’の範囲のASCIIプリント文字による名前をもちます。define-category
で定義する際にはカテゴリーの名前を指定します。
カテゴリーテーブルは実際には文字テーブルです(文字テーブルを参照)。カテゴリーテーブルのインデックスcの要素は、文字cが属するカテゴリーを示すカテゴリーセット(category
set)というブールベクターです。このカテゴリーセット内で、もしインデックスcatの要素がt
ならcatはそのセットのメンバーであり、その文字cはカテゴリーcatに属することを意味します。
以下の3つの関数のオプション引数tableのデフォルトは、カレントバッファーのカテゴリーテーブルです。
この関数はカテゴリーテーブルtableにたいして名前がchar、ドキュメントがdocstringであるような新たなカテゴリーを定義する。
以下ではR2L(right-to-left: 右から左)への強い方向性(directionality)をもつ文字(双方向テキストの表示を参照)にたいするカテゴリーを新たに定義して、それを特別なカテゴリーテーブル内で使用する例を示す。文字の方向性に関する情報を取得するために、コード例ではUnicodeプロパティ‘bidi-class’ (bidi-classを参照)を使用する。
(defvar special-category-table-for-bidi ;; 空のcategory-tableを作成 (let ((category-table (make-category-table)) ;; Create a char-table which gives the 'bidi-class' Unicode ;; 各文字のプロパティ (uniprop-table (unicode-property-table-internal 'bidi-class))) (define-category ?R "Characters of bidi-class R, AL, or RLO" category-table) ;; Unicodeの'bidi-class'プロパティが ;; R、AL、RLOであるような(R2Lの方向性をもつ)文字の ;; カテゴリーエントリーを変更する (map-char-table (lambda (key val) (if (memq val '(R AL RLO)) (modify-category-entry key ?R category-table))) uniprop-table) category-table))
この関数はカテゴリーテーブルtable内のカテゴリーcategoryのドキュメント文字列をリターンする。
(category-docstring ?a) ⇒ "ASCII" (category-docstring ?l) ⇒ "Latin"
この関数はtable内で現在のところ未定義なカテゴリーの名前(文字)をリターンする。table内で利用可能なカテゴリーがすべて使用済みならnil
をリターンする。
この関数はカレントバッファーのカテゴリーテーブルをリターンする。
この関数はobjectがカテゴリーテーブルならt
、それ以外はnil
をリターンする。
この関数は標準カテゴリーテーブルをリターンする。
この関数はtableのコピーを構築してリターンする。tableが与えられない(またはnil
)なら、標準カテゴリーテーブルのコピーをリターンする。それ以外の場合には、もしtableがカテゴリーテーブルでなければエラーをシグナルする。
この関数はtableをカレントバッファーのカテゴリーテーブルにする。リターン値はtable。
これは空のカテゴリーテーブルを作成してリターンする。空のカテゴリーテーブルでは、どのカテゴリーも割り当てられておらず何らかのカテゴリーに属する文字もない。
この関数は初期内容が文字列categoriesにリストされるカテゴリーであるような、新たなカテゴリーセット(ブールベクター)をリターンする。categoriesの要素はカテゴリー名であること。新たなカテゴリーセットはそれらのカテゴリーにたいしてt
、それ以外のすべてのカテゴリーにたいしてnil
をもつ。
(make-category-set "al") ⇒ #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0"
この関数はカレントバッファーのカテゴリーテーブル内で、文字charにたいするカテゴリーセットをリターンする。これは文字charが属するカテゴリーを記録するブールベクター。関数char-category-set
はカテゴリーテーブル内にある同じブールベクターをリターンするのでメモリーの割り当ては行わない。
(char-category-set ?a) ⇒ #&128"\0\0\0\0\0\0\0\0\0\0\0\0\2\20\0\0"
この関数はカテゴリーセットcategory-setを、そのセットのメンバーのカテゴリーを指定する文字を含む文字列に変換する。
(category-set-mnemonics (char-category-set ?a)) ⇒ "al"
この関数はカテゴリーテーブルtable
(デフォルトはカレントバッファーのカテゴリーテーブル)内のcharのカテゴリーセットを変更する。charには文字、または(min
.
max)
という形式のコンスセルを指定できる。後者の場合には、この関数はminとmaxの間(両端を含む)の範囲にあるすべての文字のカテゴリーセットを変更する。
これは通常はカテゴリーセットにcategoryを追加することにより変更を行う。しかしresetが非nil
なら、かわりにcategoryを削除する。
この関数はカレントカテゴリーテーブル内のカテゴリー仕様を説明する。これはその説明をバッファーに挿入してから、そのバッファーを表示する。buffer-or-nameが非nil
なら、かわりにそのバッファーのカテゴリーテーブルを説明する。