構文テーブルでは言語の構文を規定するのに十分な柔軟性がない場合、syntax-table
テキストプロパティを適用することで、バッファ内の特定の文字出現箇所に対して構文テーブルを上書きできます。テキストプロパティの適用方法については、テキストプロパティを参照してください。
syntax-table テキストプロパティの有効な値は以下の通りです:
プロパティ値が構文テーブルである場合、基となるテキスト文字の構文を決定するために、現在のバッファの構文テーブルの代わりにそのテーブルが使用されます。
(syntax-code . matching-char)この形式の cons セルは生の構文記述子(構文テーブルの内部構造を参照)であり、基となるテキスト文字の構文クラスを直接指定します。
nilプロパティが nil の場合、文字の構文は通常の手順で現在の構文テーブルから決定されます。
これが non-nil の場合、forward-sexp などの構文スキャン関数は syntax-table
のテキストプロパティを参照します。そうでない場合は、現在の構文テーブルのみを使用します。
この変数が nil 以外の場合、指定されたテキスト範囲に syntax-table
プロパティを適用するための関数を格納する必要があります。これは、メジャーモードが、モードに適した方法で syntax-table プロパティを適用する関数をインストールするために使用することを想定しています。
この関数は、syntax-ppss(位置のパース状態の特定を参照)によって呼び出されるほか、構文的なフォント化(構文的フォントロックを参照)の際にFont
Lockモードによっても呼び出されます。この関数は、処理対象となるテキストの開始位置と終了位置である2つの引数、startとendを指定して呼び出されます。また、startとendで区切られた領域内で、ポイントを任意に移動させることができます。このような移動にsave-excursionを使用する必要はありません(エクスカーションを参照)。さらに、endより前の任意の位置でsyntax-ppssを呼び出すこともできますが、Lispプログラムがある位置でsyntax-ppssを呼び出し、その後さらに前の位置にあるバッファを変更した場合は、キャッシュから不要になった情報をフラッシュするためにsyntax-ppss-flush-cacheを呼び出す責任はそのプログラムにあります。
注意: この変数が non-nil
の場合、Emacs は syntax-table テキストプロパティを任意に削除し、syntax-propertize-function
を用いてそれらを再適用します。したがって、この機能を利用する場合、関数はメジャーモードで使用されるすべての syntax-table
テキストプロパティを適用しなければなりません。特に、CC Mode モードから派生したモードはこの変数を使用してはいけません。CC Mode
は、これらのテキストプロパティの適用および削除に別の手段を用いるためです。
この特殊なフックは、syntax-propertize-functionを呼び出す前に構文解析コードによって実行されます。その役割は、syntax-propertize-functionに渡すための安全な開始・終了バッファ位置を特定する手助けをすることです。例えば、メジャーモードはこのフックに関数を追加して複数行にわたる構文構造を識別し、境界がそれらの途中に位置しないようにすることができます。
このフック内の各関数は、start と end
の2つの引数を受け取る必要があります。また、調整後の2つのバッファ位置 (new-start . new-end)
を含むコンスセルを返すか、調整が不要な場合は nil を返します。フック関数は、すべてが nil を返すまで、順次繰り返し実行されます。