]> git.eshelyaron.com Git - emacs.git/commitdiff
Allow save-interprogram-paste-before-kill to be a number
authorLars Ingebrigtsen <larsi@gnus.org>
Sun, 13 Jun 2021 12:03:49 +0000 (14:03 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sun, 13 Jun 2021 12:04:45 +0000 (14:04 +0200)
* doc/emacs/killing.texi (Clipboard): Document it.
* lisp/simple.el (save-interprogram-paste-before-kill): Extend
range (bug#41168).
(kill-new): Implement it (bug#41168).

doc/emacs/killing.texi
etc/NEWS
lisp/simple.el

index 56763b2967a3d2d6b7c08a80ec781b37cdfc3e49..4291afec56ff57383cc3f68d9b7b891fbafa4537 100644 (file)
@@ -522,11 +522,14 @@ clipboard.
 
 @vindex save-interprogram-paste-before-kill
   When an Emacs kill command puts text in the clipboard, the existing
-clipboard contents are normally lost.  Optionally, you can change
-@code{save-interprogram-paste-before-kill} to @code{t}.  Then Emacs
-will first save the clipboard to its kill ring, preventing you from
-losing the old clipboard data---at the risk of high memory consumption
-if that data turns out to be large.
+clipboard contents are normally lost.  Optionally, Emacs can save the
+existing clipboard contents to the kill ring, preventing you from
+losing the old clipboard data.  If
+@code{save-interprogram-paste-before-kill} changed to a number, then
+this data is copied over if it's smaller (in characters) than this
+number.  If this variable is any other non-@code{nil} value, it's
+always copied over---at the risk of high memory consumption if that
+data turns out to be large.
 
   Yank commands, such as @kbd{C-y} (@code{yank}), also use the
 clipboard.  If another application ``owns'' the clipboard---i.e., if
index 1693342f0af9a0465b554bcaae2d4c49e0aa3dc1..d3ee5659ac45401aee15b94470c8aa4d2c5afb15 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2087,6 +2087,11 @@ Shift while typing 'C-a', i.e. 'C-S-a', will now highlight the text.
 
 ** Miscellaneous
 
++++
+*** 'save-interprogram-paste-before-kill' can now be a number.
+In that case, it's interpreted as a limit to how long the clipboard
+data can be before saving to the kill ring.
+
 ---
 *** New variable 'hl-line-overlay-priority'.
 This can be used to change the priority of the hl-line overlays.
index 90dd8f1c342a5fcd0cfc896c2da89a64e8c58ada..dfe2549afc81ba588bbb58aab55f7f92779debe1 100644 (file)
@@ -5041,8 +5041,14 @@ ring directly.")
 A non-nil value ensures that Emacs kill operations do not
 irrevocably overwrite existing clipboard text by saving it to the
 `kill-ring' prior to the kill.  Such text can subsequently be
-retrieved via \\[yank] \\[yank-pop]."
-  :type 'boolean
+retrieved via \\[yank] \\[yank-pop].
+
+This variable can be either a number (in which case the clipboard
+data is only saved if it's shorter (in characters) than that
+number.  Any other non-nil value will save the clipboard data
+unconditionally."
+  :type '(choice (const :tag "Always" t)
+                 number)
   :group 'killing
   :version "23.2")
 
@@ -5079,13 +5085,18 @@ argument should still be a \"useful\" string for such uses."
     (let ((interprogram-paste (and interprogram-paste-function
                                    (funcall interprogram-paste-function))))
       (when interprogram-paste
-        (dolist (s (if (listp interprogram-paste)
-                       ;; Use `reverse' to avoid modifying external data.
-                       (reverse interprogram-paste)
-                    (list interprogram-paste)))
-         (unless (and kill-do-not-save-duplicates
-                      (equal-including-properties s (car kill-ring)))
-           (push s kill-ring))))))
+        (setq interprogram-paste
+              (if (listp interprogram-paste)
+                  ;; Use `reverse' to avoid modifying external data.
+                  (reverse interprogram-paste)
+               (list interprogram-paste)))
+        (when (or (not (numberp save-interprogram-paste-before-kill))
+                  (< (seq-reduce #'+ (mapcar #'length interprogram-paste) 0)
+                     save-interprogram-paste-before-kill))
+          (dolist (s interprogram-paste)
+           (unless (and kill-do-not-save-duplicates
+                         (equal-including-properties s (car kill-ring)))
+             (push s kill-ring)))))))
   (unless (and kill-do-not-save-duplicates
               (equal-including-properties string (car kill-ring)))
     (if (and replace kill-ring)