[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Allow xref to use other than current major-mode

From: Dmitry Gutov
Subject: Re: Allow xref to use other than current major-mode
Date: Tue, 25 Aug 2015 20:05:55 +0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:40.0) Gecko/20100101 Thunderbird/40.0

On 08/25/2015 06:31 PM, Stephen Leake wrote:

cl-generic.el is preloaded, so we could use a cl-defgeneric, and
dispatch on (mode (eql <major-mode>)).

A given implementation is, of course, free to use cl-defgeneric and dispatch on whatever it wants, internally.

To make such a minor mode work, xref--read-identifier could be a
cl-defgeneric that dispatches on (project <project-type).

The plan is to consolidate the various -function's as generic method, dispatching on a single xref-backend value. I haven't got around to this yet, blocked on find-file-delayed.

But if it also
dispatches on (mode (eql <major-mode>)), each backend would have to
define all combinations; that's a pain.

If a backend needs to dispatch based on the current language, it will. It will do that inside the method implementations.

But many backends will only need to deal with one language, a couple, or won't really need to check the language of the current buffer.

I've started writing such a thing, but it gets defeated by the fact that
xref--read-identifier uses the buffer-local value of
xref-identifier-completion-table-function, which is set by elisp-mode
(or c-mode, etc, or by default to etags). There's no way to change that.

A backend is a combination of xref-find-function, xref-i-c-t-function and xref-i-a-p-function. If a minor mode changes the current backend, it would need to set all these variables (but see the planned change mentioned above).

We could require the user to manually enable an xref minor mode in each
buffer, but that's not friendly.

We have "globalized" minor modes, to be used in similar situations.

I guess a global xref backend could somehow reset that variable, in all
elisp buffers? Maybe a function on elisp-mode-hook.

A minor mode function is indeed normally added to xxx-mode-hook, whether it's by user's hand, or somehow automatically.

So a better approach would be to define a way to disable emacs-lisp-mode
(and all other major-modes) setting the xref buffer-local variables, so
that the user choice of xref backend is respected. That would be much
simpler than having to add a function to all the major mode hooks (most
of which are unknown at load time).

You're speaking from the standpoint of wanting a single, global xref backend everywhere for the duration of the Emacs session.

As previous discussions showed, that approach isn't natural for everyone.

We could define a new global variable xref-global-backend; if nil (the

We've discussed a very similar proposal, very recently. As long as a minor mode can take over major mode's setting anyway, there's no point in adding this kind of explicit override.

major modes can set xref vars; if non-nil, it indicates which
particular global backend is in use. It could be a function that returns
a boolean indicating whether the global backend wants to control xref in
the current buffer. So a semi-global backend could provide C and Ada
xref, but not elisp xref, for example. It could be a list of such
functions; only if all return nil should the major mode set the xref

Sounds like an unnecessary complication.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]