無料Wikiサービス | デモページ
Linuxなどのメモ書き

Emacs font-lockモード


font-lockモードでバッファ内のテキスト表示をカラーにするメモ

1. 概要

1.1 色表示を有効にする

XEmacsで表示に色を付けるには、font-lock-mode変数を1にしてfont-lockモードを有効にする。font-lockモードではバッファ内のテキストを構文解析して、テキストの種類に応じた属性(Faceと呼ばれる)を付化して表示する。

以下はPerl編集モードで色を付けるようにする設定ファイルの例。色の設定はデフォルトの状態となる。

(add-hook 'cperl-mode-hook
          '(lambda ()
             (font-lock-mode 1)
))


図1 表示例

2. カスタマイズ

2.1 Faceとは

Faceとはfont-lockモードでテキストを装飾する際に参照される属性情報で色、フォントなどの情報を持つ。Faceは複数ありテキストの種類(コメント、変数名,etc..)に応じて該当するFaceでテキストが装飾される。Faceをカスタマイズすることで色の表示を変えることができる。定義済みFaceには以下のようなものがある(一部)。

・font-lock-comment-face
コメントに適用される。
・font-lock-string-face
文字列に適用される。
・font-lock-keyword-face
キーワード(言語のTokenであるif,forなど)に適用される。対象キーワードはfont-lock-keywords変数に格納されている。
・font-lock-function-name-face
関数名に適用される。
・font-lock-variable-name-face
変数名に適用される。

その他諸々...

これらの共通のFace以外にも編集モードによって追加されるFaceがある。例えばCPerlモードでは、配列用のcperl-array-faceやハッシュ用のcperl-hash-faceがある。また、Faceは自分で作成することもできる(make-face関数)。

2.2 色を変えてみる(Faceの設定変更)

Faceの属性を設定して色を変えてみる。

以下はコメントの表示を白地に青表示に変更する例。set-face-xxxがFaceの属性を設定する関数で、Face名と設定値を引数に渡す。set-face-foreground,set-face-backgroundでコメント用のFace(font-lock-comment-face)に文字色、背景色をそれぞれ設定している。

(add-hook 'cperl-mode-hook
          '(lambda ()
             (font-lock-mode 1)
             (set-face-foreground 'font-lock-comment-face "blue")
             (set-face-background 'font-lock-comment-face "white")
))

色の指定には"blue"などのシンボル以外にも"#RRGGBB"の形式でも指定できる(青なら#0000ff)。

2.3 その他の属性の変更

Faceには色属性以外にも属性があり、(set-face-underline-p 'font-lock-comment-face t)のようにして下線付きにしたりできる。使用できるコマンドは M-x help <Enter> f set-face- <TAB> で参照できる。

また、個別に属性を設定する以外にもcopy-faceを使って属性情報を他のFaceにコピーすることもできる。

(copy-face 'font-lock-variable-name-face 'cperl-hash-face)      

2.4 特定キーワードの色を変える

独自のキーワードを定義してキーワードの色を変えてみる。

以下はプレーンテキストファイル内のNortice,Warning文字列と<xxx>内の文字列を強調(赤色)表示する設定例。

(add-hook 'text-mode-hook
          '(lambda ()
             (font-lock-mode 1)
             ; キーワード用にFaceを作成 (1)
             (make-face 'emphasis-face)
             (set-face-foreground 'emphasis-face "red")
             ; キーワード定義 (2)
             (setq font-lock-keywords
                   '(("Nortice\\|Warnings" 0 emphasis-face)  
                     ("<\\(.*\\)>" 1  emphasis-face)  
                     ))

             (font-lock-fontify-buffer)
))

この例では、キーワード用に独自のFace(emphasis-face)を作成している(1)。faceの作成はmake-faceで行う。作成したFaceは定義済みのFaceと同様set-face-foregroundなどで属性を設定できる。

次に着色するキーワードを定義する(2)。キーワードはfont-lock-keywords変数にリスト形式で登録する。各キーワード定義のリストの第一要素はキーワードを正規表現で表したもの。第二要素はFaceを反映させる範囲を示す。正規表現の後方参照と同じで、0だとマッチした文字列全体にFaceを反映させる。1〜nだと正規表現の中のn番目の()にマッチした部分だけFaceが反映される。第3要素は適用するFaceを指定する。

最後に(font-lock-fontify-buffer)でBuffer内のテキストに設定を反映させている。なぜかこれがないと、ファイルを開いた直後に文字色が反映されていない。

最終更新 2006/08/26 15:53:27 - kztomita
(2006/08/25 15:48:46 作成)
添付ファイル
color.png - kztomita