Previous: , Up: Syntax Tables   [Contents][Index]


35.8 カテゴリー

カテゴリー(categories)は構文的に文字をクラス分けする別の手段を提供します。必要に応じて複数のカテゴリーを定義して、それぞれの文字に独立して1つ以上のカテゴリーを割り当てることができます。構文クラスと異なりカテゴリーは互いに排他ではありません。1つの文字が複数のカテゴリーに属すのは普通のことです。

バッファーはそれぞれカテゴリーテーブル(category table)をもっています。これはどのカテゴリーが定義されていて、各カテゴリーにどの文字が属すかを記録しています。カテゴリーテールは自身のカテゴリーを定義しますが、標準カテゴリーはすべてのモードで利用可能なので、これらは通常は標準カテゴリーテーブルをコピーすることにより初期化されます。

カテゴリーはそれぞれ‘ から‘~’の範囲のASCIIプリント文字による名前をもちます。define-categoryで定義する際にはカテゴリーの名前を指定します。

カテゴリーテーブルは実際には文字テーブルです(Char-Tablesを参照)。カテゴリーテーブルのインデックスcの要素は、文字cが属するカテゴリーを示すカテゴリーセット(category set)というブールベクターです。このカテゴリーセット内で、もしインデックスcatの要素がtならcatはそのセットのメンバーであり、その文字cはカテゴリーcatに属することを意味します。

以下の3つの関数のオプション引数tableのデフォルトは、カレントバッファーのカテゴリーテーブルです。

Function: define-category char docstring &optional table

この関数はカテゴリーテーブルtableにたいして名前がchar、ドキュメントがdocstringであるような新たなカテゴリーを定義する。

以下ではR2L(right-to-left: 右から左)への強い方向性(directionality)をもつ文字(Bidirectional Displayを参照)にたいするカテゴリーを新たに定義して、それを特別なカテゴリーテーブル内で使用する例を示す。文字の方向性に関する情報を取得するために、コード例では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))
Function: category-docstring category &optional table

この関数はカテゴリーテーブルtable内のカテゴリーcategoryのドキュメント文字列をリターンする。

(category-docstring ?a)
     ⇒ "ASCII"
(category-docstring ?l)
     ⇒ "Latin"
Function: get-unused-category &optional table

この関数はtable内で現在のところ未定義なカテゴリーの名前(文字)をリターンする。table内で利用可能なカテゴリーがすべて使用済みならnilをリターンする。

Function: category-table

この関数はカレントバッファーのカテゴリーテーブルをリターンする。

Function: category-table-p object

この関数はobjectがカテゴリーテーブルならt、それ以外はnilをリターンする。

Function: standard-category-table

この関数は標準カテゴリーテーブルをリターンする。

Function: copy-category-table &optional table

この関数はtableのコピーを構築してリターンする。tableが与えられない(またはnil)なら、標準カテゴリーテーブルのコピーをリターンする。それ以外の場合には、もしtableがカテゴリーテーブルでなければエラーをシグナルする。

Function: set-category-table table

この関数はtableをカレントバッファーのカテゴリーテーブルにする。リターン値はtable

Function: make-category-table

これは空のカテゴリーテーブルを作成してリターンする。空のカテゴリーテーブルでは、どのカテゴリーも割り当てられておらず何らかのカテゴリーに属する文字もない。

Function: make-category-set categories

この関数は初期内容が文字列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"
Function: char-category-set char

この関数はカレントバッファーのカテゴリーテーブル内で、文字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"
Function: category-set-mnemonics category-set

この関数はカテゴリーセットcategory-setを、そのセットのメンバーのカテゴリーを指定する文字を含む文字列に変換する。

(category-set-mnemonics (char-category-set ?a))
     ⇒ "al"
Function: modify-category-entry char category &optional table reset

この関数はカテゴリーテーブルtable (デフォルトはカレントバッファーのカテゴリーテーブル)内のcharのカテゴリーセットを変更する。charには文字、または(min . max)という形式のコンスセルを指定できる。後者の場合には、この関数はminmaxの間(両端を含む)の範囲にあるすべての文字のカテゴリーセットを変更する。

これは通常はカテゴリーセットにcategoryを追加することにより変更を行う。しかしresetが非nilなら、かわりにcategoryを削除する。

Command: describe-categories &optional buffer-or-name

この関数はカレントカテゴリーテーブル内のカテゴリー仕様を説明する。これはその説明をバッファーに挿入してから、そのバッファーを表示する。buffer-or-nameが非nilなら、かわりにそのバッファーのカテゴリーテーブルを説明する。