]> git.eshelyaron.com Git - emacs.git/commitdiff
Move to start of current header in diff-{file,hunk}-prev
authorSpencer Baugh <sbaugh@janestreet.com>
Tue, 10 Sep 2024 18:18:39 +0000 (14:18 -0400)
committerEshel Yaron <me@eshelyaron.com>
Fri, 27 Sep 2024 10:24:01 +0000 (12:24 +0200)
If point was after a file or hunk header, the diff-file-prev and
diff-hunk-prev commands would move to the start of that header.
But if point was *within* the header, they would not move, and
would report "No previous file" or "No previous hunk".  This
differs from the behavior of most other movement commands,
e.g. backward-sexp or backward-sentence.

This commit fixes diff-file-prev and diff-hunk-prev, as well as
other easy-mmode-define-navigation BASE-prev commands.  Now
these commands move to the start of the containing "thing" just
like other movement commands.

* lisp/emacs-lisp/easy-mmode.el (easy-mmode--prev):
Move to start of current match first. (bug#73172)
* etc/NEWS: Document the behavior change.

(cherry picked from commit e776903b31cf2b2d21d91cbc7d6b7dbc1e9d442f)

etc/NEWS
lisp/emacs-lisp/easy-mmode.el

index 65b7475272a1e22ec89282fd70ca5c7de15d1400..3273c0a24cf814af59a7df7ba2558448fee82f0d 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -335,6 +335,12 @@ hunk), and then removes the hunk from the diffs.
 This is useful to undo or revert changes, committed and uncommitted, when
 you are in buffers generated by 'C-x v =' and 'C-x v D'.
 
+---
+*** diff-file-prev and diff-hunk-prev reliably move to start of header.
+Previously, diff-file-prev and diff-hunk-prev would move when point is
+after the corresponding file or hunk header, but not when inside it.
+Now they will reliably move to the start of the current header.
+
 ** php-ts-mode
 
 ---
index 54c20d20e0d0a2f162eb4eb8c2ae5ed846d20f3a..c05e1f70b9aca103cbda56981993c166a190b097 100644 (file)
@@ -770,6 +770,17 @@ ENDFUN and NARROWFUN are treated like in `easy-mmode-define-navigation'."
   (unless count (setq count 1))
   (if (< count 0) (easy-mmode--next re name (- count) endfun narrowfun)
     (let ((re-narrow (and narrowfun (prog1 (buffer-narrowed-p) (widen)))))
+      ;; If point is inside a match for RE, move to its beginning like
+      ;; `backward-sexp' and other movement commands.
+      (when (and (not (zerop count))
+                 (save-excursion
+                   ;; Make sure we're out of the current match if any.
+                   (goto-char (if (re-search-backward re nil t 1)
+                                  (match-end 0) (point-min)))
+                   (re-search-forward re nil t 1))
+                 (< (match-beginning 0) (point) (match-end 0)))
+        (goto-char (match-beginning 0))
+        (setq count (1- count)))
       (unless (re-search-backward re nil t count)
         (user-error "No previous %s" name))
       (when re-narrow (funcall narrowfun)))))