Emacsでテキストファイルに色付けする

xyzzy でテキストファイルに色付けする方法については、かつて記事にした。では、Emacs (NTEmacs) でやるにはどうすればよいのだろうか。何か方法がある筈だが、情報が少ないので放置しておいた。

この度、あらためて調べてみると、そもそも hi-lock-mode (hi-lock.el) というのがデフォルトで付属していた。このモードについては、例によってMeadow/Emacs memo を参照されたい。基本的な使い方について述べると――。


  • 起動方法
    • Emacs の起動時からオン:.emacs に "(global-hi-lock-mode 1)" と書く
    • Emacs の起動後にオン: M-x hi-lock-mode
  • ハイライトパターンの指定
    • 行:M-x highlight-lines-matching-regexp (= C-x w l)
    • 単語:M-x hi-lock-face-phrase-buffer, highlight-regexp (= C-x w h), highlight-phrase (= C-x w p)*1
  • ハイライトパターンの解除:M-x unhighlight-regexp (= C-x w r)
  • ハイライトパターンの書き出し:M-x hi-lock-write-interactive-patterns (= C-x w b)

その他の設定に関しては、hi-lock.el を参照のこと。



さて、本題はここから。このハイライトモードだが、どうも使いづらい。

まずデフォルトのフェイスが原色系でセンスがない。これは .emacs に好みの色でフェイスを登録すればよい。例えば以下のようにする。


(defface hi-grey ;; フェイス名を任意で登録
 '((((background dark))
  (:background "black" :foreground "grey")) ;; 色等を指定
  (t (:background "black")))
  "Face for hi-lock mode."
 :group 'hi-lock-faces)


次に問題なのは、設定したパターンを再利用する場合。

マニュアルにある基本的なやり方は、以下のようなものである。まず M-x hi-lock-write-interactive-patterns でハイライトパターンを書き出し、使っているテキストファイルに記しておく。そして、再度そのファイルを開き、M-x hi-lock-find-patterns (= C-x w i) をする。

また、.emacs に、


(setq hi-lock-file-patterns-policy 'ask)

と記すと、上記の M-x hi-lock-find-patterns の手間を省き、ハイライトパターンを自動的に検索し、それを読み込むかどうかきいてくる。

さらに、


(setq hi-lock-file-patterns-policy (lambda (pattern) t))

とすると、テキストファイルを開く度にハイライトパターンを検索し、自動的に読み込んでくれる*2

しかし、いずれにしてもテキストファイルの一つずつに、いちいちハイライトパターンを記入することになる。これは面倒くさい。.emacs で一括指定して、ファイルを開く毎にそれを適用させるにはどうすればよいか。

ハイライトパターンの指定は、hi-lock-set-pattern という命令を使うので、テキストファイルのフックで定義すればよい。具体的には以下のようにする。


(add-hook 'text-mode-hook
 '(lambda ()
  (hi-lock-set-pattern "([^)]*)" 'hi-yellow) ;; "パターン" 'フェイス
  ))


これで Emacs でも、テキストファイルの色付けが満足にできるようになった。よかったよかった。

*1:これらの違いはよくわかりません。

*2:マニュアルにあるような (setq hi-lock-file-patterns-policy t) では上手くゆかない。注意。