diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el index fb6c9dad73b..1ff02d3712a 100644 --- a/lisp/progmodes/xref.el +++ b/lisp/progmodes/xref.el @@ -1017,7 +1017,9 @@ xref--xref-buffer-mode (lambda (&optional bound move backward looking-at) (outline-search-text-property 'xref-group nil bound move backward looking-at))) - (setq-local outline-level (lambda () 1))) + (setq-local outline-level (lambda () 1)) + (add-hook 'revert-buffer-restore-functions + #'xref-revert-buffer-restore-point nil t)) (defvar xref--transient-buffer-mode-map (let ((map (make-sparse-keymap))) @@ -1282,19 +1284,19 @@ xref-revert-buffer (when (boundp 'revert-buffer-restore-functions) (run-hook-wrapped 'revert-buffer-restore-functions (lambda (f) (push (funcall f) restore-functions) nil))) - (save-excursion - (condition-case err - (let ((alist (xref--analyze (funcall xref--fetcher))) - (inhibit-modification-hooks t)) - (erase-buffer) - (prog1 (xref--insert-xrefs alist) - (mapc #'funcall (delq nil restore-functions)))) - (user-error - (erase-buffer) - (insert - (propertize - (error-message-string err) - 'face 'error))))))) + (condition-case err + (let ((alist (xref--analyze (funcall xref--fetcher))) + (inhibit-modification-hooks t)) + (erase-buffer) + (prog1 (xref--insert-xrefs alist) + (goto-char (point-min)) + (mapc #'funcall (delq nil restore-functions)))) + (user-error + (erase-buffer) + (insert + (propertize + (error-message-string err) + 'face 'error)))))) (defun xref--auto-jump-first (buf value) (when value @@ -1309,6 +1311,13 @@ xref--auto-jump-first ((eq value 'move) (forward-line 1)))) +(defun xref-revert-buffer-restore-point () + (let ((current-line (buffer-substring-no-properties (pos-bol) (pos-eol)))) + (lambda () + (goto-char (point-min)) + (when (search-forward current-line) + (goto-char (pos-bol)))))) + (defun xref-show-definitions-buffer (fetcher alist) "Show the definitions list in a regular window.