Next: , Previous: , Up: Font Lock Mode   [Contents][Index]


22.6.2 Search-based Fontification

検索ベースフォント表示を直接制御する変数は、font-lock-keywordsです。この変数は通常、font-lock-defaults内の要素keywordsを通じて指定されます。

Variable: font-lock-keywords

この変数の値は、ハイライトするキーワードのリストである。Lispプログラムは、この変数を直接セッすべきでない。通常は、font-lock-defaults内の要素keywordsを使用して、Font Lockモードが自動的に値をセットする。この値は、関数font-lock-add-keywordsおよびfont-lock-remove-keywordsを使用して、変更されることもあり得る(Customizing Keywordsを参照)。

font-lock-keywordsの各要素は、特定のケースに該当するテキストを見つける方法、およびそれらをハイライトする方法を指定します。Font Lockモードは、font-lock-keywordsの要素をちくじ処理してマッチを探して、すべてのマッチを処理します。通常は、テキストの一部はすでに一度はフォント表示されており、同じテキスト内で連続するマッチによるこれをオーバーライドはできません。しかし、subexp-highlighterの要素overrideを使用して、異なる挙動を指定できます。

font-lock-keywordsの各要素は、以下の形式のいずれかをもつべきです:

regexp

font-lock-keyword-faceを使用して、regexpにたいするすべてのマッチをハイライトする。たとえば、

;; font-lock-keyword-faceを使用して
;; 単語‘foo’をハイライトする
"\\<foo\\>"

これらの正規表現を作成するときは、慎重に行うこと。下手に記述されたパターンにより、スピードが劇的に低下し得る! 関数regexp-opt(Regexp Functionsを参照)は、いくつかのキーワードとマッチするために最適な正規表現の計算に有用である。

function

functionを呼び出すことによりテキストを探し、font-lock-keyword-faceを使用して見つかったマッチをハイライトする。

functionは、呼び出される際に1つの引数(検索のリミット)を受け取る。検索はポイント位置から開始し、そのリミットを超えた検索は行うべきではない。これは、検索が成功した場合は非nilをリターンして、見つかったマッチを表すマッチデータをセットすべきである。nilのリターンは、検索の失敗を示す。

フォント表示は、前の呼び出しでポイントが残された位置から、同じリミットを用いてfunctionを呼び出し、functionが失敗するまでfunctionを繰り返し呼び出すだろう。検索が失敗しても、何らかの特別な方法により、functionがポイントをリセットする必要はない。

(matcher . subexp)

この種の要素では、matcherは上述のregexpかfunctionのいずれかである。CDRsubexpは、(matcherがマッチするテキスト全体のかわりに)matcherのどの部分式(subexpression)がハイライトされるべきかを指定する。

;; font-lock-keyword-faceHを使用して
;; bar’が‘fubar’の一部のときに
;; ハイライトする
("fu\\(bar\\)" . 1)

正規表現matcherの生成にregexp-optを使用する場合は、subexpにたいする値の計算にregexp-opt-depth(Regexp Functionsを参照)を使用できる。

(matcher . facespec)

この種の要素では、facespecの値がハイライトに使用するフェイスを指定する。もっともシンプルな例では、facespecは値がフェイス名であるようなはLisp変数(シンボル)である。

;; fubar-faceの値のフェイスを使用して
;; fubar’をハイライトする
("fubar" . fubar-face)

しかし、facespecは以下のような形式のリストに評価されてもよい:

(face face prop1 val1 prop2 val2…)

これは、マッチしたテキストにフェイスfaceを指定し、さまざまなテキストプロパティをputする。これを行う場合は、この方法によりfont-lock-extra-managed-propsに値をセットする、他のテキストプロパティ名を確実に追加すること。そうすれば、それらのプロパティが妥当性を失ったとき、それらのプロパティもクリアーされるだろう。これらのプロパティをクリアーする関数を、変数font-lock-unfontify-region-functionにセットすることもできる。Other Font Lock Variablesを参照のこと。

(matcher . subexp-highlighter)

この種の要素では、subexp-highlightermatcherにより見つかったマッチをハイライトする方法を指定するリストである。これは、以下の形式をもつ。

(subexp facespec [override [laxmatch]])

CARsubexpは、マッチのどの部分式をフォント表示するかを指定する整数である(0はマッチしたテキスト全体を意味する)。これの2つ目の要素facespecは、上述したような値がフェイスを指定するような式である。

