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) ))
2. カスタマイズ
2.1 Faceとは
Faceとはfont-lockモードでテキストを装飾する際に参照される属性情報で色、フォントなどの情報を持つ。Faceは複数ありテキストの種類(コメント、変数名,etc..)に応じて該当するFaceでテキストが装飾される。Faceをカスタマイズすることで色の表示を変えることができる。定義済み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内のテキストに設定を反映させている。なぜかこれがないと、ファイルを開いた直後に文字色が反映されていない。