summaryrefslogtreecommitdiff
path: root/lisp/vc/diff-mode.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/vc/diff-mode.el')
-rw-r--r--lisp/vc/diff-mode.el34
1 files changed, 34 insertions, 0 deletions
diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index 25c6238765d..948d89c579e 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -220,6 +220,7 @@ The default \"-b\" means to ignore whitespace-only changes,
"C-c C-a" #'diff-apply-hunk
"C-c M-r" #'diff-revert-and-kill-hunk
"C-c C-m a" #'diff-apply-buffer
+ "C-c C-m n" #'diff-delete-other-hunks
"C-c C-e" #'diff-ediff-patch
"C-c C-n" #'diff-restrict-view
"C-c C-s" #'diff-split-hunk
@@ -278,6 +279,8 @@ The default \"-b\" means to ignore whitespace-only changes,
:help "Kill current hunk"]
["Kill current file's hunks" diff-file-kill
:help "Kill all current file's hunks"]
+ ["Delete other hunks" diff-delete-other-hunks
+ :help "Delete hunks other than the current hunk"]
"-----"
["Previous Hunk" diff-hunk-prev
:help "Go to the previous count'th hunk"]
@@ -814,6 +817,37 @@ If the prefix ARG is given, restrict the view to the current file instead."
(goto-char (car bounds))
(ignore-errors (diff-beginning-of-hunk t)))))
+;; This is not `diff-kill-other-hunks' because we might need to make
+;; copies of file headers in order to ensure the new kill ring entry
+;; would be a patch with the same meaning. That is not implemented
+;; because it does not seem like it would be useful.
+(defun diff-delete-other-hunks (&optional beg end)
+ "Delete all hunks other than the current hunk.
+Interactively, if the region is active, then delete all hunks that the
+region does not overlap. When called from Lisp, the optional arguments
+BEG and END specify the region of hunks not to delete."
+ (interactive (list (use-region-beginning) (use-region-end)))
+ (when (buffer-narrowed-p)
+ (user-error "Command is not safe in a narrowed buffer"))
+ (let ((inhibit-read-only t))
+ (save-excursion
+ (cond ((xor beg end)
+ (error "Require exactly zero or two arguments"))
+ (beg
+ (goto-char beg)
+ (setq beg (car (diff-bounds-of-hunk)))
+ (goto-char end)
+ (setq end (cadr (diff-bounds-of-hunk))))
+ (t
+ (pcase-setq `(,beg ,end) (diff-bounds-of-hunk))))
+ (delete-region end (point-max))
+ (goto-char beg)
+ (diff-beginning-of-file)
+ (diff-hunk-next)
+ (delete-region (point) beg)
+ (diff-beginning-of-file-and-junk)
+ (delete-region (point-min) (point)))))
+
(defun diff-beginning-of-file-and-junk ()
"Go to the beginning of file-related diff-info.
This is like `diff-beginning-of-file' except it tries to skip back over leading