|
;;; swank-clipboard.lisp --- Object clipboard
|
|
;;
|
|
;; Written by Helmut Eller in 2008.
|
|
;; License: Public Domain
|
|
|
|
(defpackage :swank-clipboard
|
|
(:use :cl)
|
|
(:import-from :swank :defslimefun :with-buffer-syntax :dcase)
|
|
(:export :add :delete-entry :entries :entry-to-ref :ref))
|
|
|
|
(in-package :swank-clipboard)
|
|
|
|
(defstruct clipboard entries (counter 0))
|
|
|
|
(defvar *clipboard* (make-clipboard))
|
|
|
|
(defslimefun add (datum)
|
|
(let ((value (dcase datum
|
|
((:string string package)
|
|
(with-buffer-syntax (package)
|
|
(eval (read-from-string string))))
|
|
((:inspector part)
|
|
(swank:inspector-nth-part part))
|
|
((:sldb frame var)
|
|
(swank/backend:frame-var-value frame var)))))
|
|
(clipboard-add value)
|
|
(format nil "Added: ~a"
|
|
(entry-to-string (1- (length (clipboard-entries *clipboard*)))))))
|
|
|
|
(defslimefun entries ()
|
|
(loop for (ref . value) in (clipboard-entries *clipboard*)
|
|
collect `(,ref . ,(to-line value))))
|
|
|
|
(defslimefun delete-entry (entry)
|
|
(let ((msg (format nil "Deleted: ~a" (entry-to-string entry))))
|
|
(clipboard-delete-entry entry)
|
|
msg))
|
|
|
|
(defslimefun entry-to-ref (entry)
|
|
(destructuring-bind (ref . value) (clipboard-entry entry)
|
|
(list ref (to-line value 5))))
|
|
|
|
(defun clipboard-add (value)
|
|
(setf (clipboard-entries *clipboard*)
|
|
(append (clipboard-entries *clipboard*)
|
|
(list (cons (incf (clipboard-counter *clipboard*))
|
|
value)))))
|
|
|
|
(defun clipboard-ref (ref)
|
|
(let ((tail (member ref (clipboard-entries *clipboard*) :key #'car)))
|
|
(cond (tail (cdr (car tail)))
|
|
(t (error "Invalid clipboard ref: ~s" ref)))))
|
|
|
|
(defun clipboard-entry (entry)
|
|
(elt (clipboard-entries *clipboard*) entry))
|
|
|
|
(defun clipboard-delete-entry (index)
|
|
(let* ((list (clipboard-entries *clipboard*))
|
|
(tail (nthcdr index list)))
|
|
(setf (clipboard-entries *clipboard*)
|
|
(append (ldiff list tail) (cdr tail)))))
|
|
|
|
(defun entry-to-string (entry)
|
|
(destructuring-bind (ref . value) (clipboard-entry entry)
|
|
(format nil "#@~d(~a)" ref (to-line value))))
|
|
|
|
(defun to-line (object &optional (width 75))
|
|
(with-output-to-string (*standard-output*)
|
|
(write object :right-margin width :lines 1)))
|
|
|
|
(provide :swank-clipboard)
|