次: , 前: Font Lock Basics, 上: Font Lock Mode


22.5.2 探索に基づくフォント選択

フォントロック(font-lock)モードのカスタマイズにおいて もっとも重要な変数はfont-lock-keywordsです。 探索に基づく表示方法の選択における探索条件を指定します。

— 変数: font-lock-keywords

この変数の値は、強調表示するべきキーワードのリストである。 このリストに正規表現を書く場合には注意すること。 貧弱な書き方をしたパターンであると、動作を劇的に遅くする!

font-lock-keywordsの各要素は、 特定のテキストの探し方と 当該テキストをどのように強調表示するか指定します。 フォントロック(font-lock)モードは、 font-lock-keywordsの要素を1つ1つ処理し、 各要素において、それに一致するものすべてを探して処理します。 通常、すでに表示方法を選択済みのテキスト部分については、 それ以降の要素に一致しても表示方法を変えません。 しかし、highlighterの要素overrideを使って、 異なるふるまいを指定できます。

font-lock-keywordsの各要素はつぎのいずれかの形です。

regexp
正規表現regexpに一致したものはすべて font-lock-keyword-faceを使って強調表示する。
          
          
          ;; 孤立した`foo'の出現は
          ;; font-lock-keyword-faceで強調表示する。
          "\\<foo\\>"
     

関数regexp-opt(see Syntax of Regexps)は、 異なる複数個のキーワードに一致する最適な正規表現を 計算するのに有用である。

function
関数functionを呼び出してテキストを探し、 それが探し出したものをfont-lock-keyword-faceを使って強調表示する。

functionは、探索限界を引数として呼び出される。 みつかればnil以外を返すとともに みつけた部分を表すマッチデータを設定する。

(matcher . match)
この種の要素では、matcherは、上に述べた正規表現か関数を表す。 cdrmatchは、(matcherに一致した部分全体のかわりに) 強調表示すべきmatcherの部分式を指定する。
          
          
          ;; `fubar'の各出現の`bar'を
          ;; font-lock-keyword-faceで強調表示
          ("fu\\(bar\\)" . 1)
     

正規表現matcherを作るためにregexp-optを使った場合、 matchの値を計算するには regexp-opt-depth(see Syntax of Regexps)を使える。

(matcher . facename)
この種の要素では、facenameは、 強調表示に使うフェイス名を指定する値を表す式である。
          
          
          ;; `fubar'の出現は、fubar-faceの値で
          ;; 表されたフェイスを使って強調表示
          ("fubar" . fubar-face)
     

(matcher . highlighter)
この種の要素では、highlighterは、 matcherに一致した部分の強調表示方法を指定するリストである。 つぎの形であること。
          (subexp facename override laxmatch)
     

carsubexpは、 強調表示すべき一致部分の部分式を指定する整数 (0は一致部分全体を意味する)である。 2番目の要素facenameは、上に述べたようにフェイスを指定する。

highlighterの最後の2つの要素、 overridelaxmatchはフラグである。 overridetであると、当該要素は、 font-lock-keywordsのまえの要素で決定済みの 表示方法に優先することを表す。 keepであると、他の要素では表示方法が決定していない 各文字の表示方法を表す。 prependであると、 属性faceの先頭にフェイスfacenameを追加する。 appendであると、 属性faceの末尾にフェイスfacenameを追加する。

laxmatchnil以外であると、 matcherで一致したものの中にsubexp番目の部分式が なくてもエラーとしないことを意味する。

この種の要素とその動作の例を示す。

          
          
          
          ;; `foo'や`bar'の出現の表示方法がすでに決まっていても
          ;; foo-bar-faceで強調表示する
          ;; foo-bar-faceの値はフェイスであること
          ("foo\\|bar" 0 foo-bar-face t)
          
          
          
          
          ;; 関数fubar-matchがみつけた各出現内の最初の部分式を
          ;; fubar-faceの値が表すフェイスで強調表示する
          (fubar-match 1 fubar-face)
     

(matcher highlighters...)
この種の要素は、1つのmatcherに対して 複数のリストhighlighterを指定する。 これが有用であるためには、 各highlightersubexpの値が異なること。 つまり、それぞれをmatcherの異なる部分式に適用できること。
(eval . form)
formは、バッファにおいてfont-lock-keywordsのこの値が 始めて使われたときに評価すべき式である。 その値は、この表にあげた形の1つであること。

警告: font-lock-keywordsの要素は、 行をまたがって一致するように設計しないこと。 そのような処理は信頼性がない。 font-lock-fontify-bufferは、行にまたがるパターンを正しく扱えるが、 読者がバッファを編集したときの更新処理では、 一度に1行ずつ処理するために正しく扱えない。