mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-06 14:30:50 -08:00
Make diff-revert-and-kill-hunk consider an active region
* lisp/vc/diff-mode.el (diff-revert-and-kill-hunk): When the region is active, operate on all hunks it overlaps. * doc/emacs/files.texi (Diff Mode): * etc/NEWS: Document the change.
This commit is contained in:
parent
f5953186ef
commit
304d4435b1
3 changed files with 40 additions and 9 deletions
|
|
@ -1835,7 +1835,8 @@ confirm deletions or applying hunks to backup files.
|
||||||
@item C-c M-u
|
@item C-c M-u
|
||||||
Revert this hunk, and then remove the hunk from the diffs
|
Revert this hunk, and then remove the hunk from the diffs
|
||||||
(@code{diff-revert-and-kill-hunk}). Save the buffer visiting the target
|
(@code{diff-revert-and-kill-hunk}). Save the buffer visiting the target
|
||||||
file.
|
file. When the region is active, the command reverse-applies and kills
|
||||||
|
hunks that the region overlaps.
|
||||||
|
|
||||||
This command is useful in buffers generated by @w{@kbd{C-x v =}} and
|
This command is useful in buffers generated by @w{@kbd{C-x v =}} and
|
||||||
@w{@kbd{C-x v D}} (@pxref{Old Revisions}). These buffers present you
|
@w{@kbd{C-x v D}} (@pxref{Old Revisions}). These buffers present you
|
||||||
|
|
@ -1843,7 +1844,7 @@ with a view of the changes you've made, and you can use this command to
|
||||||
undo changes you didn't intend to do, or no longer want.
|
undo changes you didn't intend to do, or no longer want.
|
||||||
|
|
||||||
This is a destructive operation, so by default, this command asks you to
|
This is a destructive operation, so by default, this command asks you to
|
||||||
confirm you really want to revert and kill the hunk. You can customize
|
confirm you really want to revert and kill the hunks. You can customize
|
||||||
@code{diff-ask-before-revert-and-kill-hunk} to control that.
|
@code{diff-ask-before-revert-and-kill-hunk} to control that.
|
||||||
|
|
||||||
@findex diff-apply-buffer
|
@findex diff-apply-buffer
|
||||||
|
|
|
||||||
2
etc/NEWS
2
etc/NEWS
|
|
@ -2031,6 +2031,8 @@ This command reverts the hunk at point (i.e., applies the reverse of the
|
||||||
hunk), and then removes the hunk from the diffs.
|
hunk), and then removes the hunk from the diffs.
|
||||||
This is useful to undo or revert changes, committed and uncommitted, when
|
This is useful to undo or revert changes, committed and uncommitted, when
|
||||||
you are in buffers generated by 'C-x v =' and 'C-x v D'.
|
you are in buffers generated by 'C-x v =' and 'C-x v D'.
|
||||||
|
When the region is active, the command reverse-applies and kills hunks
|
||||||
|
that the region overlaps.
|
||||||
|
|
||||||
---
|
---
|
||||||
*** 'diff-file-prev' and 'diff-hunk-prev' always move to start of header.
|
*** 'diff-file-prev' and 'diff-hunk-prev' always move to start of header.
|
||||||
|
|
|
||||||
|
|
@ -2256,8 +2256,10 @@ With a prefix argument, try to REVERSE the hunk."
|
||||||
:type 'boolean
|
:type 'boolean
|
||||||
:version "31.1")
|
:version "31.1")
|
||||||
|
|
||||||
(defun diff-revert-and-kill-hunk ()
|
(defun diff-revert-and-kill-hunk (&optional beg end)
|
||||||
"Reverse-apply and then kill the hunk at point. Save changed buffer.
|
"Reverse-apply and then kill the hunk at point. Save changed buffer.
|
||||||
|
Interactively, if the region is active, reverse-apply and kill all
|
||||||
|
hunks that the region overlaps.
|
||||||
|
|
||||||
This command is useful in buffers generated by \\[vc-diff] and \\[vc-root-diff],
|
This command is useful in buffers generated by \\[vc-diff] and \\[vc-root-diff],
|
||||||
especially when preparing to commit the patch with \\[vc-next-action].
|
especially when preparing to commit the patch with \\[vc-next-action].
|
||||||
|
|
@ -2268,13 +2270,39 @@ to permanently drop changes you didn't intend, or no longer want.
|
||||||
|
|
||||||
This is a destructive operation, so by default, this command asks you to
|
This is a destructive operation, so by default, this command asks you to
|
||||||
confirm you really want to reverse-apply and kill the hunk. You can
|
confirm you really want to reverse-apply and kill the hunk. You can
|
||||||
customize `diff-ask-before-revert-and-kill-hunk' to control that."
|
customize `diff-ask-before-revert-and-kill-hunk' to control that.
|
||||||
(interactive)
|
|
||||||
|
When called from Lisp with optional arguments BEG and END non-nil,
|
||||||
|
reverse-apply and kill all hunks overlapped by the region from BEG to
|
||||||
|
END as though called interactively with an active region delimited by
|
||||||
|
BEG and END."
|
||||||
|
(interactive (list (use-region-beginning) (use-region-end)))
|
||||||
|
(when (xor beg end)
|
||||||
|
(error "Invalid call to `diff-revert-and-kill-hunk'"))
|
||||||
(when (or (not diff-ask-before-revert-and-kill-hunk)
|
(when (or (not diff-ask-before-revert-and-kill-hunk)
|
||||||
(yes-or-no-p "Really reverse-apply and kill this hunk?"))
|
(y-or-n-p "Really reverse-apply and kill hunk(s)?"))
|
||||||
(cl-destructuring-bind (beg end) (diff-bounds-of-hunk)
|
(if beg
|
||||||
(when (null (diff-apply-buffer beg end t))
|
(save-excursion
|
||||||
(diff-hunk-kill)))))
|
(goto-char beg)
|
||||||
|
(setq beg (car (diff-bounds-of-hunk)))
|
||||||
|
(goto-char end)
|
||||||
|
(setq end (cadr (diff-bounds-of-hunk))))
|
||||||
|
(pcase-setq `(,beg ,end) (diff-bounds-of-hunk)))
|
||||||
|
(when (null (diff-apply-buffer beg end t))
|
||||||
|
;; Use `diff-hunk-kill' because it properly handles file headers,
|
||||||
|
;; except if we are killing the last hunk we need not be concerned
|
||||||
|
;; with that. If we are not deleting the very last hunk then
|
||||||
|
;; exploit how `diff-hunk-kill' will always leave us at the
|
||||||
|
;; beginning of a hunk (except when killing the very last hunk!).
|
||||||
|
(if (eql end (point-max))
|
||||||
|
(let ((inhibit-read-only t))
|
||||||
|
(kill-region beg end))
|
||||||
|
(setq end (copy-marker end))
|
||||||
|
(unwind-protect
|
||||||
|
(cl-loop initially (goto-char beg)
|
||||||
|
do (diff-hunk-kill)
|
||||||
|
until (eql (point) (marker-position end)))
|
||||||
|
(set-marker end nil))))))
|
||||||
|
|
||||||
(defun diff-apply-buffer (&optional beg end reverse test-or-no-save)
|
(defun diff-apply-buffer (&optional beg end reverse test-or-no-save)
|
||||||
"Apply the diff in the entire diff buffer.
|
"Apply the diff in the entire diff buffer.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue