From: Dmitry Gutov Date: Sun, 2 Mar 2025 03:22:56 +0000 (+0200) Subject: Fix the use of xref-window-local-history together with Xref buffer X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=ccf9990e1619fd52c86e828182f7a04b7a3fe9e6;p=emacs.git Fix the use of xref-window-local-history together with Xref buffer * lisp/progmodes/xref.el (xref--push-markers): Temporarily restore the selected window as well, using the value from the new argument (bug#76565). Update both callers. (cherry picked from commit 625ed68aeaadce4df7bdfd8c08ddfc8ed4f9b01a) --- diff --git a/lisp/progmodes/xref.el b/lisp/progmodes/xref.el index 9aaa119c023..e7f5b2dad46 100644 --- a/lisp/progmodes/xref.el +++ b/lisp/progmodes/xref.el @@ -1624,31 +1624,40 @@ The meanings of both arguments are the same as documented in xrefs (setq xrefs 'called-already))))))) (let ((cb (current-buffer)) - (pt (point))) + (pt (point)) + (win (selected-window))) (prog1 (funcall xref-show-xrefs-function fetcher - `((window . ,(selected-window)) + `((window . ,win) (display-action . ,display-action) (auto-jump . ,xref-auto-jump-to-first-xref))) - (xref--push-markers cb pt)))) + (xref--push-markers cb pt win)))) (defun xref--show-defs (xrefs display-action) (let ((cb (current-buffer)) - (pt (point))) + (pt (point)) + (win (selected-window))) (prog1 (funcall xref-show-definitions-function xrefs - `((window . ,(selected-window)) + `((window . ,win) (display-action . ,display-action) (auto-jump . ,xref-auto-jump-to-first-definition))) - (xref--push-markers cb pt)))) + (xref--push-markers cb pt win)))) -(defun xref--push-markers (buf pt) +(defun xref--push-markers (buf pt win) (when (buffer-live-p buf) - (save-excursion - (with-no-warnings (set-buffer buf)) - (goto-char pt) - (unless (region-active-p) (push-mark nil t)) - (xref-push-marker-stack)))) + ;; This was we support the `xref-history-storage' getter which + ;; depends on the selected window. This is getting pretty complex, + ;; though. The alternative approach to try would be to push early + ;; but undo the stack insertion and mark-pushing in error handler. + (save-window-excursion + (when (window-live-p win) + (select-window win)) + (save-excursion + (with-no-warnings (set-buffer buf)) + (goto-char pt) + (unless (region-active-p) (push-mark nil t)) + (xref-push-marker-stack))))) (defun xref--prompt-p (command) (or (eq xref-prompt-for-identifier t)