Subject: Re: bug#12671: 24.2.50; diff-kill-hunk with diff-auto-refine-mode jumps to beginning

From: Stefan Monnier <[email-masked]>
Date: Tue, 23 Oct 2012 14:44:36 -0400

> In diff mode killing a hunk with diff-auto-refine-mode on will jump to the
> beginning of the file-bounds.  This is because `diff-hunk-kill' calls
> `diff-hunk-next' when it's getting the file bounds.  The call to
> `diff-hunk-next' schedules a timer which moves the point to where it was
> when `diff-hunk-next' was called, namely the first hunk of the file.

That was a bug in the timer, indeed.
I installed the patch below which should fix it.

> I'm not sure the best way to fix it, but the patch below is probably the
> easiest.
[...]
> -  (let* ((hunk-bounds (diff-bounds-of-hunk))
> +  (let* ((diff-auto-refine-mode nil)
> +	 (hunk-bounds (diff-bounds-of-hunk))

The auto-refine behavior is definitely suboptimal (it should rather
than triggered by jit-lock, ideally), but I'd rather not disable it
around problematic uses, at last as long as those problematic uses can
be fixed some other way.

        Stefan

=== modified file 'lisp/vc/diff-mode.el'
--- lisp/vc/diff-mode.el	2012-10-02 03:49:28 +0000
+++ lisp/vc/diff-mode.el	2012-10-23 18:37:16 +0000
@@ -581,8 +581,9 @@
                       (with-local-quit
                         (when (buffer-live-p buffer)
                           (with-current-buffer buffer
+                            (save-excursion
                             (goto-char point)
-                            (diff-refine-hunk))))))))))
+                              (diff-refine-hunk)))))))))))
 
 (easy-mmode-define-navigation
  diff-file diff-file-header-re "file" diff-end-of-file)