SLIME に画像を表示再び
Emacs SLIME(http://common-lisp.net/project/slime/) には、 slime-media という拡張機能があり、REPL バッファ内に画像を表示できます。SLIME をリモートサーバ上の Lisp プロセスに接続して使用しているばあい、少し処理が必要だったので記録しておきます。
前提
- 外部のサーバ上で SWANK-SERVER を実行する。(swank-loader:init, swank:create-server)
- Emacs はクライアントのPC上で実行する。ssh トンネルを張り、 slime-connect で接続する。
- Common Lisp のソースコードは、サーバ上に保存し、Emacs からは TRAMP モードで透過的に編集する。
モチベーション
SLIME 上で画像を対話的に作成し、簡単に確認したい。
実装
- swank には、elisp 側に命令を実行させる eval-in-emacs という関数があるのでこれを用いる。slime-enable-evaluate-in-emacs を t にして許可しておく。
- slime-media パッケージに slime-media-insert-image という関数がある。ローカルのファイルをREPLに挿入する場合は単にこの関数に find-image の結果を渡せばよい。
- リモートのサーバ上のファイルの場合、以下のようにした。
- ローカルPC上に一時ファイルを作成。
- サーバ上のファイル file を一時ファイルに書き込む。ここで、file にはリモートサーバ上のファイルを指定するが、TRAMP の prefix を付けることに注意。
- slime-media-insert-image を実行。
(defun insert-to-repl (file) (swank::eval-in-emacs `(let ((tmp (make-temp-file "myimg"))) (with-temp-buffer (insert-file-contents ,file) (write-region (point-min) (point-max) tmp)) (slime-media-insert-image (find-image (list (list :file tmp :type 'png))) "image"))))
お願い
SLIME の REPL に画像が表示できるのはとても素敵なことです。が、ほとんど情報が見つけられません。もっと簡単なやり方をご存知の方がいましたらぜひ教えて下さい。