]> git.eshelyaron.com Git - emacs.git/commitdiff
Optionally, undo several consequential deletion in one step.
authorSam Steingold <sds@gnu.org>
Mon, 23 Jun 2014 20:23:33 +0000 (16:23 -0400)
committerSam Steingold <sds@gnu.org>
Mon, 23 Jun 2014 20:23:33 +0000 (16:23 -0400)
* lisp/simple.el (kill-append): Remove undo boundary depending on ...
(kill-append-merge-undo): New user option.

lisp/ChangeLog
lisp/simple.el

index 8c2fb12da4eac70088f65dfa188fcd42309fe533..3f7896fd1c584ea995f7e82a30dfc50b431b4012 100644 (file)
@@ -1,3 +1,8 @@
+2014-06-23  Sam Steingold  <sds@gnu.org>
+
+       * simple.el (kill-append): Remove undo boundary depending on ...
+       (kill-append-merge-undo): New user option.
+
 2014-06-23  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * simple.el (handle-shift-selection, exchange-point-and-mark)
index 9983943298f8392bda03f0ebde12b79e85bc57e0..a8689aaf2e3b1f8378ee9d1dbd387a884765c96e 100644 (file)
@@ -3742,14 +3742,34 @@ argument should still be a \"useful\" string for such uses."
   (if interprogram-cut-function
       (funcall interprogram-cut-function string)))
 
+;; It has been argued that this should work similar to `self-insert-command'
+;; which merges insertions in undo-list in groups of 20 (hard-coded in cmds.c).
+(defcustom kill-append-merge-undo nil
+  "Whether appending to kill ring also makes \\[undo] restore both pieces of text simultaneously."
+  :type 'boolean
+  :group 'killing
+  :version "24.5")
+
 (defun kill-append (string before-p)
   "Append STRING to the end of the latest kill in the kill ring.
 If BEFORE-P is non-nil, prepend STRING to the kill.
+Also removes the last undo boundary in the current buffer,
+ depending on `kill-append-merge-undo'.
 If `interprogram-cut-function' is set, pass the resulting kill to it."
   (let* ((cur (car kill-ring)))
     (kill-new (if before-p (concat string cur) (concat cur string))
              (or (= (length cur) 0)
-                 (equal nil (get-text-property 0 'yank-handler cur))))))
+                 (equal nil (get-text-property 0 'yank-handler cur))))
+    (when (and kill-append-merge-undo (not buffer-read-only))
+      (let ((prev buffer-undo-list)
+            (next (cdr buffer-undo-list)))
+        ;; find the next undo boundary
+        (while (car next)
+          (pop next)
+          (pop prev))
+        ;; remove this undo boundary
+        (when prev
+          (setcdr prev (cdr next)))))))
 
 (defcustom yank-pop-change-selection nil
   "Whether rotating the kill ring changes the window system selection.