【Emacs】
SLIMEのREPLでシンタックスカラー
リングする

  • 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* バッファでは、色分けされていませんでした。

なぜREPLだけ色分けされないのか .lisp ファイル lisp-mode が有効 Font Lock 適用 ✓ 独立 *slime-repl* slime-repl-mode font-lock 未設定 ✗ slime-repl-mode は lisp-mode と独立しており、Lisp構文のfont-lock規則が適用されない

これは、SLIME の REPL は slime-repl-mode という専用モードで動いており、通常の lisp-modefont-lock 規則をそのまま適用していないからです。
そのため、REPLでは出力・エラーなどの区別は色分けされますが、Lisp の構文(シンボル、文字列、コメントなど)の細かい色分けは行われない場合があります。

2. font-lock規則を設定する

そこで、Emacs の設定ファイル(init.el など)に次の設定を追加して、REPL に対して Lisp 用の font-lock 規則を明示的に設定しました。

init.el に設定を追加する 1 キーワード変数を定義 (defvar slime-repl-font-lock-keywords lisp-font-lock-keywords-2) 2 font-lock-defaults を設定する関数 (defun slime-repl-font-lock-setup () (setq font-lock-defaults ‘(slime-repl-font-lock-keywords nil nil ((“+-*/…@” . “w”)) nil (…)))) 3 フックに登録 (add-hook ‘slime-repl-mode-hook #’slime-repl-font-lock-setup)
(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-hook
    slime-repl-mode が有効になったときに実行されるフック。
    ここに設定を追加すると、REPL が開かれた時に自動で色分け設定が適用される。

Emacs を再起動すると、*slime-repl* バッファでも .lisp ファイルとほぼ同じようにシンタックスカラーリングされるようになりました。