カテゴリは、文字を構文的に分類するための別の手法を提供します。必要に応じて複数のカテゴリを定義し、各文字を独立して1つ以上のカテゴリに割り当てることができます。構文クラスとは異なり、カテゴリは相互に排他的ではありません。1つの文字が複数のカテゴリに属することは一般的です。
各バッファには、どのカテゴリが定義されているか、またどの文字が各カテゴリに属しているかを記録したカテゴリテーブルがあります。各カテゴリテーブルは独自のカテゴリを定義しますが、通常は標準カテゴリテーブルからコピーして初期化されるため、すべてのモードで標準カテゴリが利用可能です。
各カテゴリには名前があり、これは ‘ ’ から
‘~’ の範囲の ASCII 印字文字です。define-category を用いてカテゴリを定義する際に、その名前を指定します。
カテゴリテーブルは、実際にはcharテーブル(Char-Tablesを参照)です。インデックスcのカテゴリテーブルの要素はカテゴリセット—bool型のベクトル—であり、文字cがどのカテゴリに属するかを示します。このカテゴリセットにおいて、インデックスcatの要素がtである場合、カテゴリcatがセットのメンバーであり、文字cがカテゴリcatに属することを意味します。
続く3つの関数では、オプション引数 table のデフォルト値は現在のバッファのカテゴリテーブルとなります。
この関数は、カテゴリテーブル table に対して、名称 char、ドキュメント docstring を持つ新しいカテゴリを定義します。
以下に、強い右から左への書字方向を持つ文字(双方向表示を参照)のための新しいカテゴリを定義し、それを特殊なカテゴリテーブルで使用する例を示します。文字の書字方向に関する情報を取得するため、このサンプルコードではUnicodeプロパティ「bidi-class」(bidi-classを参照)を使用しています。
(defvar special-category-table-for-bidi
;; Make an empty category-table.
(let ((category-table (make-category-table))
;; Create a char-table which gives the 'bidi-class' Unicode
;; property for each character.
(uniprop-table
(unicode-property-table-internal 'bidi-class)))
(define-category ?R "Characters of bidi-class R, AL, or RLO"
category-table)
;; Modify the category entry of each character whose
;; 'bidi-class' Unicode property is R, AL, or RLO --
;; these have a right-to-left directionality.
(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
に列挙されたカテゴリを初期内容とする新しいカテゴリセット(bool型のベクトル)を返します。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 がどのカテゴリに属するかを記録する
bool-vector です。関数 char-category-set
は、カテゴリテーブルに存在するものと同じ bool-vector を返すため、メモリを割り当てません。
(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
以外の場合は、代わりにそのバッファのカテゴリテーブルを記述します。