[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#58516: 28.1; add option/key to rerun current diff without whitespac
From: |
Robert Pluim |
Subject: |
bug#58516: 28.1; add option/key to rerun current diff without whitespace changes |
Date: |
Fri, 14 Oct 2022 17:35:29 +0200 |
>>>>> On Fri, 14 Oct 2022 11:15:05 +0000, gert via "Bug reports for GNU Emacs,
>>>>> the Swiss army knife of text editors" <bug-gnu-emacs@gnu.org> said:
Gert> Sometimes, for example when you work together with others, there are
Gert> meaningless whitespace changes in the diff.
Gert> In order to review these diff easier add a key to rerun the current
Gert> diff without showing whitespace changes.
Gert> There is
Gert> ("\C-c\C-w" . diff-ignore-whitespace-hunk)
Gert> which is useful, but incovenient to use when there are many hunks in
the diff.
Gert> Add a key which does the same, but for all hunks
Gert> (e.g. diff-toggle-whitespace-changes), so you can easily switch a diff
Gert> buffer to one which ignores all whitespace changes.
Something like this, perhaps. I stuck it on a separate key, but we
could put it on "C-u C-c C-w" instead.
diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
index a9591c9d82..3b8178884a 100644
--- a/lisp/vc/diff-mode.el
+++ b/lisp/vc/diff-mode.el
@@ -214,6 +214,7 @@ diff-mode-map
;; `d' because it duplicates the context :-( --Stef
"C-c C-d" #'diff-unified->context
"C-c C-w" #'diff-ignore-whitespace-hunk
+ "C-c C-W" #'diff-ignore-whitespace-all-hunks
;; `l' because it "refreshes" the hunk like C-l refreshes the screen
"C-c C-l" #'diff-refresh-hunk
"C-c C-b" #'diff-refine-hunk ;No reason for `b' :-(
@@ -2275,10 +2276,12 @@ diff--refine-hunk
(match-end 0) end
nil #'diff-refine-preproc props-r
props-a)))))))
-(defun diff--iterate-hunks (max fun)
+(defun diff--iterate-hunks (max fun &optional min)
"Iterate over all hunks between point and MAX.
Call FUN with two args (BEG and END) for each hunk."
(save-excursion
+ (when min
+ (goto-char min))
(catch 'malformed
(let* ((beg (or (ignore-errors (diff-beginning-of-hunk))
(ignore-errors (diff-hunk-next) (point))
@@ -2298,6 +2301,13 @@ diff--iterate-hunks
(or (ignore-errors (diff-hunk-next) (point))
max)))))))))
+(defun diff-ignore-whitespace-all-hunks ()
+ "Re-diff all the hunks, ignoring whitespace-differences."
+ (interactive)
+ (diff--iterate-hunks (point-max) (lambda (_ _)
+ (diff-refresh-hunk t))
+ (point-min)))
+
(defun diff--font-lock-refined (max)
"Apply hunk refinement from font-lock."
(when (eq diff-refine 'font-lock)