Next: , Previous: , Up: Display   [Contents][Index]


14.12 Font Lockモード

Font Lockモードはマイナーモードで、常に特定のバッファーにローカルで、バッファーのテキストにフェイスを割り当てます(またはフォント表示化(fontifies)します)。各バッファーのメジャーモードは、Font Lockモードにどのテキストをフォント表示可するか指示します。たとえばプログラム言語のモードは、コメントや文字列、関数名のような、構文に関連する構成をフォント表示化します。

Font Lockモードはデフォルトで有効です。現在のバッファーでこれを切り替えるには、M-x font-lock-modeとタイプします。正の数引数は無条件にFont Lockモードを有効にし、負または0の数引数を指定すると無効になります。

M-x global-font-lock-modeとタイプすると、すべてのバッファーでFont Lockモードを切り替えます。このセッティングを将来のEmacsセッションに引き継ぐには、変数global-font-lock-modeをカスタマイズ(Easy Customizationを参照してください)するか、以下の行をinitファイルに追加します。

(global-font-lock-mode 0)

Global Font Lockモードを無効にしていたとしても、モードフック(mode hooks)に関数を追加することにより、特定のメジャーモードでFont Lockモードを有効にできます。たとえばCファイルの編集でFont Lockモードを有効にするには、以下のように記述します:

(add-hook 'c-mode-hook 'font-lock-mode)

Font Lockモードは、font-lock-string-facefont-lock-comment-faceのような、いくつかの特別な名前のフェイスを使って処理を行います。これらすべてを簡単に探す方法には、M-x customize-group RET font-lock-faces RETを使います。それからカスタマイズバッファーでそれらのフェイスの外見をカスタマイズできます。Face Customizationを参照してください。

変数font-lock-maximum-decorationをカスタマイズして、Font Lockモードで適用されるフォント表示化のレベルを変更できます。値には数字を指定します(1は最小限のフォント表示化で、3という高いレベルのモードもあります)。tは“可能な限り高く”という意味です(デフォルト)。特定のモードに異なる数字を指定することもできます。たとえばC/C++モードにはレベル1を指定して、他のモードにはデフォルトのレベルを適用するには、以下の値を使います:

'((c-mode . 1) (c++-mode . 1)))

コメントと文字列のフォント表示化(または“構文的”なフォント表示化)は、バッファーのテキストの構文構造の解析に依存します。速度向上のため、Lispモードを含めたいくつかのモードでは、特別な慣習に依存しています。たとえば一番左の列の開きカッコ(open-parenthesis)または開き大カッコ(open-brace)は常にdefunの開始であり、すなわち常に文字列またはコメントの外部にあるとみなす、というように解析します。したがって文字列やコメントの中で、一番左の列に開きカッコや開き大カッコを記述するのは避けるべきです。詳細については、Left Margin Parenを参照してください。

常にバッファーローカルな変数font-lock-beginning-of-syntax-functionは、Font Lockモードがコメント、もしくは文字列の外であることが保証される位置を探す方法を指定します。それが最左列がカッコであるという慣習をもつモードでは、変数のデフォルト値はbeginning-of-defunで、Font Lockモードがその慣習にしたがうよう指定します。この変数にnilをセットすると、Font Lockモードはもはや慣習には依存しなくなります。これでまちがった結果を避けられますが、その代償は時として、変更したテキストをフォント表示化するのに、バッファのテキストをバッファの先頭から再走査しなければならない場合もあります。これはスクロールに相当な速度低下を招きかねず、大きなバッファーの最後に近い位置では、それが特に顕著になります。

Font Lockは、ほとんどのモードで既存のパターンをハイライトしますが、追加のパターンをフォント表示化したいときもあるでしょう。特定のモードでハイライトするパターンを追加するには、関数font-lock-add-keywordsを使うことができます。たとえばCコメント中の‘FIXME:’という単語をハイライトするには、以下を使います:

(add-hook 'c-mode-hook
          (lambda ()
           (font-lock-add-keywords nil
            '(("\\<\\(FIXME\\):" 1
               font-lock-warning-face t)))))

font-lockのハイライトパターンからキーワードを削除するには、関数font-lock-remove-keywordsを使います。Search-based Fontification in The Emacs Lisp Reference Manualを参照してください。

大きなバッファーのフォント表示化には、長い時間を要することもあります。ファイルをvisitしたとき大きな遅延を避けるには、Emacsが最初はバッファーの表示された部分だけをフォント表示化するようにします。バッファーをスクロールすると、新たに表示される部分がフォント表示化されます。このタイプのFont Lockは、Just-In-Time(またはJIT) Lockと呼ばれます。カスタマイズグループ‘jit-lock’の値をカスタマイズすることにより、アイドル状態のときにフォント表示可を行うことも含めて、JIT Lockがどのように振る舞うか制御できます。Specific Customizationを参照してください。