subexp-highlighter内の残りの値overridelaxmatchは、オプションのフラグである。overridetの場合、この要素は前のfont-lock-keywordsの要素により作成された既存のフォント表示をオーバーライドできる。値がkeepの場合は、すでに他の要素によりフォント表示されていない文字がフォント表示される。値がprependの場合は、facespecにより指定されたフェイスが、font-lock-faceプロパティの先頭に追加される。値がappendの場合は、そのフェイスがfont-lock-faceプロパティの最後に追加される。

laxmatchが非nilの場合、それはmatcher内で番号付けされた部分式subexpが存在しなくても、エラーにならないことを意味する。当然、番号付けされた部分式subexpのフォント表示は発生しない。しかし、他の部分式(と他のregexp)のフォント表示は継続されるだろう。laxmatchnilで、指定された部分式が存在しない場合は、エラーがシグナルされて検索ベースのフォント表示は終了する。

以下はこのタイプの要素と、それが何を行うかの例である:

;; foo-bar-faceを使用して、たとえハイライト済みでも
;; foo’と‘bar’をハイライトする
;; foo-bar-faceは値がフェイスであるような変数であること
("foo\\|bar" 0 foo-bar-face t)

;; fubar-faceの値のフェイスを使用して
;; 関数fubar-matchが見つけた各マッチの
;; 最初の部分式をハイライトする
(fubar-match 1 fubar-face)
(matcher . anchored-highlighter)

この種の要素では、anchored-highlightermatcherが見つけたマッチに後続するテキストをハイライトする方法を指定する。つまり、matcherが見つけたマッチは、anchored-highlighterにより指定されるその先の検索にたいする、アンカー(anchor)として機能する。anchored-highlighterは、以下の形式のリストである:

(anchored-matcher pre-form post-form
                        subexp-highlighters…)

ここで、anchored-matchermatcherと同様、正規表現か関数である。matcherにたいするマッチを見つけた後に、ポイントはそのマッチの終端に移動する。そこで、Font Lockはフォームpre-formを評価する。それからanchored-matcherにたいするマッチを検索し、subexp-highlightersを使用して、それらのマッチをハイライトする。subexp-highlighterについては上記を参照のこと。最後にFont Lockはpost-formを評価する。

フォームpre-formおよびpost-formは、anchored-matcher使用時の事前の初期化、事後のクリーンアップに使用され得る。通常、pre-formanchored-matcherを開始する前に、matcherのマッチに関連する何らかの位置にポイントを移動するために使用される。post-formは、matcherを再開する前に、ポイントを戻すために使用されるかもしれない。

pre-formを評価した後、Font Lockはその行の終端の先にたいして、anchored-matcherの検索を行わない。しかし、pre-formpre-form評価後のポイント位置より大きいバッファー位置をリターンした場合には、かわりにpre-formによりリターンされた位置が検索リミットとして使用される。一般的に、その行の終端より大きい位置をリターンするのは、よいアイデアではない。別の言い方をすると、anchored-matcher検索は複数行にわたる(span lines)べきではないと言えよう。

たとえば、

;; item-faceの値を使用して
;; 単語‘anchor’に(同一行内で)
;; 後続する単語‘item’をハイライトする
("\\<anchor\\>" "\\<item\\>" nil nil (0 item-face))

ここで、pre-formpost-formnilである。したがって、‘item’にたいする検索は‘anchor’にたいするマッチの終端から開始され、後続する‘anchor’インスタンスにたいする検索は、‘item’にたいする検索が終了した位置から再開される。

(matcher highlighters…)

この種の要素は、単一のmatcherにたいして、複数のhighlighterリストを指定する。highlighterリストには、上述したsubexp-highlighter、またはanchored-highlighterのいずれかを指定できる。

たとえば、

;; anchor-faceの値内に現れる単語‘anchor’、
;; および、(同じ行の)後続のitem-face
;;  値内に現れる単語‘item’をハイライトする
("\\<anchor\\>" (0 anchor-face)
                ("\\<item\\>" nil nil (0 item-face)))
(eval . form)

ここでformは、バッファー内でこのfont-lock-keywordsの値が最初に使用されるときに評価される式である。この値は、上述のこのテーブルで説明した、いずれかの形式をもつべきである。

警告: 複数行にわたるテキストにたいするマッチさせるために、font-lock-keywordsの要素をデザインしてはならない。これは確実に機能するとは言えない。詳細は、Multiline Font Lockを参照のこと。

検索ベースのフォント表示が大文字小文字を区別すべきかどうかを告げるfont-lock-keywords-case-fold-searchの値を指定するために、font-lock-defaults内でcase-foldを使用できる。

Variable: font-lock-keywords-case-fold-search

nilは、font-lock-keywordsのための正規表現マッチングが、大文字小文字を区別すべきではないことを意味する。