* lisp/subr.el (with-undo-amalgamate): New macro

This allows commands to be made without adding undo-barriers, e.g.
kmacro-exec-ring-item.
This commit is contained in:
Campbell Barton 2021-11-08 16:33:39 +11:00 committed by Stefan Monnier
parent 4f365eec10
commit 5861b8d027
3 changed files with 32 additions and 0 deletions

View file

@ -1506,6 +1506,11 @@ continuing to undo.
This function does not bind @code{undo-in-progress}.
@end defun
@defmac with-undo-amalgamate body@dots{}
This macro removes all the undo boundaries inserted during the
execution of @var{body} so that it can be undone as a single step.
@end defmac
Some commands leave the region active after execution in such a way that
it interferes with selective undo of that command. To make @code{undo}
ignore the active region when invoked immediately after such a command,

View file

@ -598,6 +598,10 @@ Use 'exif-parse-file' and 'exif-field' instead.
* Lisp Changes in Emacs 29.1
+++
*** New macro 'with-undo-amalgamate'
It records a particular sequence of operations as a single undo step
+++
*** New command 'yank-media'.
This command supports yanking non-plain-text media like images and

View file

@ -3542,6 +3542,29 @@ user can undo the change normally."
(accept-change-group ,handle)
(cancel-change-group ,handle))))))
(defmacro with-undo-amalgamate (&rest body)
"Like `progn' but perform BODY with amalgamated undo barriers.
This allows multiple operations to be undone in a single step.
When undo is disabled this behaves like `progn'."
(declare (indent 0) (debug t))
(let ((handle (make-symbol "--change-group-handle--")))
`(let ((,handle (prepare-change-group))
;; Don't truncate any undo data in the middle of this,
;; otherwise Emacs might truncate part of the resulting
;; undo step: we want to mimic the behavior we'd get if the
;; undo-boundaries were never added in the first place.
(undo-outer-limit nil)
(undo-limit most-positive-fixnum)
(undo-strong-limit most-positive-fixnum))
(unwind-protect
(progn
(activate-change-group ,handle)
,@body)
(progn
(accept-change-group ,handle)
(undo-amalgamate-change-group ,handle))))))
(defun prepare-change-group (&optional buffer)
"Return a handle for the current buffer's state, for a change group.
If you specify BUFFER, make a handle for BUFFER's state instead.