(eval-and-compile (require 'slime)) (define-slime-contrib slime-buffer-streams "Lisp streams that output to an emacs buffer" (:authors "Ed Langley ") (:license "GPL") (:swank-dependencies swank-buffer-streams)) (defslimefun slime-make-buffer-stream-target (thread name) (message "making target %s" name) (slime-buffer-streams--get-target-marker name) `(:stream-target-created ,thread ,name)) (defun slime-buffer-streams--get-target-name (target) (format "*slime-target %s*" target)) (defvar-local slime-buffer-stream-target nil) ;; TODO: tell backend that the buffer has been closed, so it can close ;; the stream (defun slime-buffer-streams--cleanup-markers () (when slime-buffer-stream-target (message "Removing target: %s" slime-buffer-stream-target) (remhash slime-buffer-stream-target slime-output-target-to-marker))) (defun slime-buffer-streams--get-target-marker (target) (or (gethash target slime-output-target-to-marker) (with-current-buffer (generate-new-buffer (slime-buffer-streams--get-target-name target)) (setq slime-buffer-stream-target target) (add-hook 'kill-buffer-hook 'slime-buffer-streams--cleanup-markers) (setf (gethash target slime-output-target-to-marker) (point-marker))))) (provide 'slime-buffer-streams)