Hi Keita and Arash, Apologies for the delay -- you were quite right that replicating `find-tag' using `xref' commands wasn't straightforward. I also found that `bib-find-next' was a little unreliable as it stood, so I'm hoping that the patch I'm attaching will be more robust.
There have been fairly extensive changes made to `etags' itself in v31, so I think that version will work best, but I did test also with v30 and I couldn't see any obvious problems. (I had to customize `bib-etags-command' and `bib-etags-append-command' to run v31 with an emacs from the repo.) Let me know what you think, and All best, David.
>From 377cdad78b216bd71f14c3d65307b42607bd622b Mon Sep 17 00:00:00 2001 From: David Fussner <[email protected]> Date: Sat, 13 Jun 2026 15:36:00 +0100 Subject: [PATCH] Modify `bib-find-next' to use xref commands * bib-cite.el (bib-cite--next-ref): New helper function to replicate the behavior of the obsolete `find-tag'. (bib-find-next): Replace `find-tag' with previous. --- bib-cite.el | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/bib-cite.el b/bib-cite.el index ebcfbe63..b1635690 100644 --- a/bib-cite.el +++ b/bib-cite.el @@ -593,6 +593,8 @@ (declare-function reftex-view-crossref "ext:reftex-dcr" (&optional arg auto-how fail-quietly)) (declare-function outline-show-entry "ext:outline" ()) +(declare-function xref-quit-and-pop-marker-stack "xref" ()) +(declare-function xref-quit-and-goto-xref "xref" ()) (defgroup bib-cite nil "bib-cite, LaTeX minor-mode to display \\cite, \\ref and \\label commands." @@ -931,6 +933,74 @@ A TAGS file is created and used for multi-file documents under auctex." (defvar bib-cite-search-ring nil "Bib-cite intenal variable to hold last \\ref or \\eqref find.") +(defun bib-cite--next-ref (str &optional bkwd) + (if str + (let* (notag + (lino (concat (number-to-string (line-number-at-pos nil t)) ":")) + (file (buffer-file-name)) + (tag (substring-no-properties str)) + (xrtag (seq-subseq tag (1+ (seq-position tag ?{)) + (seq-position tag ?}))) + (re (concat bib-ref-regexpc xrtag "}")) + (buf (xref-find-apropos xrtag))) + (if bkwd + (with-current-buffer buf + (search-forward file nil t) + (re-search-forward "^[^[:digit:][:space:][:cntrl:]]" nil 1) + (beginning-of-line) + (condition-case nil + (search-backward lino) + (error (progn + (while + (and + (re-search-backward + (concat + "\\(?1:^[^[:digit:][:space:][:cntrl:]]\\)\\|" + "^[[:space:]]*\\(?1:[[:digit:]]+:\\)") + nil 1) + (string-match + "[[:digit:]]+:" + (match-string-no-properties 1) nil t) + (setq notag t) + (string-version-lessp + lino (match-string-no-properties 1)) + (setq notag 1))) + (end-of-line)))) + (unless (or (re-search-backward re nil 1) (eq notag t) (bobp)) + (forward-line -1)) + (condition-case nil + (xref-quit-and-goto-xref) + (user-error (progn + (xref-quit-and-pop-marker-stack) + (message "No previous occurrence of %s" re))))) + (with-current-buffer buf + (search-forward file nil t) + (condition-case nil + (search-forward lino) + (error (progn + (setq notag t) + (while + (and + (re-search-forward + (concat + "\\(?1:^[^[:digit:][:space:][:cntrl:]]\\)\\|" + "^[[:space:]]*\\(?1:[[:digit:]]+:\\)") + nil 1) + (string-match + "[[:digit:]]+:" + (match-string-no-properties 1) nil t) + (string-version-lessp + (match-string-no-properties 1) lino)))))) + (unless notag + (forward-line)) + (re-search-forward re nil 1) + (condition-case nil + (xref-quit-and-goto-xref) + (user-error (progn + (xref-quit-and-pop-marker-stack) + (message "No next occurrence of %s" re))))))) + (message "Sorry, no previous reference to find. Use bib-find?"))) + (defun bib-find-next (&optional prev-p) "Find next occurrence of a \\ref or \\eqref. This is made necessary because we now use a regexp to find tags in multi-file @@ -938,9 +1008,7 @@ documents, and the Emacs command `find-tag' doesn't allow to interactively find the next occurrence of a regexp." (interactive "P") (if (bib-master-file) ;Multi-file document - ;; FIXME: `find-tag' is replaced by `xref-find-definitions' in - ;; Emacs 25.1. AUCTeX should track this change, sometime ... - (find-tag t (if prev-p '- t) t) + (bib-cite--next-ref (if (boundp 'last-tag) last-tag nil) prev-p) (if bib-cite-search-ring ;;FIXME: Should first make sure I move off initial \ref{}. (let ((regexp (concat bib-ref-regexpc bib-cite-search-ring "}"))) -- 2.53.0
Ikumi Keita <[email protected]> writes: > Hi Arash and David, > >>>>>> Arash Esbati <[email protected]> writes: >> Thanks for raising this. You're right, AUCTeX doesn't care about >> `tex-common-initialization', so adding the form above to: > >> (define-derived-mode TeX-mode text-mode "TeX" ...) > >> is TRT. > >> @Keita: WDYT? > > I agree. > >> While we're at it: When compiling AUCTeX, I get: > >> In bib-find-next: >> bib-cite.el:943:8: Warning: ‘find-tag’ is an obsolete function (as of >> 25.1); use ‘xref-find-definitions’ instead. > >> Is there a chance that we can fix this as well? Can `find-tag' be >> replaced with `xref-find-definitions' once the addition above is done? >> I admit I'm not that much into xref-business, so I'd appreciate your >> help here. > > As we (I and Arash) discussed earlier, the signatures of `find-tag' and > `xref-find-definitions' differ much. So I don't expect that such simple > replacement would work 😿 > > Ikumi Keita > #StandWithUkraine #StopWarInUkraine > #Gaza #StopGenocide #CeasefireNOW > #IProtestAgainstTrumpAndNetanyahu'sAttackOnIran,WhichViolatesInternationalLaw
