Previous: Lispでの大文字小文字変換, Up: 文字列と文字 [Contents][Index]
特別なcaseテーブル(case table)をインストールすることにより、caseの変換をカスタマイズできます。caseテーブルは大文字と小文字の間のマッピングを指定します。caseテーブルはLispオブジェクトにたいするcase変換関数(前のセクションを参照)と、バッファー内のテキストに適用される関数の両方に影響します。それぞれのバッファーにはcaseテーブルがあります。新しいバッファーのcaseテーブルを初期化するために使用される、標準のcaseテーブル(standard case table)もあります。
caseテーブルは、サブタイプがcase-table
の文字テーブル(char-table。文字テーブルを参照)です。この文字テーブルはそれぞれの文字を対応する小文字にマップします。caseテーブルは、関連するテーブルを保持する3つの余分なスロットをもちます:
upcase(大文字)テーブルはそれぞれの文字を対応する大文字にマップする。
canonicalize(正準化)テーブルは、caseに関連する文字セットのすべてを、その文字セットの特別なメンバーにマップする。
equivalence(同値)テーブルは、大文字・小文字に関連した文字セットのそれぞれを、そのセットの次の文字にマップする。
単純な例では、小文字へのマッピングを指定することだけが必要です。3つの関連するテーブルは、このマッピングから自動的に計算されます。
大文字と小文字が1対1で対応しない言語もいくつかあります。これらの言語では、2つの異なる小文字が同じ大文字にマップされます。このような場合、大文字と小文字の両方にたいするマップを指定する必要があります。
一部の文字はその文字用に定義された特別なcase変換ルールをもっており、このルールはデフォルトではカレントcaseテーブルをオーバーライドします。これらの文字はUnicode標準が定義する文字プロパティspecial-uppercase
、special-lowercase
、またはspecial-titlecase
をもっています(文字のプロパティを参照)。たとえばU+00DF LATIN SMALL LETTER SHARP Sのßは、デフォルトではU+1E9E
LATIN CAPITAL LETTER SHARP
Sではなく文字列"SS"
に大文字変換されます。これらの文字がcaseテーブル変換にしたがうよう強制するには、相当するUnicodeプロパティにnil
をセットします:
(upcase "ß") => "SS" (put-char-code-property ?ß 'special-uppercase nil) (upcase "ß") => "ẞ"
caseテーブルの追加スロットcanonicalizeは、それぞれの文字を正準化された等価文字にマップします。caseに関連する任意の2文字は、同じ正準等価文字(canonical equivalent character)をもちます。たとえば‘a’と‘A’はcase変換に関係があるので、これらの文字は同じ正準等価文字(両方の文字が‘a’、または両方の文字が‘A’)をもつべきです。
追加スロットのequivalencesは、等価クラスの文字(同じ正準等価文字をもつ文字)それぞれを循環的にマップします(通常のASCIIでは、これは‘a’を‘A’に‘A’を‘a’にマップし、他の等価文字セットにたいしても同様にマップする)。
caseテーブルを構築する際は、canonicalizeにnil
を指定できます。この場合、Emacsは大文字と小文字のマッピングでこのスロットを充填します。equivalencesにたいしてnil
を指定することもできます。この場合、Emacsはcanonicalizeからこのスロットを充填します。実際に使用されるcaseテーブルでは、これらのコンポーネントは非nil
です。canonicalizeを指定せずにequivalencesを指定しないでください。
以下はcaseテーブルに作用する関数です:
この述語は、objectが有効なcaseテーブルなら非nil
をリターンする。
この関数はtableを標準caseテーブルにして、これ以降に作成される任意のバッファーにたいしてこのテーブルが使用されるようにする。
これは標準caseテーブル(standard case table)をリターンする。
この関数はカレントバッファーのcaseテーブルをリターンする。
これはカレントバッファーのcaseテーブルをtableにセットする。
with-case-table
マクロはカレントcaseテーブルを保存してから、tableをカレントcaseテーブルにセットし、その後にbodyフォームを評価してから、最後にcaseテーブルをリストアします。リターン値は、bodyの最後のフォームの値です。throw
かエラー(非ローカル脱出を参照)により異常終了した場合でも、caseテーブルはリストアされます。
ASCII文字のcase変換を変更する言語環境(language
environment)がいくつかあります。たとえばトルコ語の言語環境では、ASCIIの大文字‘I’にたいする小文字は、トルコ語のドットがないi(‘ı’)です。これは(ASCIIベースのネットワークプロトコル実装のような)ASCIIの通常のcase変換を要求するコードに干渉する可能性があります。このような場合には、変数ascii-case-tableにたいしてwith-case-table
マクロを使用してください。これにより変更されていないASCII文字セットのcaseテーブルが保存されます。
ASCII文字セットにたいするcaseテーブル。すべての言語環境セッティングにおいて、これを変更するべきではない。
以下の3つの関数は、非ASCII文字セットを定義するパッケージにたいして便利なサブルーチンです。これらはcase-tableに指定されたcaseテーブルを変更します。これは標準構文テーブルも変更します。構文テーブルを参照してください。通常これらの関数は、標準caseテーブルを変更するために使用されます。
この関数は対応する文字のペアー(一方は大文字でもう一方は小文字)を指定する。
この関数は文字lとrを、case不変区切り(case-invariant delimiter)のマッチングペアーとする。
この関数はcharを構文syntaxのcase不変(case-invariant)とする。
このコマンドはカレントバッファーのcaseテーブルの内容にたいする説明を表示する。