emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] trunk r117384: Optionally, undo several consequential dele


From: Sam Steingold
Subject: [Emacs-diffs] trunk r117384: Optionally, undo several consequential deletion in one step.
Date: Mon, 23 Jun 2014 20:23:36 +0000
User-agent: Bazaar (2.6b2)

------------------------------------------------------------
revno: 117384
revision-id: address@hidden
parent: address@hidden
committer: Sam Steingold <address@hidden>
branch nick: trunk
timestamp: Mon 2014-06-23 16:23:33 -0400
message:
  Optionally, undo several consequential deletion in one step.
  
  * lisp/simple.el (kill-append): Remove undo boundary depending on ...
  (kill-append-merge-undo): New user option.
modified:
  lisp/ChangeLog                 changelog-20091113204419-o5vbwnq5f7feedwu-1432
  lisp/simple.el                 simple.el-20091113204419-o5vbwnq5f7feedwu-403
=== modified file 'lisp/ChangeLog'
--- a/lisp/ChangeLog    2014-06-23 15:32:24 +0000
+++ b/lisp/ChangeLog    2014-06-23 20:23:33 +0000
@@ -1,3 +1,8 @@
+2014-06-23  Sam Steingold  <address@hidden>
+
+       * simple.el (kill-append): Remove undo boundary depending on ...
+       (kill-append-merge-undo): New user option.
+
 2014-06-23  Stefan Monnier  <address@hidden>
 
        * simple.el (handle-shift-selection, exchange-point-and-mark)

=== modified file 'lisp/simple.el'
--- a/lisp/simple.el    2014-06-23 15:32:24 +0000
+++ b/lisp/simple.el    2014-06-23 20:23:33 +0000
@@ -3742,14 +3742,34 @@
   (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.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]