Upgraded to MH-E version 7.4.80.
[bpt/emacs.git] / lisp / diff-mode.el
index 180fefc..26ff544 100644 (file)
@@ -48,7 +48,6 @@
 ;;
 ;; - Refine hunk on a word-by-word basis.
 ;;
-;; - Use the new next-error-function to allow C-x `.
 ;; - Handle `diff -b' output in context->unified.
 
 ;;; Code:
@@ -110,7 +109,7 @@ when editing big diffs)."
     ("}" . diff-file-next)
     ("{" . diff-file-prev)
     ("\C-m" . diff-goto-source)
-    ([mouse-2] . diff-mouse-goto-source)
+    ([mouse-2] . diff-goto-source)
     ;; From XEmacs' diff-mode.
     ("W" . widen)
     ;;("." . diff-goto-source)         ;display-buffer
@@ -170,27 +169,27 @@ when editing big diffs)."
 ;;;;
 
 (defface diff-header-face
-  '((((type tty pc) (class color) (background light))
-     (:foreground "blue1" :weight bold))
-    (((type tty pc) (class color) (background dark))
-     (:foreground "green" :weight bold))
-    (((class color) (background light))
+  '((((class color) (min-colors 88) (background light))
      (:background "grey85"))
-    (((class color) (background dark))
+    (((class color) (min-colors 88) (background dark))
      (:background "grey45"))
+    (((class color) (background light))
+     (:foreground "blue1" :weight bold))
+    (((class color) (background dark))
+     (:foreground "green" :weight bold))
     (t (:weight bold)))
   "`diff-mode' face inherited by hunk and index header faces.")
 (defvar diff-header-face 'diff-header-face)
 
 (defface diff-file-header-face
-  '((((type tty pc) (class color) (background light))
-     (:foreground "yellow" :weight bold))
-    (((type tty pc) (class color) (background dark))
-     (:foreground "cyan" :weight bold))
-    (((class color) (background light))
+  '((((class color) (min-colors 88) (background light))
      (:background "grey70" :weight bold))
-    (((class color) (background dark))
+    (((class color) (min-colors 88) (background dark))
      (:background "grey60" :weight bold))
+    (((class color) (background light))
+     (:foreground "yellow" :weight bold))
+    (((class color) (background dark))
+     (:foreground "cyan" :weight bold))
     (t (:weight bold)))                        ; :height 1.3
   "`diff-mode' face used to highlight file header lines.")
 (defvar diff-file-header-face 'diff-file-header-face)
@@ -305,7 +304,11 @@ when editing big diffs)."
 (defvar diff-narrowed-to nil)
 
 (defun diff-end-of-hunk (&optional style)
-  (if (looking-at diff-hunk-header-re) (goto-char (match-end 0)))
+  (when (looking-at diff-hunk-header-re)
+    (unless style
+      ;; Especially important for unified (because headers are ambiguous).
+      (setq style (cdr (assq (char-after) '((?@ . unified) (?* . context))))))
+    (goto-char (match-end 0)))
   (let ((end (and (re-search-forward (case style
                                       ;; A `unified' header is ambiguous.
                                       (unified (concat "^[^-+# \\]\\|"
@@ -547,14 +550,6 @@ Non-nil OLD means that we want the old file."
         file)))))
 
 
-(defun diff-mouse-goto-source (event)
-  "Run `diff-goto-source' for the diff at a mouse click."
-  (interactive "e")
-  (save-excursion
-    (mouse-set-point event)
-    (diff-goto-source)))
-
-
 (defun diff-ediff-patch ()
   "Call `ediff-patch-file' on the current buffer."
   (interactive)
@@ -890,9 +885,14 @@ See `after-change-functions' for the meaning of BEG, END and LEN."
          (diff-fixup-modifs (point) (cdr diff-unhandled-changes)))))
     (setq diff-unhandled-changes nil)))
 
-;;;;
-;;;; The main function
-;;;;
+(defun diff-next-error (arg reset)
+  ;; Select a window that displays the current buffer so that point
+  ;; movements are reflected in that window.  Otherwise, the user might
+  ;; never see the hunk corresponding to the source she's jumping to.
+  (pop-to-buffer (current-buffer))
+  (if reset (goto-char (point-min)))
+  (diff-hunk-next arg)
+  (diff-goto-source))
 
 ;;;###autoload
 (define-derived-mode diff-mode fundamental-mode "Diff"
@@ -920,6 +920,7 @@ a diff with \\[diff-reverse-direction]."
   ;;   (set (make-local-variable 'paragraph-separate) paragraph-start)
   ;;   (set (make-local-variable 'page-delimiter) "--- [^\t]+\t")
   ;; compile support
+  (set (make-local-variable 'next-error-function) 'diff-next-error)
 
   (when (and (> (point-max) (point-min)) diff-default-read-only)
     (toggle-read-only t))
@@ -936,7 +937,7 @@ a diff with \\[diff-reverse-direction]."
     (add-hook 'view-mode-hook
              `(lambda ()
                 (setq minor-mode-overriding-map-alist
-                      (delq ,ro-bind minor-mode-overriding-map-alist)))
+                      (delq ',ro-bind minor-mode-overriding-map-alist)))
              nil t))
   ;; add-log support
   (set (make-local-variable 'add-log-current-defun-function)
@@ -975,7 +976,7 @@ a diff with \\[diff-reverse-direction]."
   "Turn context diffs into unified diffs if applicable."
   (if (save-excursion
        (goto-char (point-min))
-       (looking-at "\\*\\*\\* "))
+       (and (looking-at diff-hunk-header-re) (eq (char-after) ?*)))
       (let ((mod (buffer-modified-p)))
        (unwind-protect
            (diff-context->unified (point-min) (point-max))
@@ -1223,16 +1224,19 @@ With a prefix argument, try to REVERSE the hunk."
     (diff-hunk-status-msg line-offset (diff-xor reverse switched) t)))
 
 
-(defun diff-goto-source (&optional other-file)
+(defalias 'diff-mouse-goto-source 'diff-goto-source)
+
+(defun diff-goto-source (&optional other-file event)
   "Jump to the corresponding source line.
 `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."
-  (interactive "P")
+  (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).
   ;; This is a convenient detail when using smerge-diff.
+  (if event (posn-set-point (event-end event)))
   (let ((rev (not (save-excursion (beginning-of-line) (looking-at "[-<]")))))
     (destructuring-bind (buf line-offset pos src dst &optional switched)
        (diff-find-source-location other-file rev)
@@ -1244,9 +1248,12 @@ If the prefix arg is bigger than 8 (for example with \\[universal-argument] \\[u
 (defun diff-current-defun ()
   "Find the name of function at point.
 For use in `add-log-current-defun-function'."
-  (destructuring-bind (buf line-offset pos src dst &optional switched)
-      (diff-find-source-location)
-    (save-excursion
+  (save-excursion
+    (when (looking-at diff-hunk-header-re)
+      (forward-line 1)
+      (while (and (looking-at " ") (not (zerop (forward-line 1))))))
+    (destructuring-bind (buf line-offset pos src dst &optional switched)
+       (diff-find-source-location)
       (beginning-of-line)
       (or (when (memq (char-after) '(?< ?-))
            ;; Cursor is pointing at removed text.  This could be a removed