diff --git a/etc/NEWS b/etc/NEWS index 1020a2a0ea..36ad3d82df 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -353,6 +353,11 @@ To disable it, set the new defcustom 'diff-font-lock-refine' to nil. *** File headers can be shortened, mimicking Magit's diff format. To enable it, set the new defcustom 'diff-font-lock-prettify to t. +*** In the diff buffer created by a version control system, the prefix +arg of diff-goto-source means it jumps to the old revision of the file +if point is on an old changed line, or to the new revision of the file +otherwise. + ** Browse-url *** The function 'browse-url-emacs' can now visit a URL in selected window. diff --git a/lisp/vc/vc.el b/lisp/vc/vc.el index dcfbf26e86..6b7ca02440 100644 --- a/lisp/vc/vc.el +++ b/lisp/vc/vc.el @@ -1728,6 +1729,7 @@ vc-diff-internal (set-buffer buffer) (diff-mode) (set (make-local-variable 'diff-vc-backend) (car vc-fileset)) + (set (make-local-variable 'diff-vc-revisions) (list rev1 rev2)) (set (make-local-variable 'revert-buffer-function) (lambda (_ignore-auto _noconfirm) (vc-diff-internal async vc-fileset rev1 rev2 verbose))) diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el index cf52368508..b41206296d 100644 --- a/lisp/vc/diff-mode.el +++ b/lisp/vc/diff-mode.el @@ -104,6 +105,9 @@ diff-font-lock-prettify (defvar diff-vc-backend nil "The VC backend that created the current Diff buffer, if any.") +(defvar diff-vc-revisions nil + "The VC revisions compared in the current Diff buffer, if any.") + (defvar diff-outline-regexp "\\([*+][*+][*+] [^0-9]\\|@@ ...\\|\\*\\*\\* [0-9].\\|--- [0-9]..\\)") @@ -1736,7 +1740,11 @@ diff-find-source-location (match-string 1))))) (file (or (diff-find-file-name other noprompt) (error "Can't find the file"))) - (buf (find-file-noselect file))) + (revision (and other diff-vc-backend + (nth (if reverse 1 0) diff-vc-revisions))) + (buf (if revision + (vc-find-revision file revision diff-vc-backend) + (find-file-noselect file)))) ;; Update the user preference if he so wished. (when (> (prefix-numeric-value other-file) 8) (setq diff-jump-to-old-file other)) @@ -1862,7 +1870,11 @@ diff-goto-source `diff-jump-to-old-file' (or its opposite if the OTHER-FILE prefix arg is given) determines whether to jump to the old or the new file. If the prefix arg is bigger than 8 (for example with \\[universal-argument] \\[universal-argument]) -then `diff-jump-to-old-file' is also set, for the next invocations." +then `diff-jump-to-old-file' is also set, for the next invocations. + +In the diff buffer created by a version control system, the OTHER-FILE +prefix arg means it jumps to the old revision of the file if point is +on an old changed line, or to the new revision of the file otherwise." (interactive (list current-prefix-arg last-input-event)) ;; When pointing at a removal line, we probably want to jump to ;; the old location, and else to the new (i.e. as if reverting).