"Patrick Collison" patrick@collison.ie writes:
I wanted to be able to display images in my SLIME repl, so that I could do stuff like http://collison.ie/img/google-charts.png. I played around with swank.lisp and slime.el for an hour, and hacked together something that mostly works. The code is ugly as sin, but I'm posting it here in case anyone wants to similarly subvert their SLIME installation. If there's any interest in having this be a part of the SLIME distribution, I'm happy to look at cleaning it up...
I, too, hacked something like that not long ago:
http://common-lisp.net/pipermail/slime-devel/2008-April/007264.html
A few days later I mutilated it to be a slime contrib (but still requiring the SLIME-REPL-EMIT change), which follows (don't ask about the license :). Because it receives a filename to display, it is more low-level than your interface. It's easy then to write a simple CL function to fetch and display and image (say, using Drakma).
(It's a git diff, I use the git://github.com/nablaone/slime mirror.)
Ariel
--- commit eaeac5d2067f561ec478d3946b6fcdea8018bebc Author: Ariel Badichi abadichi@bezeqint.net Date: Fri Apr 18 04:17:22 2008 +0300
Added slime-image contrib.
diff --git a/contrib/slime-image.el b/contrib/slime-image.el new file mode 100644 index 0000000..83f1f46 --- /dev/null +++ b/contrib/slime-image.el @@ -0,0 +1,17 @@ +;;; slime-image.el --- Insert images into the REPL +;; +;; Author: Ariel Badichi abadichi@bezeqint.net +;; +;; License: fuck-knows +;; +;;; Installation +;; +;; Add slime-image to your slime-setup call. + +(defun slime-image-init () + (add-hook 'slime-connected-hook 'slime-image-install)) + +(defun slime-image-install () + (slime-eval-async '(swank:swank-require :swank-image))) + +(provide 'slime-image) diff --git a/contrib/swank-image.lisp b/contrib/swank-image.lisp new file mode 100644 index 0000000..6b58c32 --- /dev/null +++ b/contrib/swank-image.lisp @@ -0,0 +1,18 @@ +(in-package #:swank) + +(defslimefun insert-image-into-repl (filename &optional (error t)) + "Insert the image in the file denoted by FILENAME into the REPL +buffer and return true. If the file does not exist, then either error +if ERROR is true, or return false otherwise." + (let ((probe (probe-file filename))) + (cond (probe + (eval-in-emacs + `(progn + (slime-repl-emit + (lambda () + (insert-image (create-image ,(namestring probe))) + (insert #\Newline))) + :ok)) + t) + (error (error "A file named ~S does not exist." filename)) + (t nil)))) diff --git a/slime.el b/slime.el index ceba26a..de1cd3c 100644 --- a/slime.el +++ b/slime.el @@ -2555,13 +2555,17 @@ hashtable `slime-output-target-to-marker'; output is inserted at this marker." (:repl-result (slime-repl-emit-result string)) (t (slime-emit-string string target))))
-(defun slime-repl-emit (string) - ;; insert the string STRING in the output buffer +(defun slime-repl-emit (thing) + "Insert THING into the output buffer if it is a string or, if +it is a function, call it in the right context for insertion." (with-current-buffer (slime-output-buffer) (slime-with-output-end-mark - (slime-insert-propertized '(face slime-repl-output-face - rear-nonsticky (face)) - string) + (etypecase thing + (string + (slime-insert-propertized '(face slime-repl-output-face + rear-nonsticky (face)) + thing)) + (function (funcall thing))) (set-marker slime-output-end (point)) (when (and (= (point) slime-repl-prompt-start-mark) (not (bolp))) diff --git a/swank-loader.lisp b/swank-loader.lisp index 490d149..0431442 100644 --- a/swank-loader.lisp +++ b/swank-loader.lisp @@ -185,6 +185,7 @@ If LOAD is true, load the fasl file." swank-fancy-inspector swank-presentations swank-presentation-streams #+(or asdf sbcl) swank-asdf + swank-image ) "List of names for contrib modules.")