[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
default),
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
vars.
Sounds like an unnecessary complication.