;; -*-lisp-*-
;;paste.lisp --- my Common Lisp package to enhance pasting in Stumpwm
;;Copyright (C) 2006 by gwern
;;Author: gwern <gwern0@gmail.com>
;;License: public domain
;;Where: http://stumpwm.elektrubadur.se/cgi-bin/wiki/paste.lisp
;;When: Time-stamp: "2007-01-09 18:08:23 gwern"
;;Keywords: local,customization,stumpwm
;;Commentary: Allows Emacs-style registers for copying and pasting
;;Installation: you can either load this file through your .stumpwmrc by adding
;;"(load "/home/who-ever/paste.lisp")" (load requires the full path), or you can
;;just copy and paste this in. Omitting the package statements might or might not help.
;;Declare what we work with and where we are.
(defpackage :swm-paste
(:use :cl :stumpwm))
(in-package :swm-paste)
;;Keybindings
;;;Two choices. First choice, is bound to a bunch of number keys. The name is already set for you.
(defvar *paste-map* nil
"The default bindings that hang off the paste key.")
(when (null *paste-map*)
(setf *paste-map*
(let ((m (make-sparse-keymap)))
(define-key m (kbd "1") "set-paste 1")
(define-key m (kbd "2") "set-paste 2")
(define-key m (kbd "3") "set-paste 3")
(define-key m (kbd "4") "set-paste 4")
(define-key m (kbd "5") "set-paste 5")
(define-key m (kbd "6") "set-paste 6")
(define-key m (kbd "7") "set-paste 7")
(define-key m (kbd "8") "set-paste 8")
(define-key m (kbd "9") "set-paste 9")
(define-key m (kbd "M-1") "get-paste 1")
(define-key m (kbd "M-2") "get-paste 2")
(define-key m (kbd "M-3") "get-paste 3")
(define-key m (kbd "M-4") "get-paste 4")
(define-key m (kbd "M-5") "get-paste 5")
(define-key m (kbd "M-6") "get-paste 6")
(define-key m (kbd "M-7") "get-paste 7")
(define-key m (kbd "M-8") "get-paste 8")
(define-key m (kbd "M-9") "get-paste 9")
m)))
(define-key *root-map* (kbd "P") '*paste-map*)
;;;The second choice is to simply use two keys, and specify the name of the register
;;;manually as we please.
(define-key *root-map* (kbd "i") "set-paste")
(define-key *root-map* (kbd "I") "get-paste")
;;Create the hash table, define the creating, deleting ,setting, and getting functions.
(defparameter *paste-hash* (make-hash-table :test 'equal))
;;If you try to set a register when there is no selection, it crashes Stumpwm.
;;Rather than add error-checking, simply guarantee there will always be *something*
(set-x-selection " ")
(define-stumpwm-command "create-paste" ((paste-number-arg :string "Empty register to create: "))
(check-type paste-number-arg string)
(setf
(gethash paste-number-arg *paste-hash*)
nil)
)
(define-stumpwm-command "delete-paste" ((paste-number-arg :string "Register name to delete: "))
(if
(remhash paste-number-arg *paste-hash*) ;delete it
(echo-string (current-screen) "Deleted.") ;If deletion was successful, it returns true
(echo-string (current-screen) ;If failed, did not exist
(concatenate 'string "Register '" paste-number-arg "' " "not deleted. Does not exist?"))
)
)
(define-stumpwm-command "set-paste" ((paste-number-arg :string "Register name to store in: "))
(setf
(gethash paste-number-arg *paste-hash*)
(get-x-selection))
)
(define-stumpwm-command "get-paste" ((paste-number-arg :string "Register name to paste from: "))
(window-send-string
(screen-current-window (current-screen))
(check-type (gethash paste-number-arg *paste-hash*) string))
)