bug-gnu-emacs
[Top][All Lists]
Advanced

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

bug#28407: 26.0.50; xref should use imenu


From: Dmitry Gutov
Subject: bug#28407: 26.0.50; xref should use imenu
Date: Mon, 30 May 2022 01:13:18 +0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1

Hi Visuwesh,

On 16.05.2022 09:59, Visuwesh wrote:
[ஞாயிறு மே 15, 2022] Visuwesh wrote:

[திங்கள் செப்டம்பர் 11, 2017] Dmitry Gutov wrote:

On 9/10/17 7:23 PM, Tom Tromey wrote:
It would be nice if imenu were a back end for xref.
Then M-. could also use symbols found by imenu.
A further wrinkle on this would be if xref, project, and imenu
worked
together, so that M-. would automatically know to look at imenu results
for other buffers in the same project.

Agreed. It could be a nice default for when no tags table is currently
visited.

I tried to write a general imenu backend in attached file (extracted
from my init.el) but I hit quite a few roadblocks,

   1. I activate the imenu backend iff there are no tags table defined
      for the buffer but this means that one cannot use the imenu
      backend to jump to definitions for symbols that TAGS do not know
      of currently.  I can think of two ways to solve this problem,

      (a) Check if the symbol is in TAGS table.
      (b) Modify the etags backend so that the user can say "I have no
      TAGS table for this file/project/whatever."

      (a) is definitely not clean, and (b) sounds feasible but similar
      situation can also exist with other backends (like elisp).

      I'm lost on how to solve this problem.

   2. I have not defined all the methods and the completion-table does
      not handle the nested case of the index alist.  AFAIU from `(elisp)
      Programmed Completion', completion "ends" when `try-completion'
      returns t but I seem to be mistaken.  I have to rewrite
      completion-table to be like `imenu--completion-buffer' but I don't
      know how to pull that off.

   3. `imenu-xref--in-alist' is mostly a 1-1 copy of `imenu--in-alist'
      with the only difference being my function returns all matches of
      the symbol instead of just the first one.  This should be easy
      enough to fix by adding an optional argument INCLUDE-ALL to
      `imenu--in-alist'.

I'm testing in python-mode with the following settings,

     (setq imenu-name-lookup-function (lambda (symbol item) (string-prefix-p 
symbol item))
           python-imenu-format-parent-item-jump-label-function (lambda (_ name) 
name))

I solved (2) by using an affixation function.  I did (3) as well, and
I'm attaching my work as a patch against imenu.el.

(1) sounds reasonable because the reference might easily be in another file. If you wanted to add extra customizations (for the user to be able to indicated things like "use imenu for xref in these files"), maybe add it to this backend's options. As long as it comes before etags in xref-backend-functions, it should have all the power. Another possible direction for its development would be to always try to combine the locations coming from both etags and imenu (in the current file).

I would leave that to a later revision, though. Some testing for performance regressions in large projects would be nice too.

(2) Could you try to explain the problem that you were solving here? affixation-function is normally about how the completions look (I think). Would 'completion-table-with-predicate' help? Or maybe you just need to pre-process the nested structure into a "flat" completion table first.





reply via email to

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