だいぶ前に m2ymさんに教えていただいたんですが, 最近になっていざ
使おうとしたときすっかり忘れていて, また調べまわるハメになったので
メモとして残しておきます.
問題
ert等を使ってテストをするとき, '-batch'オプションを使ってコマンドライン
から実行するわけですが, その場合 highlightされません(--scriptオプションも同じ).
なんでそれだとファイル開いて, モードを設定して, 目的の場所に移動して,
face-at-pointを実行しても, nilしか返らず, faceが正しく設定されて
いるかを確認することができません.
解決方法
font-lock-fontify-bufferを実行することで highlightされた
ことになり, face-at-pointで現在の point位置の faceが取得
できるようになります.
ここで重要なのは文字を書いてから font-lock-fontify-bufferを
する必要があるということです. font-lock-fontify-bufferを
実行したら以後挿入する文字が色付けされるというわけではなく,
挿入済みのものが色付けされます.
一番初めに font-lock-fontify-bufferを実行して, あとで
insertして, なんで変わんないんだ〜っていうのでハマりましたので,
使う人は注意してください.
テスト例
ユーティリティ
;; codeを temporary bufferに挿入し, coffee-modeを有効にする (defmacro with-coffee-temp-buffer (code &rest body) "Insert `code' and enable `coffee-mode'. cursor is beginning of buffer" (declare (indent 0) (debug t)) `(with-temp-buffer (insert ,code) (goto-char (point-min)) (coffee-mode) (font-lock-fontify-buffer) ,@body)) ;; patternの位置までカーソルを進める (defun forward-cursor-on (pattern) (re-search-forward pattern) (goto-char (match-beginning 0))) ;; 現在カーソル下の faceと引数の faceが一致していれば true (defun face-at-cursor-p (face) (eq (face-at-point) face))
テスト
(ert-deftest lambda-expression-fat-arrow () "Highlight lambda expression with fat arrow" (with-coffee-temp-buffer "foo => \"bar\"" (forward-cursor-on "=>") (should (face-at-cursor-p 'font-lock-function-name-face))))