branch: elpa/magit
commit 085baa2ac96df90bdb2a1bedd3598df19919d731
Author: Jonas Bernoulli <[email protected]>
Commit: Jonas Bernoulli <[email protected]>
magit-{previous,next}-reference: New commands
Closes #5308.
---
CHANGELOG | 4 ++++
lisp/magit-log.el | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
lisp/magit-mode.el | 1 +
3 files changed, 58 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index 0369e9ca5f..bf6b6b040f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,6 +4,10 @@
- Added new option ~magit-format-file-function,~ and two functions to
optionally prefix file names with icons, with the help of either
~all-the-icons~ or ~nerd-icons~. #5308
+
+- Added new commands ~magit-previous-reference~ and ~magit-next-reference~,
+ with entry point ~C-c C-r~. Enable ~repeat-mode~ to keep navigating with
+ ~p~ and ~n~. #5310
Bugfixes:
diff --git a/lisp/magit-log.el b/lisp/magit-log.el
index bb23609aaf..13bb65d2a6 100644
--- a/lisp/magit-log.el
+++ b/lisp/magit-log.el
@@ -1008,6 +1008,59 @@ of the current repository first; creating it if
necessary."
(transient-args 'magit-shortlog)))
(magit-git-shortlog rev-or-range args))
+;;;; Movement Commands
+
+(defvar magit-reference-movement-faces
+ '(magit-tag
+ magit-branch-remote
+ magit-branch-remote-head
+ magit-branch-local
+ magit-branch-current
+ magit-branch-upstream
+ magit-branch-warning
+ magit-head
+ magit-refname
+ magit-refname-stash
+ magit-refname-wip
+ magit-refname-pullreq))
+
+(defvar-keymap magit-reference-navigation-repeat-map
+ :repeat t
+ "p" #'magit-previous-reference
+ "n" #'magit-next-reference
+ "r" #'magit-next-reference)
+
+(defun magit-previous-reference ()
+ "Move to the previous Git reference appearing in the current buffer.
+
+Move to the previous location that uses a face appearing in
+`magit-reference-movement-faces'. If `repeat-mode' is enabled,
+this command and its counterpart can be repeated using \
+\\<magit-reference-navigation-repeat-map>\
+\\[magit-previous-reference] and \\[magit-next-reference]."
+ (interactive)
+ (magit-next-reference t))
+
+(defun magit-next-reference (&optional previous)
+ "Move to the next Git reference appearing in the current buffer.
+
+Move to the previous location that uses a face appearing in
+`magit-reference-movement-faces'. If `repeat-mode' is enabled,
+this command and its counterpart can be repeated using \
+\\<magit-reference-navigation-repeat-map>\
+\\[magit-previous-reference] and \\[magit-next-reference]."
+ (interactive)
+ (catch 'found
+ (let ((pos (point)))
+ (while (and (not (eobp))
+ (setq pos (if previous
+ (previous-single-property-change pos 'face)
+ (next-single-property-change pos 'face))))
+ (when (cl-intersection (ensure-list (get-text-property pos 'face))
+ magit-reference-movement-faces)
+ (throw 'found (goto-char pos))))
+ (message "No more references"))))
+
;;; Log Mode
(defvar magit-log-disable-graph-hack-args
diff --git a/lisp/magit-mode.el b/lisp/magit-mode.el
index a980c44edc..b79084280d 100644
--- a/lisp/magit-mode.el
+++ b/lisp/magit-mode.el
@@ -419,6 +419,7 @@ recommended value."
"!" 'magit-run
">" 'magit-sparse-checkout
"C-c C-c" 'magit-dispatch
+ "C-c C-r" 'magit-next-reference
"C-c C-e" 'magit-edit-thing
"C-c C-o" 'magit-browse-thing
"C-c C-w" 'magit-copy-thing