mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-12-13 09:32:47 +00:00
; Revert "Improve diff-mode navigation/manipulation"
This reverts commit2c8a7e50d2
. This change causes regressions: https://lists.gnu.org/archive/html/emacs-devel/2016-11/msg00738.html The following related commits are reverted as well:61c6a10e31
a283d655db
6b6abe0dba
e5ef59b87d
73349822cb
Fixes: debbugs:25105, 25400.
This commit is contained in:
parent
82a5e4dc88
commit
1508b538fd
@ -551,124 +551,26 @@ next hunk if TRY-HARDER is non-nil; otherwise signal an error."
|
|||||||
|
|
||||||
;; Define diff-{hunk,file}-{prev,next}
|
;; Define diff-{hunk,file}-{prev,next}
|
||||||
(easy-mmode-define-navigation
|
(easy-mmode-define-navigation
|
||||||
diff--internal-hunk diff-hunk-header-re "hunk" diff-end-of-hunk diff-restrict-view)
|
diff-hunk diff-hunk-header-re "hunk" diff-end-of-hunk diff-restrict-view
|
||||||
|
(when diff-auto-refine-mode
|
||||||
|
(unless (prog1 diff--auto-refine-data
|
||||||
|
(setq diff--auto-refine-data
|
||||||
|
(cons (current-buffer) (point-marker))))
|
||||||
|
(run-at-time 0.0 nil
|
||||||
|
(lambda ()
|
||||||
|
(when diff--auto-refine-data
|
||||||
|
(let ((buffer (car diff--auto-refine-data))
|
||||||
|
(point (cdr diff--auto-refine-data)))
|
||||||
|
(setq diff--auto-refine-data nil)
|
||||||
|
(with-local-quit
|
||||||
|
(when (buffer-live-p buffer)
|
||||||
|
(with-current-buffer buffer
|
||||||
|
(save-excursion
|
||||||
|
(goto-char point)
|
||||||
|
(diff-refine-hunk))))))))))))
|
||||||
|
|
||||||
(easy-mmode-define-navigation
|
(easy-mmode-define-navigation
|
||||||
diff--internal-file diff-file-header-re "file" diff-end-of-file)
|
diff-file diff-file-header-re "file" diff-end-of-file)
|
||||||
|
|
||||||
(defun diff--wrap-navigation (skip-hunk-start
|
|
||||||
what orig
|
|
||||||
header-re goto-start-func count)
|
|
||||||
"Wrap diff-{hunk,file}-{next,prev} for more intuitive behavior.
|
|
||||||
Override the default diff-{hunk,file}-{next,prev} implementation
|
|
||||||
by skipping any lines that are associated with this hunk/file but
|
|
||||||
precede the hunk-start marker. For instance, a diff file could
|
|
||||||
contain
|
|
||||||
|
|
||||||
diff --git a/lisp/vc/diff-mode.el b/lisp/vc/diff-mode.el
|
|
||||||
index 923de9a..6b1c24f 100644
|
|
||||||
--- a/lisp/vc/diff-mode.el
|
|
||||||
+++ b/lisp/vc/diff-mode.el
|
|
||||||
@@ -590,6 +590,22 @@
|
|
||||||
.......
|
|
||||||
|
|
||||||
If a point is on 'index', then the point is considered to be in
|
|
||||||
this first hunk. Move the point to the @@... marker before
|
|
||||||
executing the default diff-hunk-next/prev implementation to move
|
|
||||||
to the NEXT marker."
|
|
||||||
(if (not skip-hunk-start)
|
|
||||||
(funcall orig count)
|
|
||||||
|
|
||||||
(let ((start (point)))
|
|
||||||
(funcall goto-start-func)
|
|
||||||
|
|
||||||
;; Trap the error.
|
|
||||||
(condition-case nil
|
|
||||||
(funcall orig count)
|
|
||||||
(error nil))
|
|
||||||
|
|
||||||
(when (not (looking-at header-re))
|
|
||||||
(goto-char start)
|
|
||||||
(user-error (format "No %s" what)))
|
|
||||||
|
|
||||||
;; We successfully moved to the next/prev hunk/file. Apply the
|
|
||||||
;; auto-refinement if needed
|
|
||||||
(when diff-auto-refine-mode
|
|
||||||
(unless (prog1 diff--auto-refine-data
|
|
||||||
(setq diff--auto-refine-data
|
|
||||||
(cons (current-buffer) (point-marker))))
|
|
||||||
(run-at-time 0.0 nil
|
|
||||||
(lambda ()
|
|
||||||
(when diff--auto-refine-data
|
|
||||||
(let ((buffer (car diff--auto-refine-data))
|
|
||||||
(point (cdr diff--auto-refine-data)))
|
|
||||||
(setq diff--auto-refine-data nil)
|
|
||||||
(with-local-quit
|
|
||||||
(when (buffer-live-p buffer)
|
|
||||||
(with-current-buffer buffer
|
|
||||||
(save-excursion
|
|
||||||
(goto-char point)
|
|
||||||
(diff-refine-hunk))))))))))))))
|
|
||||||
|
|
||||||
;; These functions all take a skip-hunk-start argument which controls
|
|
||||||
;; whether we skip pre-hunk-start text or not. In interactive uses we
|
|
||||||
;; always want to do this, but the simple behavior is still necessary
|
|
||||||
;; to, for example, avoid an infinite loop:
|
|
||||||
;;
|
|
||||||
;; diff-hunk-next calls
|
|
||||||
;; diff--wrap-navigation calls
|
|
||||||
;; diff-bounds-of-hunk calls
|
|
||||||
;; diff-beginning-of-hunk calls
|
|
||||||
;; diff-hunk-next
|
|
||||||
;;
|
|
||||||
;; Here the outer diff-hunk-next has skip-hunk-start set to t, but the
|
|
||||||
;; inner one does not, which breaks the loop.
|
|
||||||
(defun diff-hunk-prev (&optional count skip-hunk-start)
|
|
||||||
"Go to the previous COUNT'th hunk."
|
|
||||||
(interactive (list (prefix-numeric-value current-prefix-arg) t))
|
|
||||||
(diff--wrap-navigation
|
|
||||||
skip-hunk-start
|
|
||||||
"prev hunk"
|
|
||||||
'diff--internal-hunk-prev
|
|
||||||
diff-hunk-header-re
|
|
||||||
(lambda () (goto-char (car (diff-bounds-of-hunk))))
|
|
||||||
count))
|
|
||||||
|
|
||||||
(defun diff-hunk-next (&optional count skip-hunk-start)
|
|
||||||
"Go to the next COUNT'th hunk."
|
|
||||||
(interactive (list (prefix-numeric-value current-prefix-arg) t))
|
|
||||||
(diff--wrap-navigation
|
|
||||||
skip-hunk-start
|
|
||||||
"next hunk"
|
|
||||||
'diff--internal-hunk-next
|
|
||||||
diff-hunk-header-re
|
|
||||||
(lambda () (goto-char (car (diff-bounds-of-hunk))))
|
|
||||||
count))
|
|
||||||
|
|
||||||
(defun diff-file-prev (&optional count skip-hunk-start)
|
|
||||||
"Go to the previous COUNT'th file."
|
|
||||||
(interactive (list (prefix-numeric-value current-prefix-arg) t))
|
|
||||||
(diff--wrap-navigation
|
|
||||||
skip-hunk-start
|
|
||||||
"prev file"
|
|
||||||
'diff--internal-file-prev
|
|
||||||
diff-file-header-re
|
|
||||||
(lambda () (goto-char (car (diff-bounds-of-file))) (diff--internal-hunk-next))
|
|
||||||
count))
|
|
||||||
|
|
||||||
(defun diff-file-next (&optional count skip-hunk-start)
|
|
||||||
"Go to the next COUNT'th file."
|
|
||||||
(interactive (list (prefix-numeric-value current-prefix-arg) t))
|
|
||||||
(diff--wrap-navigation
|
|
||||||
skip-hunk-start
|
|
||||||
"next file"
|
|
||||||
'diff--internal-file-next
|
|
||||||
diff-file-header-re
|
|
||||||
(lambda () (goto-char (car (diff-bounds-of-file))) (diff--internal-hunk-next))
|
|
||||||
count))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(defun diff-bounds-of-hunk ()
|
(defun diff-bounds-of-hunk ()
|
||||||
"Return the bounds of the diff hunk at point.
|
"Return the bounds of the diff hunk at point.
|
||||||
@ -679,13 +581,12 @@ point is in a file header, return the bounds of the next hunk."
|
|||||||
(let ((pos (point))
|
(let ((pos (point))
|
||||||
(beg (diff-beginning-of-hunk t))
|
(beg (diff-beginning-of-hunk t))
|
||||||
(end (diff-end-of-hunk)))
|
(end (diff-end-of-hunk)))
|
||||||
(cond ((> end pos)
|
(cond ((>= end pos)
|
||||||
(list beg end))
|
(list beg end))
|
||||||
;; If this hunk ends above POS, consider the next hunk.
|
;; If this hunk ends above POS, consider the next hunk.
|
||||||
((re-search-forward diff-hunk-header-re nil t)
|
((re-search-forward diff-hunk-header-re nil t)
|
||||||
(list (match-beginning 0) (diff-end-of-hunk)))
|
(list (match-beginning 0) (diff-end-of-hunk)))
|
||||||
;; There's no next hunk, so just take the one we have.
|
(t (error "No hunk found"))))))
|
||||||
(t (list beg end))))))
|
|
||||||
|
|
||||||
(defun diff-bounds-of-file ()
|
(defun diff-bounds-of-file ()
|
||||||
"Return the bounds of the file segment at point.
|
"Return the bounds of the file segment at point.
|
||||||
@ -771,7 +672,7 @@ data such as \"Index: ...\" and such."
|
|||||||
(setq prevfile nextfile))
|
(setq prevfile nextfile))
|
||||||
(if (and previndex (numberp prevfile) (< previndex prevfile))
|
(if (and previndex (numberp prevfile) (< previndex prevfile))
|
||||||
(setq prevfile previndex))
|
(setq prevfile previndex))
|
||||||
(if (numberp prevfile)
|
(if (and (numberp prevfile) (<= prevfile start))
|
||||||
(progn
|
(progn
|
||||||
(goto-char prevfile)
|
(goto-char prevfile)
|
||||||
;; Now skip backward over the leading junk we may have before the
|
;; Now skip backward over the leading junk we may have before the
|
||||||
@ -1764,9 +1665,8 @@ SRC and DST are the two variants of text as returned by `diff-hunk-text'.
|
|||||||
SWITCHED is non-nil if the patch is already applied.
|
SWITCHED is non-nil if the patch is already applied.
|
||||||
NOPROMPT, if non-nil, means not to prompt the user."
|
NOPROMPT, if non-nil, means not to prompt the user."
|
||||||
(save-excursion
|
(save-excursion
|
||||||
(let* ((hunk-bounds (diff-bounds-of-hunk))
|
(let* ((other (diff-xor other-file diff-jump-to-old-file))
|
||||||
(other (diff-xor other-file diff-jump-to-old-file))
|
(char-offset (- (point) (diff-beginning-of-hunk t)))
|
||||||
(char-offset (- (point) (goto-char (car hunk-bounds))))
|
|
||||||
;; Check that the hunk is well-formed. Otherwise diff-mode and
|
;; Check that the hunk is well-formed. Otherwise diff-mode and
|
||||||
;; the user may disagree on what constitutes the hunk
|
;; the user may disagree on what constitutes the hunk
|
||||||
;; (e.g. because an empty line truncates the hunk mid-course),
|
;; (e.g. because an empty line truncates the hunk mid-course),
|
||||||
@ -1775,7 +1675,7 @@ NOPROMPT, if non-nil, means not to prompt the user."
|
|||||||
;; Suppress check when NOPROMPT is non-nil (Bug#3033).
|
;; Suppress check when NOPROMPT is non-nil (Bug#3033).
|
||||||
(_ (unless noprompt (diff-sanity-check-hunk)))
|
(_ (unless noprompt (diff-sanity-check-hunk)))
|
||||||
(hunk (buffer-substring
|
(hunk (buffer-substring
|
||||||
(point) (cadr hunk-bounds)))
|
(point) (save-excursion (diff-end-of-hunk) (point))))
|
||||||
(old (diff-hunk-text hunk reverse char-offset))
|
(old (diff-hunk-text hunk reverse char-offset))
|
||||||
(new (diff-hunk-text hunk (not reverse) char-offset))
|
(new (diff-hunk-text hunk (not reverse) char-offset))
|
||||||
;; Find the location specification.
|
;; Find the location specification.
|
||||||
@ -1883,15 +1783,8 @@ With a prefix argument, REVERSE the hunk."
|
|||||||
;; Display BUF in a window
|
;; Display BUF in a window
|
||||||
(set-window-point (display-buffer buf) (+ (car pos) (cdr new)))
|
(set-window-point (display-buffer buf) (+ (car pos) (cdr new)))
|
||||||
(diff-hunk-status-msg line-offset (diff-xor switched reverse) nil)
|
(diff-hunk-status-msg line-offset (diff-xor switched reverse) nil)
|
||||||
|
|
||||||
;; Advance to the next hunk with skip-hunk-start set to t
|
|
||||||
;; because we want the behavior of moving to the next logical
|
|
||||||
;; hunk, not the original behavior where were would sometimes
|
|
||||||
;; stay on the current hunk. This is the behavior we get when
|
|
||||||
;; navigating through hunks interactively, and we want it when
|
|
||||||
;; applying hunks too (see http://debbugs.gnu.org/17544).
|
|
||||||
(when diff-advance-after-apply-hunk
|
(when diff-advance-after-apply-hunk
|
||||||
(diff-hunk-next nil t))))))
|
(diff-hunk-next))))))
|
||||||
|
|
||||||
|
|
||||||
(defun diff-test-hunk (&optional reverse)
|
(defun diff-test-hunk (&optional reverse)
|
||||||
@ -1972,15 +1865,14 @@ For use in `add-log-current-defun-function'."
|
|||||||
(defun diff-ignore-whitespace-hunk ()
|
(defun diff-ignore-whitespace-hunk ()
|
||||||
"Re-diff the current hunk, ignoring whitespace differences."
|
"Re-diff the current hunk, ignoring whitespace differences."
|
||||||
(interactive)
|
(interactive)
|
||||||
(let* ((hunk-bounds (diff-bounds-of-hunk))
|
(let* ((char-offset (- (point) (diff-beginning-of-hunk t)))
|
||||||
(char-offset (- (point) (goto-char (car hunk-bounds))))
|
|
||||||
(opts (pcase (char-after) (?@ "-bu") (?* "-bc") (_ "-b")))
|
(opts (pcase (char-after) (?@ "-bu") (?* "-bc") (_ "-b")))
|
||||||
(line-nb (and (or (looking-at "[^0-9]+\\([0-9]+\\)")
|
(line-nb (and (or (looking-at "[^0-9]+\\([0-9]+\\)")
|
||||||
(error "Can't find line number"))
|
(error "Can't find line number"))
|
||||||
(string-to-number (match-string 1))))
|
(string-to-number (match-string 1))))
|
||||||
(inhibit-read-only t)
|
(inhibit-read-only t)
|
||||||
(hunk (delete-and-extract-region
|
(hunk (delete-and-extract-region
|
||||||
(point) (cadr hunk-bounds)))
|
(point) (save-excursion (diff-end-of-hunk) (point))))
|
||||||
(lead (make-string (1- line-nb) ?\n)) ;Line nums start at 1.
|
(lead (make-string (1- line-nb) ?\n)) ;Line nums start at 1.
|
||||||
(file1 (make-temp-file "diff1"))
|
(file1 (make-temp-file "diff1"))
|
||||||
(file2 (make-temp-file "diff2"))
|
(file2 (make-temp-file "diff2"))
|
||||||
@ -2076,14 +1968,16 @@ Return new point, if it was moved."
|
|||||||
(interactive)
|
(interactive)
|
||||||
(require 'smerge-mode)
|
(require 'smerge-mode)
|
||||||
(save-excursion
|
(save-excursion
|
||||||
(let* ((hunk-bounds (diff-bounds-of-hunk))
|
(diff-beginning-of-hunk t)
|
||||||
(style (progn (goto-char (car hunk-bounds))
|
(let* ((start (point))
|
||||||
(diff-hunk-style))) ;Skips the hunk header as well.
|
(style (diff-hunk-style)) ;Skips the hunk header as well.
|
||||||
(beg (point))
|
(beg (point))
|
||||||
(end (cadr hunk-bounds))
|
|
||||||
(props-c '((diff-mode . fine) (face diff-refine-changed)))
|
(props-c '((diff-mode . fine) (face diff-refine-changed)))
|
||||||
(props-r '((diff-mode . fine) (face diff-refine-removed)))
|
(props-r '((diff-mode . fine) (face diff-refine-removed)))
|
||||||
(props-a '((diff-mode . fine) (face diff-refine-added))))
|
(props-a '((diff-mode . fine) (face diff-refine-added)))
|
||||||
|
;; Be careful to go back to `start' so diff-end-of-hunk gets
|
||||||
|
;; to read the hunk header's line info.
|
||||||
|
(end (progn (goto-char start) (diff-end-of-hunk) (point))))
|
||||||
|
|
||||||
(remove-overlays beg end 'diff-mode 'fine)
|
(remove-overlays beg end 'diff-mode 'fine)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user