font-lock-add-keywords
を使用してメジャーモードに検索ベースのフォント化ルールを追加したり、font-lock-remove-keywords を使用してルールを削除したりできます。また、font-lock-ignore
オプションをカスタマイズして、特定の条件に一致するキーワードのフォント化ルールを選択的に無効にすることも可能です。
この関数は、現在のバッファまたはメジャーモード mode に対してハイライト keywords を追加します。引数 keywords は、変数
font-lock-keywords と同じ形式のリストである必要があります。
mode が c-mode
のようなメジャーモードコマンド名である場合、mode で Font Lock
モードを有効にすると、font-lock-keywords に keywords が追加されることになります。mode に nil 以外の値を指定して呼び出すのが正しいのは、お使いの ~/.emacs ファイル内のみです。
mode が nil
である場合、この関数は現在のバッファ内の font-lock-keywords に keywords を加算します。このような font-lock-add-keywords の呼び出し方は、通常モードフック関数で用いられます。
デフォルトでは、keywords は font-lock-keywords の先頭に追加されます。オプション引数 how が set である場合、これらは font-lock-keywords の値を置き換えるために使用されます。how が nil 以外の値である場合、これらは font-lock-keywords の末尾に追加されます。
一部のモードでは、追加のハイライトパターンで活用できる専用のサポートが提供されています。例えば、変数 c-font-lock-extra-types、c++-font-lock-extra-types、java-font-lock-extra-types を参照してください。
警告:
メジャーモードのコマンドは、モードフックを介する場合を除き、直接的・間接的を問わず、いかなる状況においても font-lock-add-keywords
を呼び出してはなりません。(これを行うと、一部のマイナーモードで誤った動作が発生します。)代わりに、font-lock-keywords
を設定することで、検索ベースのフォント化に関するルールを定義する必要があります。
この関数は、現在のバッファまたはメジャーモード mode に対して、font-lock-keywords から keywords
を削除します。font-lock-add-keywords と同様に、mode にはメジャーモードのコマンド名または nil
を指定する必要があります。font-lock-add-keywords
に関するすべての注意事項および要件は、ここでも適用されます。引数 keywords は、対応する
font-lock-add-keywords
で使用されているものと完全に一致している必要があります。
例えば、以下のコードはCモード向けに2つのフォント化パターンを追加しています。一つはコメント内であっても単語 ‘FIXME’ をフォント化するもの、もう一つは単語 ‘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)))))
このオプションは、特定の Font Lock キーワードに基づいてフォント化を選択的に無効化するための条件を定義します。nil 以外の場合、その値は以下のような形式の要素のリストとなります:
(symbol condition ...)
ここで、symbol はシンボルであり、通常はメジャーモードまたはマイナーモードを表します。symbol のリスト要素に続く condition は、symbol がバインドされており、かつその値が non-nil
である場合に有効になります。モードのシンボルの場合、これは現在のメジャーモードがそのモードから派生しているか、あるいはバッファ内でそのマイナーモードが有効になっていることを意味します。condition が有効な場合、condition に一致する
font-lock-keywords 要素によって行われるあらゆるフォント化は無効になります。
各 condition は、以下のいずれかになります:
この条件は、シンボルを参照する Font Lock キーワードの任意の要素に一致します。通常はフォントフェイスですが、font-lock-keywords
リストの要素によって参照される任意のシンボルである場合もあります。このシンボルにはワイルドカードを含めることができます。* はシンボル名内の任意の文字列に、?
は単一の文字に、そして [char-set](ここで
char-set は1文字以上の文字列)はその集合内の単一の文字にそれぞれ一致します。
この条件は、matcher が当該文字列に一致する正規表現である Font Lock キーワードの任意の要素に一致します。言い換えれば、この条件は当該文字列をハイライトする Font Lock ルールに一致します。したがって、この文字列は、ハイライトを無効にしたい特定のプログラムキーワードである可能性があります。
(pred function)この条件は、要素を引数として呼び出した際に function が nil 以外を返す Font Lock キーワードのあらゆる要素に一致します。
(not condition)condition が一致しない場合に一致します。
(and condition …)各conditionがマッチすれば、これにマッチします。
(or condition …)condition のうち少なくとも1つがマッチすれば、これに一致します。
(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行ずつ、次のような処理を行います。
help-echo テキストプロパティを追加するキーワードは保持してください。
whitespace-mode(マイナーモード)が有効な場合、バッファ先頭の空行もハイライトしないでください。