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 に画像が表示できるのはとても素敵なことです。が、ほとんど情報が見つけられません。もっと簡単なやり方をご存知の方がいましたらぜひ教えて下さい。