From 4ed8c7aadb59c8ae75641710e3d9ff5bddbbd952 Mon Sep 17 00:00:00 2001 From: Sam Steingold Date: Wed, 26 Aug 2009 20:55:39 +0000 Subject: [PATCH] (save-interprogram-paste-before-kill): New user option. (kill-new): When `save-interprogram-paste-before-kill' is non-nil, save the interprogram-paste into kill-ring before overriding it with the Emacs kill. --- lisp/ChangeLog | 7 +++++++ lisp/simple.el | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index f3ab3384170..d35097f74a1 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2009-08-26 Sam Steingold + + * simple.el (save-interprogram-paste-before-kill): New user option. + (kill-new): When `save-interprogram-paste-before-kill' is non-nil, + save the interprogram-paste into kill-ring before overriding it + with the Emacs kill. + 2009-08-26 Dan Nicolaescu * vc.el (vc-trunk-p): Rename to vc-rcs-trunk-p and move to vc-rcs.el. diff --git a/lisp/simple.el b/lisp/simple.el index 7349f4d0617..88cc61a835b 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -2794,6 +2794,17 @@ ring directly.") (defvar kill-ring-yank-pointer nil "The tail of the kill ring whose car is the last thing yanked.") +(defcustom save-interprogram-paste-before-kill nil + "Save the paste strings into `kill-ring' before replacing it with emacs strings. +When one selects something in another program to paste it into Emacs, +but kills something in Emacs before actually pasting it, +this selection is gone unless this variable is non-nil, +in which case the other program's selection is saved in the `kill-ring' +before the Emacs kill and one can still paste it using \\[yank] \\[yank-pop]." + :type 'boolean + :group 'killing + :version "23.2") + (defun kill-new (string &optional replace yank-handler) "Make STRING the latest kill in the kill ring. Set `kill-ring-yank-pointer' to point to it. @@ -2806,6 +2817,10 @@ inserted into a buffer; see `insert-for-yank' for details. When a yank handler is specified, STRING must be non-empty (the yank handler, if non-nil, is stored as a `yank-handler' text property on STRING). +When `save-interprogram-paste-before-kill' and `interprogram-paste-function' +are non-nil, saves the interprogram paste string(s) into `kill-ring' before +STRING. + When the yank handler has a non-nil PARAM element, the original STRING argument is not used by `insert-for-yank'. However, since Lisp code may access and use elements from the kill ring directly, the STRING @@ -2819,6 +2834,14 @@ argument should still be a \"useful\" string for such uses." (list string "yank-handler specified for empty string")))) (if (fboundp 'menu-bar-update-yank-menu) (menu-bar-update-yank-menu string (and replace (car kill-ring)))) + (when save-interprogram-paste-before-kill + (let ((interprogram-paste (and interprogram-paste-function + (funcall interprogram-paste-function)))) + (when interprogram-paste + (if (listp interprogram-paste) + (dolist (s (nreverse interprogram-paste)) + (push s kill-ring)) + (push interprogram-paste kill-ring))))) (if (and replace kill-ring) (setcar kill-ring string) (push string kill-ring) -- 2.11.4.GIT