Next: , Previous: , Up: Font Lockモード   [Contents][Index]


24.6.3 検索ベースのフォント化のカスタマイズ

メジャーモードにたいして検索ベースフォント表示ルールを追加するためにfont-lock-add-keywords、削除にはfont-lock-remove-keywordsを使用することができます。特定の条件にマッチするキーワードにたいして選択的にフォント表示を無効にするよう、font-lock-ignoreオプションをカスタマイズすることもできます。

Function: font-lock-add-keywords mode keywords &optional how

この関数はカレントバッファー、またはメジャーモードmodeにたいしてハイライトするkeywordsを追加する。引数keywordsは変数font-lock-keywordsと同じ形式のリストであること。

modeが、c-modeのようにメジャーモードのコマンド名であるようなシンボルなら、そのmode内でFont Lockモードを有効にすることによってkeywordsfont-lock-keywordsに追加される効果がある。非nil値のmodeによる呼び出しは~/.emacsファイル内でのみ正しい。

modenilなら、この関数はカレントバッファーのfont-lock-keywordskeywordsを追加する。この方法でのfont-lock-add-keywords呼び出しは通常はモードフック関数内で使用される。

デフォルトではkeywordsfont-lock-keywordsの先頭に追加される。オプション引数howsetなら、それらはfont-lock-keywordsの値の置換に使用される。howがそれ以外の非nil値なら、これらはfont-lock-keywordsの最後に追加される。

追加のハイライトパターンの使用を可能にする、特別なサポートを提供するモードがいくつかある。それらの例については変数c-font-lock-extra-typesc++-font-lock-extra-typesjava-font-lock-extra-typesを参照のこと。

警告: メジャーモードコマンドはモードフックを除き、いかなる状況においても直接間接を問わずfont-lock-add-keywordsを呼び出してはならない(これを行うといくつかのマイナーモードは不正な振る舞いを起こしかねない)。メジャーモードコマンドはfont-lock-keywordsをセットすることにより、検索ベースフォント表示のルールをセットアップすること。

Function: font-lock-remove-keywords mode keywords

この関数はカレントバッファーやメジャーモードmodeにたいして、font-lock-keywordsからkeywordsを削除する。font-lock-add-keywordsの場合と同様にmodeはメジャーモードコマンド名かnilであること。この関数にもfont-lock-add-keywordsにたいするすべての制約と条件が適用される。引数keywordsは対応するfont-lock-add-keywordsが使用するキーワードと正確に一致しなければならない。

たとえば以下はCモードに2つのフォント表示パターンを追加するコードの例である。フォント表示の1つはたとえコメント内であろうとも単語‘FIXME’をフォント表示し、もう1つは‘and’、‘or’、‘not’をキーワードとしてフォント表示する。

(font-lock-add-keywords 'c-mode
 '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend)
   ("\\<\\(and\\|or\\|not\\)\\>" . font-lock-keyword-face)))

この例は厳密にCモードだけに効果がある。Cモード、およびその派生モードにたいして同じパターンを追加するには、かわりに以下を行う:

(add-hook 'c-mode-hook
 (lambda ()
  (font-lock-add-keywords nil
   '(("\\<\\(FIXME\\):" 1 font-lock-warning-face prepend)
     ("\\<\\(and\\|or\\|not\\)\\>" .
      font-lock-keyword-face)))))
User Option: font-lock-ignore

このオプションは特定のFont Lockキーワードによってフォント表示を選択的に無効にするための条件を定義する。非nilなら、値は以下のような形式の要素からなるリストであること:

(symbol condition …)

ここでsymbolはシンボル(通常はメジャーモードかマイナーモード)。symbolの後のリスト要素conditionsymbolがバインドされていて、なおかつ値が非nilなら効力をもつ。あるモードのシンボルについて考えると、カレントのメジャーモードがそのモードの派生モードであること、あるいはバッファーでそのマイナーモードが有効であることを意味する。conditionが効力をもつ間は要素font-lock-keywordsに因をなすすべてのフォント表示は、conditionがマッチした場合には無効化される。

conditionにはそれぞれ以下のいずれかを指定できる:

シンボル

この条件はそのシンボルを参照するFont Lockキーワード要素すべてにマッチする。通常はフェイスだが、font-lock-keywordsリストの要素によって参照される任意のシンボルを指定できる。シンボルにはワイルドカードを含めることができる。*はシンボルの名前に含まれる任意の文字列にマッチ、?は1文字にマッチ、そして[char-set] (char-setは1文字以上の文字列はその文字セットの1文字にマッチする。

文字列

この条件はmatcherが文字列にマッチするregexpであるようなFont Lockキーワード要素すべてにマッチする。言い換えると、これはその文字列をハイライトさせるようなFont Lockルールにマッチする条件である。したがってこの文字列に、ハイライトを無効にしたい特定のプログラムキーワードを指定できるかもしれない。

(pred function)

この条件は、その要素を引数としてfunctionを呼び出した際に非nilがリターンされるようなFont Lockキーワード要素すべてにマッチする。

(not condition)

これはconditionが成り立たなければマッチする。

(and condition …)

これはすべてのconditionがマッチすればマッチする。

(or condition …)

これは少なくとも1つのconditionがマッチすればマッチする。

(except condition)

この条件はトップレベルかor節内だけで使用できる。同一レベルにおいて前にマッチした条件の効果を取り消す。

セッティングの例として以下を考えてみましょう:

(setq font-lock-ignore
      '((prog-mode font-lock-*-face
                   (except help-echo))
        (emacs-lisp-mode (except ";;;###autoload)")
        (whitespace-mode whitespace-empty-at-bob-regexp)
        (makefile-mode (except *))))

これは1行ごとに以下のことを行っています:

  1. すべてのプログラミング用モードで、標準のfont-lockフェイスのいずれかを適用するようなfont-lockキーワードによるフォント表示を無効にする構文的なFont Lockが受けもつ文字列やコメントは除外)。
  2. ただしテキストプロパティhelp-echoに追加を行うキーワードはすべて保持。
  3. Emacs Lispモードでは最初の条件で除外され得るautoload cookieのハイライトは保持。
  4. whitespace-mode (マイナーモード)が有効なら、バッファー先頭の空行もハイライトさせない。
  5. 最後にMakefileモードでは条件を何も適用しない。