git.fiddlerwoaroof.com
Raw Blame History
;;;; uclip.lisp

(in-package #:uclip)



(defvar *current-clipboard*)
(defun init ()
  (restore 'uclip) 
  (setf *current-clipboard* (defaulted-value "main" 'current-clipboard)))

(defun copy (argv)
  (init)
  (push (cond ((null (cdr argv))
               (apply #'concatenate
                      (list* 'string
                             (loop for a := (read-line *standard-input* nil)
                                   while (not (null a))
                                   collect (format nil "~a~%" a)))))
              (t (format nil "~{~a~^ ~}" (cdr argv))))
        (value 'clipboard *current-clipboard*)))

(defun paste (argv)
  (init) 
  (let ((*current-clipboard*
          (if (cdr argv) (cadr argv) *current-clipboard*)))
    (awhen (car (value 'clipboard *current-clipboard*))
      (format t "~a" it))))

(defun tee (argv)
  (copy argv)
  (paste nil))

(defun switch-clipboards (argv)
  (init) 
  (setf *current-clipboard*
        (setf (value 'current-clipboard) (cadr argv))))

(defun pop-clipboard (argv)
  (declare (ignore argv))
  (init) 
  (when (value 'clipboard *current-clipboard*)
    (format t "~a" (pop (value 'clipboard *current-clipboard*)))))

(defun show-clipboard-contents (argv)
  (init)
  (let*  ((*current-clipboard* (aif (cdr argv) (car it) *current-clipboard*))
          (current-clipboard (value 'clipboard *current-clipboard*))
          (cc-length (length current-clipboard))
          (show-length (min cc-length
                            (or (awhen (cddr argv) (parse-integer (car it) :junk-allowed t))
                                5)))
          (current-clipboard (subseq current-clipboard 0 show-length)))
    (when (> cc-length 0)
      (format t "~&~{~a~&~^---~%~}" current-clipboard))))

(defun list-clipboards (argv)
  (init)
  (format t "~&~{~a~%~}" (hash-table-keys (value 'clipboard))))

(defun clear-clipboard (argv)
  (declare (ignore argv))
  (init)
  (setf (value 'clipboard *current-clipboard*) nil))