Function: diff-reverse-direction
diff-reverse-direction is an interactive and byte-compiled function
defined in diff-mode.el.gz.
Signature
(diff-reverse-direction START END)
Documentation
Reverse the direction of the diffs.
START and END are either taken from the region (if a prefix arg is given) or else cover the whole buffer.
Probably introduced at or before Emacs version 22.1.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/vc/diff-mode.el.gz
(defun diff-reverse-direction (start end)
"Reverse the direction of the diffs.
START and END are either taken from the region (if a prefix arg is given) or
else cover the whole buffer."
(interactive (if (or current-prefix-arg (use-region-p))
(list (region-beginning) (region-end))
(list (point-min) (point-max))))
(unless (markerp end) (setq end (copy-marker end t)))
(let (;;(diff-inhibit-after-change t)
(inhibit-read-only t))
(save-excursion
(goto-char start)
(while (and (re-search-forward "^\\(\\([-*][-*][-*] \\)\\(.+\\)\n\\([-+][-+][-+] \\)\\(.+\\)\\|\\*\\{15\\}.*\n\\*\\*\\* \\(.+\\) \\*\\*\\*\\*\\|@@ -\\([0-9,]+\\) \\+\\([0-9,]+\\) @@.*\\)$" nil t)
(< (point) end))
(combine-after-change-calls
(cond
;; a file header
((match-beginning 2) (replace-match "\\2\\5\n\\4\\3" nil))
;; a context-diff hunk header
((match-beginning 6)
(let ((pt-lines1 (match-beginning 6))
(lines1 (match-string 6)))
(replace-match "" nil nil nil 6)
(forward-line 1)
(let ((half1s (point)))
(while (looking-at "[-! \\][ \t]\\|#")
(when (= (char-after) ?-) (delete-char 1) (insert "+"))
(forward-line 1))
(let ((half1 (delete-and-extract-region half1s (point))))
(unless (looking-at diff-context-mid-hunk-header-re)
(insert half1)
(error "Can't find matching `--- n1,n2 ----' line"))
(let* ((str1end (or (match-end 2) (match-end 1)))
(str1 (buffer-substring (match-beginning 1) str1end)))
(goto-char str1end)
(insert lines1)
(delete-region (match-beginning 1) str1end)
(forward-line 1)
(let ((half2s (point)))
(while (looking-at "[!+ \\][ \t]\\|#")
(when (= (char-after) ?+) (delete-char 1) (insert "-"))
(forward-line 1))
(let ((half2 (delete-and-extract-region half2s (point))))
(insert (or half1 ""))
(goto-char half1s)
(insert (or half2 ""))))
(goto-char pt-lines1)
(insert str1))))))
;; a unified-diff hunk header
((match-beginning 7)
(replace-match "@@ -\\8 +\\7 @@" nil)
(forward-line 1)
(let ((c (char-after)) first last)
(while (pcase (setq c (char-after))
(?- (setq first (or first (point)))
(delete-char 1) (insert "+") t)
(?+ (setq last (or last (point)))
(delete-char 1) (insert "-") t)
((or ?\\ ?#) t)
(_ (when (and first last (< first last))
(insert (delete-and-extract-region first last)))
(setq first nil last nil)
(memq c (if diff-valid-unified-empty-line
'(?\s ?\n) '(?\s)))))
(forward-line 1))))))))))