is after the corresponding file or hunk header, but not when inside it.
Now they will always move to the start of the current header.
++++
+*** New command 'diff-delete-other-hunks' bound to C-c RET n.
+This command deletes all hunks other than the current hunk. It is
+useful to prepare a *vc-diff* buffer for committing a single hunk.
+When the region is active, it deletes all hunks that the region does not
+overlap.
+
** php-ts-mode
---
"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
: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"]
(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
;; Fileset comes from a diff-mode buffer, see
;; 'diff-vc-deduce-fileset', and the buffer is the patch to apply.
((eq model 'patch)
+ (when (buffer-narrowed-p)
+ ;; If user used `diff-restrict-view' then we may not have the
+ ;; file header, and the commit will not succeed (bug#73387).
+ (user-error "Cannot commit patch when narrowed; consider %s"
+ (mapconcat (lambda (c)
+ (key-description
+ (where-is-internal c nil t)))
+ '(widen
+ diff-delete-other-hunks
+ vc-next-action)
+ " ")))
(vc-checkin files backend nil nil nil (buffer-string)))
((or (null state) (eq state 'unregistered))
(cond (verbose