]> git.eshelyaron.com Git - emacs.git/commitdiff
Teach 'diff-ignore-whitespace-hunk' how to regenerate all hunks
authorRobert Pluim <rpluim@gmail.com>
Tue, 10 Jan 2023 18:55:50 +0000 (19:55 +0100)
committerRobert Pluim <rpluim@gmail.com>
Wed, 15 Feb 2023 12:51:47 +0000 (13:51 +0100)
This implements the request from Bug#58516.

* lisp/vc/diff-mode.el (diff--ignore-whitespace-all-hunks): New
function.  Iterate over all hunks, regenerate ignoring whitespace
changes.
(diff-ignore-whitespace-hunk): Call `diff--ignore-whitespace-all-hunks'
when called with a prefix arg.

* doc/emacs/files.texi (Diff Mode): Describe new functionality.
* etc/NEWS: Announce the change.

doc/emacs/files.texi
etc/NEWS
lisp/vc/diff-mode.el

index 664b9d5d9a3fb6d71eae462c02127e9c867ba5c3..6586998e17932083c02fe84de448d76f4d6d79ee 100644 (file)
@@ -1738,7 +1738,8 @@ Re-generate the current hunk (@code{diff-refresh-hunk}).
 
 @item C-c C-w
 @findex diff-ignore-whitespace-hunk
-Re-generate the current hunk, disregarding changes in whitespace
+Re-generate the current hunk, disregarding changes in whitespace.
+With a non-@code{nil} prefix arg, re-generate all the hunks
 (@code{diff-ignore-whitespace-hunk}).
 
 @item C-x 4 A
index 2d63593ff17e1e08350f15a9f18d4f6f99c38ecb..624bbdf98f905147e1fbe8deac2222c4b5fe579b 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -98,6 +98,14 @@ This is a string or a list of strings that specifies the Git log
 switches for shortlogs, such as the one produced by 'C-x v L'.
 'vc-git-log-switches' is no longer used for shortlogs.
 
+** Diff Mode
+
++++
+*** 'diff-ignore-whitespace-hunk' can now be applied to all hunks.
+When called with a non-nil prefix argument
+'diff-ignore-whitespace-hunk' now iterates over all the hunks in the
+current diff, regenerating them without whitespace changes.
+
 ** Buffer Selection
 
 ---
index eb01dede56ec976623a8228eb3b4351a84995ee4..6d8a868aa48507eb8c31ec1b92fe5aa08eee7911 100644 (file)
@@ -2103,10 +2103,13 @@ For use in `add-log-current-defun-function'."
               (goto-char (+ (car pos) (cdr src)))
               (add-log-current-defun)))))))
 
-(defun diff-ignore-whitespace-hunk ()
-  "Re-diff the current hunk, ignoring whitespace differences."
-  (interactive)
-  (diff-refresh-hunk t))
+(defun diff-ignore-whitespace-hunk (&optional whole-buffer)
+  "Re-diff the current hunk, ignoring whitespace differences.
+With non-nil prefix arg, re-diff all the hunks."
+  (interactive "P")
+  (if whole-buffer
+      (diff--ignore-whitespace-all-hunks)
+    (diff-refresh-hunk t)))
 
 (defun diff-refresh-hunk (&optional ignore-whitespace)
   "Re-diff the current hunk."
@@ -2299,6 +2302,16 @@ Call FUN with two args (BEG and END) for each hunk."
                         (or (ignore-errors (diff-hunk-next) (point))
                             max)))))))))
 
+;; This doesn't use `diff--iterate-hunks', since that assumes that
+;; hunks don't change size.
+(defun diff--ignore-whitespace-all-hunks ()
+  "Re-diff all the hunks, ignoring whitespace-differences."
+  (save-excursion
+    (goto-char (point-min))
+    (diff-hunk-next)
+    (while (looking-at diff-hunk-header-re)
+      (diff-refresh-hunk t))))
+
 (defun diff--font-lock-refined (max)
   "Apply hunk refinement from font-lock."
   (when (eq diff-refine 'font-lock)