SLIME の REPL バッファに画像を表示する

SLIME(The Superior Lisp Interaction Mode for Emacs) の REPL バッファに画像を表示できることがわかった。この機能はなかなか応用が利きそうだ。

SLIME の準備

以下必要な準備。

  1. SLIME を環境を最新にする
  2. conrib/slime-media.el をロードする
  3. eval-in-emacs を有効にする

SLIME の拡張機能(Contrib Package)を用いるため、新し目の SLIME をインストールする必要がある。わたしの環境では、 /opt/local/share/emacs/site-lisp/slime ディレクトリに SLIME 関連のファイルが保存されている。この直下の contrib ディレクトリ以下に、slime-media.el ファイルがあればよい。
slime-media.el は "Display things other than text in SLIME buffers" とあるとおり、画像などを REPL バッファに表示できるものだ。2010-09-16 に追加されている。

slime-media.el を使うため、.emacs にも追加の設定を行う。わたしの場合は以下を .emacs に追加した。

(slime-setup '(slime-fancy slime-media slime-scratch))

加えて、 Common Lisp から任意のフォームを Emacs 側で処理させるために、 slime-enable-evaluate-in-emacs 変数を non-nil に設定しておく。

Common Lisp

swank::eval-in-emacs を使って、emacs に slime-media-insert-image を実行させるコードを書く。SLIME-DEVEL ML から拾ったそのままだ。

(defun insert-to-repl (file)
  (swank::eval-in-emacs `(slime-media-insert-image
                          (find-image '((:file ,file :type png))) "image")))

これで、準備は完了。あとは、好きな画像を指定する。

わたしの場合は、

ことができた。

print-object メソッドを上書きしてやれば、特定の CLOS オブジェクトを REPL に表示する場合には画像で、ということもできそうだ。


TODO:
insert-to-repl で画像を挿入し、その後画像を更新してまた insert-ro-repl を用いたら、更新前の画像が挿入されてしまった。何らかのキャッシュが働いているのか、ファイル名で何かを処理しているようだ。毎回一時ファイルを作成するという手抜きで対応した。

Link