Next: Customizing Keywords, Previous: Font Lock Basics, Up: Font Lock Mode [Contents][Index]
検索ベースフォント表示を直接制御する変数は、font-lock-keywords
です。この変数は通常、font-lock-defaults
内の要素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のいずれかである。CDRのsubexpは、(matcherがマッチするテキスト全体のかわりに)matcherのどの部分式(subexpression)がハイライトされるべきかを指定する。
;; font-lock-keyword-face
Hを使用して
;; ‘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-highlighterはmatcherにより見つかったマッチをハイライトする方法を指定するリストである。これは、以下の形式をもつ。
(subexp facespec [override [laxmatch]])
CARのsubexpは、マッチのどの部分式をフォント表示するかを指定する整数である(0はマッチしたテキスト全体を意味する)。これの2つ目の要素facespecは、上述したような値がフェイスを指定するような式である。
subexp-highlighter内の残りの値overrideとlaxmatchは、オプションのフラグである。overrideがt
の場合、この要素は前のfont-lock-keywords
の要素により作成された既存のフォント表示をオーバーライドできる。値がkeep
の場合は、すでに他の要素によりフォント表示されていない文字がフォント表示される。値がprepend
の場合は、facespecにより指定されたフェイスが、font-lock-face
プロパティの先頭に追加される。値がappend
の場合は、そのフェイスがfont-lock-face
プロパティの最後に追加される。
laxmatchが非nil
の場合、それはmatcher内で番号付けされた部分式subexpが存在しなくても、エラーにならないことを意味する。当然、番号付けされた部分式subexpのフォント表示は発生しない。しかし、他の部分式(と他のregexp)のフォント表示は継続されるだろう。laxmatchがnil
で、指定された部分式が存在しない場合は、エラーがシグナルされて検索ベースのフォント表示は終了する。
以下はこのタイプの要素と、それが何を行うかの例である:
;;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-highlighterはmatcherが見つけたマッチに後続するテキストをハイライトする方法を指定する。つまり、matcherが見つけたマッチは、anchored-highlighterにより指定されるその先の検索にたいする、アンカー(anchor)として機能する。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使用時の事前の初期化、事後のクリーンアップに使用され得る。通常、pre-formはanchored-matcherを開始する前に、matcherのマッチに関連する何らかの位置にポイントを移動するために使用される。post-formは、matcherを再開する前に、ポイントを戻すために使用されるかもしれない。
pre-formを評価した後、Font Lockはその行の終端の先にたいして、anchored-matcherの検索を行わない。しかし、pre-formがpre-form評価後のポイント位置より大きいバッファー位置をリターンした場合には、かわりにpre-formによりリターンされた位置が検索リミットとして使用される。一般的に、その行の終端より大きい位置をリターンするのは、よいアイデアではない。別の言い方をすると、anchored-matcher検索は複数行にわたる(span lines)べきではないと言えよう。
たとえば、
;; item-face
の値を使用して
;; 単語‘anchor’に(同一行内で)
;; 後続する単語‘item’をハイライトする
("\\<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のいずれかを指定できる。
たとえば、
;;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を使用できる。
非nil
は、font-lock-keywords
のための正規表現マッチングが、大文字小文字を区別すべきではないことを意味する。