]> git.eshelyaron.com Git - emacs.git/commitdiff
diff-mode auto-refines only after a successful motion
authorDima Kogan <dima@secretsauce.net>
Tue, 20 Dec 2016 07:23:14 +0000 (23:23 -0800)
committerDima Kogan <dima@secretsauce.net>
Sun, 25 Dec 2016 05:42:02 +0000 (21:42 -0800)
Prior to this patch (if enabled) auto-refinement would kick in after all
hunk navigation commands, even if the motion failed.  This would result
in a situation where the hunk navigation would signal an error and beep,
but yet still accomplish potentially useful work, by auto-refining.
This patch moves the auto-refinement code to only run when a motion was
successful

* lisp/vc/diff-mode.el (diff--internal-hunk-next,
  diff--internal-hunk-prev): Removed auto-refinement-triggering code
* lisp/vc/diff-mode.el (diff--wrap-navigation): Added
  auto-refinement-triggering code

lisp/vc/diff-mode.el

index d74ff2f5c99a11f3eb0f7e09475565e746546ae0..75fd420922aa124b59c6545b2aa7b96c6857a30e 100644 (file)
@@ -551,23 +551,7 @@ next hunk if TRY-HARDER is non-nil; otherwise signal an error."
 
 ;; Define diff-{hunk,file}-{prev,next}
 (easy-mmode-define-navigation
- diff--internal-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))))))))))))
+ diff--internal-hunk diff-hunk-header-re "hunk" diff-end-of-hunk diff-restrict-view)
 
 (easy-mmode-define-navigation
  diff--internal-file diff-file-header-re "file" diff-end-of-file)
@@ -605,7 +589,26 @@ to the NEXT marker."
 
       (when (not (looking-at header-re))
         (goto-char start)
-        (user-error (format "No %s" what))))))
+        (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