From 6e0080e755b460adc7a1fda74e26f83cb342b6dc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Mart=C3=ADn?= Date: Mon, 7 Dec 2020 17:01:35 +0100 Subject: [PATCH] Add commands xref-next-group and xref-prev-group * lisp/progmodes/xref.el (xref-next-group): New command that navigates to the first item of the next xref group (typically a file). (xref-prev-group): New command that navigates to the first item of the next xref group (typically a file). (xref--xref-buffer-mode-map): Bound the new commands to 'N' and 'P', respectively. * doc/emacs/maintaining.texi (Xref Commands): Document the new commands in the Emacs manual. * etc/NEWS: Announce them (bug#45089). --- doc/emacs/maintaining.texi | 10 ++++++++++ etc/NEWS | 5 +++++ lisp/progmodes/xref.el | 21 +++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/doc/emacs/maintaining.texi b/doc/emacs/maintaining.texi index 1f10b68b8a7..aa4513e3175 100644 --- a/doc/emacs/maintaining.texi +++ b/doc/emacs/maintaining.texi @@ -2199,12 +2199,22 @@ Display the reference on the current line. Move to the next reference and display it in the other window (@code{xref-next-line}). +@item N +@findex xref-next-group +Move to the first reference of the next reference group and display it +in the other window (@code{xref-next-group}). + @item p @itemx , @findex xref-prev-line Move to the previous reference and display it in the other window (@code{xref-prev-line}). +@item P +@findex xref-prev-group +Move to the first reference of the previous reference group and +display it in the other window (@code{xref-prev-group}). + @item C-o @findex xref-show-location-at-point Display the reference on the current line in the other window diff --git a/etc/NEWS b/etc/NEWS index 49d66cc449e..c80325cb240 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -1205,6 +1205,11 @@ So far Grep and ripgrep are supported. ripgrep seems to offer better performance in certain cases, in particular for case-insensitive searches. ++++ +*** New commands 'xref-prev-group' and 'xref-next-group'. +These commands are bound respectively to 'P' and 'N', and navigate to +the first item of the previous or next group in the "*xref*" buffer. + ** json.el --- diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el index 9f5fc57142b..389b7cf2478 100644 --- a/lisp/progmodes/xref.el +++ b/lisp/progmodes/xref.el @@ -593,6 +593,25 @@ SELECT is `quit', also quit the *xref* window." (xref--search-property 'xref-item t) (xref-show-location-at-point)) +(defun xref-next-group () + "Move to the first item of the next xref group and display its source." + (interactive) + (xref--search-property 'xref-group) + (xref--search-property 'xref-item) + (xref-show-location-at-point)) + +(defun xref-prev-group () + "Move to the first item of the previous xref group and display its source." + (interactive) + ;; Search for the xref group of the current item, provided that the + ;; point is not already in an xref group. + (unless (plist-member (text-properties-at (point)) 'xref-group) + (xref--search-property 'xref-group t)) + ;; Search for the previous xref group. + (xref--search-property 'xref-group t) + (xref--search-property 'xref-item) + (xref-show-location-at-point)) + (defun xref--item-at-point () (save-excursion (back-to-indentation) @@ -738,6 +757,8 @@ references displayed in the current *xref* buffer." (let ((map (make-sparse-keymap))) (define-key map (kbd "n") #'xref-next-line) (define-key map (kbd "p") #'xref-prev-line) + (define-key map (kbd "N") #'xref-next-group) + (define-key map (kbd "P") #'xref-prev-group) (define-key map (kbd "r") #'xref-query-replace-in-results) (define-key map (kbd "RET") #'xref-goto-xref) (define-key map (kbd "TAB") #'xref-quit-and-goto-xref) -- 2.39.2