SLIME の REPL バッファに画像を表示する
SLIME(The Superior Lisp Interaction Mode for Emacs) の REPL バッファに画像を表示できることがわかった。この機能はなかなか応用が利きそうだ。
SLIME の準備
以下必要な準備。
- SLIME を環境を最新にする
- conrib/slime-media.el をロードする
- 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")))
これで、準備は完了。あとは、好きな画像を指定する。
わたしの場合は、
- Common Lisp 上でグラフデータ(オートマトンだ)を作り
- Graphviz の dot コマンドに渡して png 画像を生成し
- REPL にそれを表示する
ことができた。
print-object メソッドを上書きしてやれば、特定の CLOS オブジェクトを REPL に表示する場合には画像で、ということもできそうだ。
TODO:
insert-to-repl で画像を挿入し、その後画像を更新してまた insert-ro-repl を用いたら、更新前の画像が挿入されてしまった。何らかのキャッシュが働いているのか、ファイル名で何かを処理しているようだ。毎回一時ファイルを作成するという手抜きで対応した。
Link
- http://common-lisp.net/project/slime/ SLIME
- http://common-lisp.net/project/slime/doc/html/Loading-Contribs.html#Loading-Contribs Contrib パッケージのロード方法
- [slime-devel] contrib for repl images http://common-lisp.net/pipermail/slime-devel/2010-October/017806.html
- http://read-eval-print.blogspot.com/2010/12/slime-repl.html Twitter の Common Lisp クライアント(!) まだ手元では時間不足で動かせていないが、Twitter アイコンを REPL に表示している
- オートマトンの状態数最小化アルゴリズム勉強中の REPL