@@ -477,6 +477,9 @@ If SELECT is non-nil, select the target window."
477
477
(defvar-local xref--original-window nil
478
478
" The original window this xref buffer was created from." )
479
479
480
+ (defvar-local xref--fetcher nil
481
+ " The original function to call to fetch the list of xrefs." )
482
+
480
483
(defun xref--show-pos-in-buf (pos buf )
481
484
" Goto and display position POS of buffer BUF in a window.
482
485
Honor `xref--original-window-intent' , run `xref-after-jump-hook'
@@ -692,6 +695,7 @@ references displayed in the current *xref* buffer."
692
695
; ; suggested by Johan Claesson "to further reduce finger movement":
693
696
(define-key map (kbd " ." ) #'xref-next-line )
694
697
(define-key map (kbd " ," ) #'xref-prev-line )
698
+ (define-key map (kbd " g" ) #'xref--revert-xref-buffer )
695
699
map))
696
700
697
701
(define-derived-mode xref--xref-buffer-mode special-mode " XREF"
@@ -777,8 +781,9 @@ Return an alist of the form ((FILENAME . (XREF ...)) ...)."
777
781
(xref-location-group (xref-item-location x)))
778
782
#'equal ))
779
783
780
- (defun xref--show-xref-buffer (xrefs alist )
781
- (let ((xref-alist (xref--analyze xrefs)))
784
+ (defun xref--show-xref-buffer (fetcher alist )
785
+ (let* ((xrefs (if (functionp fetcher) (funcall fetcher) fetcher))
786
+ (xref-alist (xref--analyze xrefs)))
782
787
(with-current-buffer (get-buffer-create xref-buffer-name)
783
788
(setq buffer-undo-list nil )
784
789
(let ((inhibit-read-only t )
@@ -790,8 +795,28 @@ Return an alist of the form ((FILENAME . (XREF ...)) ...)."
790
795
(goto-char (point-min ))
791
796
(setq xref--original-window (assoc-default 'window alist)
792
797
xref--original-window-intent (assoc-default 'display-action alist))
798
+ (when (functionp fetcher)
799
+ (setq xref--fetcher fetcher))
793
800
(current-buffer )))))
794
801
802
+ (defun xref--revert-xref-buffer ()
803
+ (interactive )
804
+ (unless xref--fetcher
805
+ (user-error " Reverting not supported" ))
806
+ (let ((inhibit-read-only t )
807
+ (buffer-undo-list t ))
808
+ (save-excursion
809
+ (erase-buffer )
810
+ (condition-case err
811
+ (xref--insert-xrefs
812
+ (xref--analyze (funcall xref--fetcher)))
813
+ (user-error
814
+ (insert
815
+ (propertize
816
+ (error-message-string err)
817
+ 'face 'error ))))
818
+ (goto-char (point-min )))))
819
+
795
820
(defun xref--show-defs-buffer (xrefs alist )
796
821
(cond
797
822
((not (cdr xrefs))
@@ -811,9 +836,9 @@ Return an alist of the form ((FILENAME . (XREF ...)) ...)."
811
836
812
837
(defvar xref--read-pattern-history nil )
813
838
814
- (defun xref--show-xrefs (xrefs display-action )
839
+ (defun xref--show-xrefs (fetcher display-action )
815
840
(xref--push-markers)
816
- (funcall xref-show-xrefs-function xrefs
841
+ (funcall xref-show-xrefs-function fetcher
817
842
`((window . ,(selected-window ))
818
843
(display-action . , display-action ))))
819
844
@@ -860,12 +885,20 @@ Return an alist of the form ((FILENAME . (XREF ...)) ...)."
860
885
; ;; Commands
861
886
862
887
(defun xref--find-xrefs (input kind arg display-action )
863
- (let ((xrefs (funcall (intern (format " xref-backend-%s " kind))
864
- (xref-find-backend )
865
- arg)))
866
- (unless xrefs
867
- (xref--not-found-error kind input))
868
- (xref--show-xrefs xrefs display-action)))
888
+ (let* ((orig-buffer (current-buffer ))
889
+ (orig-position (point ))
890
+ (backend (xref-find-backend ))
891
+ (method (intern (format " xref-backend-%s " kind)))
892
+ (fetcher (lambda ()
893
+ (save-excursion
894
+ (when (buffer-live-p orig-buffer)
895
+ (set-buffer orig-buffer)
896
+ (ignore-errors (goto-char orig-position)))
897
+ (let ((xrefs (funcall method backend arg)))
898
+ (unless xrefs
899
+ (xref--not-found-error kind input))
900
+ xrefs)))))
901
+ (xref--show-xrefs fetcher display-action)))
869
902
870
903
(defun xref--find-definitions (id display-action )
871
904
(let ((xrefs (funcall #'xref-backend-definitions
0 commit comments