検索ベースのフォント化を直接制御する変数は font-lock-keywords であり、通常は
font-lock-defaults 内の keywords 要素を介して指定されます。
この変数の値は、ハイライト対象のキーワードのリストです。Lispプログラムはこの変数を直接設定すべきではありません。通常、値はFont
Lockモードによって、font-lock-defaults内のkeywords要素を用いて自動的に設定されます。また、font-lock-add-keywordsおよびfont-lock-remove-keywords関数を使用して値を変更することもできます(検索ベースのフォント化のカスタマイズを参照)。
font-lock-keywords
の各要素は、テキストの特定の箇所をどのように検索し、それらをどのようにハイライトするかを指定します。Font Lock モードは font-lock-keywords
の要素を一つずつ処理し、各要素についてすべての一致箇所を検出して処理します。通常、テキストの一部がすでにフォント化されると、同じテキスト内での後続の一致によってそれを上書きすることはできません。ただし、subexp-highlighter の override
要素を使用することで、異なる動作を指定できます。
font-lock-keywords の各要素は、以下のいずれかの形式である必要があります:
regexpfont-lock-keyword-faceを使用してregexpのすべてのマッチをハイライトします。例えば、
;; Highlight occurrences of the word ‘foo’
;; using font-lock-keyword-face.
"\\<foo\\>"
これらの正規表現を記述する際はご注意ください。パターンの記述が不適切だと、処理速度が著しく低下することがあります!関数 regexp-opt(正規表現関数を参照)は、複数のキーワードにマッチする最適な正規表現を算出する際に便利です。
functionfunctionを呼び出してテキストを検索し、見つかった一致箇所をfont-lock-keyword-faceでハイライトしてください。
function
が呼び出されると、探索の上限という1つの引数を受け取ります。点から探索を開始し、上限を超えて探索してはなりません。成功した場合は non-nil を返し、マッチデータに見つかったマッチの内容を設定します。nil を返すことは、探索の失敗を示します。
Fontificationは、functionを同一の制限値で、かつ前回の呼び出しが終了した位置から、functionが失敗するまで繰り返し呼び出す。失敗時、functionは特定の方法でpointをリセットする必要はない。
function は、受け取った point と limit
引数の間の領域をハイライトする処理を担うこともあります。その場合、nil
を返す必要があります。そうでない場合、font-lock は match データで記述されたマッチ箇所をハイライトし、同じ limit
を指定して再度この関数を呼び出す可能性があります。
(matcher . subexp)この種の要素では、matcher は前述の通り、正規表現または関数のいずれかとなります。CDR である subexp は、matcher がマッチしたテキスト全体ではなく、matcher のどの部分式をハイライトすべきかを指定します。
;; Highlight the ‘bar’ in each occurrence of ‘fubar’,
;; using font-lock-keyword-face.
("fu\\(bar\\)" . 1)
(matcher . facespec)この種の要素において、facespec はハイライトに使用するフェイスを指定する値を持つ式です。最も単純な例では、facespec は Lisp 変数(シンボル)であり、その値はフェイス名となります。
;; Highlight occurrences of ‘fubar’,
;; using the face which is the value of fubar-face.
("fubar" . fubar-face)
ただし、facespec はこのような形式のリストとして評価されることもあります:
(subexp (face face prop1 val1 prop2 val2...))
一致するテキストに適用するフェイス face
および各種追加のテキストプロパティを指定します。このように設定する場合は、不要になった際にプロパティもクリアされるよう、この方法で設定した他のテキストプロパティ名も必ず
font-lock-extra-managed-props の値に追加してください。あるいは、変数
font-lock-unfontify-region-function
にこれらのプロパティをクリアする関数を設定することも可能です。その他の Font Lock 変数 を参照してください。
(matcher . subexp-highlighter)この種の要素において、subexp-highlighterはmatcherで見つかったマッチをどのようにハイライトするかを指定するリストです。その形式は以下の通りです:
(subexp facespec [override [laxmatch]])
CAR, subexp は、マッチした部分式のうちどれをフォント化するかを指定する整数です(0 はマッチしたテキスト全体を意味します)。2番目のサブ要素 facespec は、前述の通り、その値でフォントを指定する式です。
subexp-highlighter、override、laxmatch
の最後の2つの値は、オプションのフラグです。override が t の場合、この要素は font-lock-keywords
の先行する要素によって行われた既存のフォント化を上書きできます。keep
の場合、他の要素によって既にフォント化されていない各文字がフォント化されます。prepend
の場合、facespec で指定されたフェイスが font-lock-face プロパティの先頭に追加されます。append の場合、フェイスが font-lock-face プロパティの末尾に追加されます。
laxmatch が nil でない場合、matcher 内に番号 subexp
の部分式が存在しなければ、エラーは発生しないことになります。当然ながら、番号 subexp
の部分式のフォント化は行われません。ただし、他の部分式(および他の正規表現)のフォント化は継続されます。laxmatch が nil
であり、指定された部分式が存在しない場合は、エラーが通知され、検索ベースのフォント化が終了します。
この種の要素の例と、それらがどのような働きをするかを以下に挙げます。
;; Highlight occurrences of either ‘foo’ or ‘bar’, using ;;foo-bar-face, even if they have already been highlighted. ;;foo-bar-faceshould be a variable whose value is a face. ("foo\\|bar" 0 foo-bar-face t) ;; Highlight the first subexpression within each occurrence ;; that the functionfubar-matchfinds, ;; using the face which is the value offubar-face. (fubar-match 1 fubar-face)
(matcher . anchored-highlighter)この種の要素では、anchored-highlighter は matcher で見つかったマッチに続くテキストをどのように強調するかを指定します。つまり、matcher で見つかったマッチが、anchored-highlighter で指定される後続の検索のアンカーとして機能します。anchored-highlighter は以下の形式のリストです:
(anchored-matcher pre-form post-form subexp-highlighters...)
ここで、anchored-matcher は matcher と同様に、正規表現または関数のいずれかです。matcher のマッチが見つかると、ポインタはマッチの末尾に位置します。次に、Font Lock は形式 pre-form を評価します。その後、anchored-matcher のマッチを検索し、subexp-highlighters を用いてそれらをハイライトします。subexp-highlighter は前述の通りです。最後に、Font Lock は post-form を評価します。
pre-form および post-form という形式は、anchored-matcher を使用する前の初期化と、使用後のクリーンアップに利用できます。通常、anchored-matcher を開始する前に、pre-form を用いてポイントを matcher のマッチに対するある位置に移動させます。matcher で再開する前に、post-form を用いて戻ることもあります。
Font Lock は pre-form を評価した後、行末を超えて anchored-matcher を検索することはありません。ただし、pre-form が返すバッファ位置が、pre-form の評価後の point の位置よりも大きい場合、代わりに pre-form が返す位置が検索の上限として用いられます。一般的に、行末を超える位置を返すことは避けるべきです。言い換えれば、anchored-matcher の検索は行をまたいではなりません。
例えば、
;; Highlight occurrences of the word ‘item’ following
;; an occurrence of the word ‘anchor’ (on the same line)
;; in the value of item-face.
("\\<anchor\\>" "\\<item\\>" nil nil (0 item-face))
ここでは、pre-form と post-form は
nil です。したがって、‘item’ の検索は ‘anchor’ のマッチの末尾から始まり、それ以降の ‘anchor’ の検索は、‘item’ の検索が終了した箇所から再開されます。
(matcher highlighters…)この種の要素は、単一の matcher に対して複数の highlighter リストを指定します。highlighter リストは、前述の通り subexp-highlighter 型または anchored-highlighter 型のいずれかになります。
例えば、
;; Highlight occurrences of the word ‘anchor’ in the value ;; ofanchor-face, and subsequent occurrences of the word ;; ‘item’ (on the same line) in the value ofitem-face. ("\\<anchor\\>" (0 anchor-face) ("\\<item\\>" nil nil (0 item-face)))
(eval . form)ここで form は、バッファ内でこの font-lock-keywords
の値が最初に使用された際に評価される式です。その値は、この表に記載されている形式のいずれかである必要があります。
警告: font-lock-keywords
の要素を、複数行にわたるテキストに一致させるように設計しないでください。この方法では確実に動作しません。詳細については、複数行フォントロック構文を参照してください。
font-lock-defaults 内で case-fold を使用することで、検索ベースのフォント化を大文字小文字区別なしで行うかどうかを指定する
font-lock-keywords-case-fold-search の値を設定できます。
Non-nil は、font-lock-keywords のための正規表現マッチングを大文字小文字を区別せずに行うことを意味します。