From 2fde356acb722a54aa0a4f18cbe2b56c216dbb1e Mon Sep 17 00:00:00 2001 From: Sam Steingold Date: Mon, 23 Jun 2014 16:23:33 -0400 Subject: [PATCH] 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. --- lisp/ChangeLog | 5 +++++ lisp/simple.el | 22 +++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 8c2fb12da4e..3f7896fd1c5 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2014-06-23 Sam Steingold + + * simple.el (kill-append): Remove undo boundary depending on ... + (kill-append-merge-undo): New user option. + 2014-06-23 Stefan Monnier * simple.el (handle-shift-selection, exchange-point-and-mark) diff --git a/lisp/simple.el b/lisp/simple.el index 9983943298f..a8689aaf2e3 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -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. -- 2.39.5