- SLIMEのREPLバッファはlisp-modeと独立した専用モードで動くため、デフォルトではLisp構文のシンタックスカラーリングが適用されない。
- init.elにfont-lock-defaultsを設定する関数を定義し、slime-repl-mode-hookに登録することで対応できる。
- lisp-font-lock-keywords-2を使うことで、lisp-modeと同等の色分けルールをREPLに適用できる。
- この設定後はREPL上でもシンボル・文字列・コメントが色分けされ、既存のエラー表示なども維持される。
1. SLIMEでも色分けしたい
Common Lisp のコードを Emacs で試すとき、SLIMEを使っています。
しかし、通常の .lisp ファイルでは lisp-mode が有効になり、Font Lockによってシンタックスカラーリングが行われますのに、*slime-repl* バッファでは、色分けされていませんでした。
これは、SLIME の REPL は slime-repl-mode という専用モードで動いており、通常の lisp-mode の font-lock 規則をそのまま適用していないからです。
そのため、REPLでは出力・エラーなどの区別は色分けされますが、Lisp の構文(シンボル、文字列、コメントなど)の細かい色分けは行われない場合があります。
2. font-lock規則を設定する
そこで、Emacs の設定ファイル(init.el など)に次の設定を追加して、REPL に対して Lisp 用の font-lock 規則を明示的に設定しました。
(defvar slime-repl-font-lock-keywords lisp-font-lock-keywords-2)
(defun slime-repl-font-lock-setup ()
(setq font-lock-defaults
'(slime-repl-font-lock-keywords
nil nil (("+-*/.<>=!?$%_&~^:@" . "w")) nil
(font-lock-syntactic-face-function
. lisp-font-lock-syntactic-face-function))))
(add-hook 'slime-repl-mode-hook #'slime-repl-font-lock-setup)Code language: PHP (php)
ここで使われている主な要素は次の通りです。
font-lock
Emacs の構文色分けシステム。
メジャーモードはfont-lock-keywordsを定義することで、構文に応じた色付けを行う。lisp-font-lock-keywords-2
Emacs が Lisp 系言語のために定義している標準の色分けルール。
関数名、変数、文字列、コメントなどを適切に分類する。slime-repl-mode-hookslime-repl-modeが有効になったときに実行されるフック。
ここに設定を追加すると、REPL が開かれた時に自動で色分け設定が適用される。
Emacs を再起動すると、*slime-repl* バッファでも .lisp ファイルとほぼ同じようにシンタックスカラーリングされるようになりました。