xyzzyでマウスを使ってコピー&ペースト

Meadowの重さに最近辟易し始め、xyzzyに移行しようと画策中。
そこでxyzzyのマウスの挙動を、Meadowと同じにすることに。
その要求は、
1.左クリックで選択すると自動でコピー
2.右クリックでペースト
3.選択範囲を自動でselection regionに
この3つ。

またこのとき、xyzzykill-ringclipboardという2つのコピー用のバッファがあることを考えないといけない。このkill-ringはxyzzyローカルのバッファで、他のアプリケーションとは共有されない。clipboardはWindowsクリップボード。つまり他のアプリケーションと共有される。そこで、その2つのバッファを同期するLispも拾ってきた。なぜなら、C-k,C-wなどで切り取ったものは、kill-ringに入るためだ。右クリックで貼り付けられるバッファ(clipboard)と、C-yで貼り付けるバッファ(kill-ring)が異なると、ペーストするときに混乱する。そして単一化するなら、Windowsクリップボードだとおもう。

以下そのマウスと同期を実現するxyzzyLisp

;;どっかからぱくってきた同期部分
;;synclonize clipboad and kill-ring
(defun copy-selection-region-to-clipboard ()
  (interactive)
  (setq is-selected nil)
  (if (and *shodat-copy-mode*
    (pre-selection-p))
    (let ((type (get-selection-type)))
      (selection-start-end (start end)
      (copy-region-as-kill start end)
      (copy-region-to-clipboard start end)
      (setq is-selected t)
      (start-selection type t end)))
  (selection-start-end (start end)
    (copy-region-as-kill start end)
    (copy-region-to-clipboard start end)
    (setq is-selected t)))
  (if (eq is-selected nil)
    (progn
      (copy-region-as-kill (mark) (point))
      (copy-region-to-clipboard (mark) (point))))
t)

(defun kill-selection-region-to-clipboard ()
  (interactive "*")
  (setq is-selected nil)
  (selection-start-end (start end)
    (copy-region-as-kill start end)
    (kill-region-to-clipboard start end)
    (setq is-selected t))
  (if (eq is-selected nil)
    (progn
      (copy-region-as-kill (mark) (point))
      (kill-region-to-clipboard (mark) (point))))
t)

(defun kill-line-to-clipboard ()
  "kill line to clipboard"
  (interactive)
  (setq kill-line-to-clipboard-start (point))
  (end-of-line)
  (if (eq kill-line-to-clipboard-start (point))
    (delete-char)
    (progn
      (copy-region-as-kill kill-line-to-clipboard-start (point))
      (kill-region-to-clipboard kill-line-to-clipboard-start (point)))))

(define-key *global-keymap* #\C-w 'kill-selection-region-to-clipboard )
(define-key *global-keymap* #\M-w 'copy-selection-region-to-clipboard )
(define-key *global-keymap* #\C-y 'paste-from-clipboard )
(define-key *global-keymap* #\C-k 'kill-line-to-clipboard )

;;マウスだけでコピー・ペースト
;右クリックでペースト
(defun mouse-right-up-process ()
  (interactive "*")
  (mouse-left-press)
  (paste-from-clipboard)		;paste from clipboad
)

;左クリックでコピー&Set Mark
(defun mouse-left-up-process ()
  (interactive)
  (selection-start-end (Start End)
    (progn
      (copy-region-to-clipboard Start End)
      (set-mark End);どっしぇーなんでEndなんだ
    )
  )
)


(global-set-key #\LBtnUp 'mouse-left-up-process)
(global-set-key #\RBtnUp 'mouse-right-up-process)
(global-set-key #\MBtnUp 'mouse-menu-popup)