Subject: bug#67687: Feature request: automatic tags management

From: Dmitry Gutov <[email-masked]>
Date: Mon, 1 Jan 2024 20:48:37 +0200

On 01/01/2024 19:39, Eli Zaretskii wrote:
>> Date: Mon, 1 Jan 2024 19:23:28 +0200
>> Cc: [email-masked], [email-masked], [email-masked],
>>   [email-masked]
>> From: Dmitry Gutov <[email-masked]>
>>
>> On 01/01/2024 18:50, Eli Zaretskii wrote:
>>>> +The exception is made when the user has already selected a tags
>>>> +table manually (for example, using \\[visit-tags-table]).  Then
>>>> +this mode doesn't do anything.  Reset the visited tags tables
>>>> +using \\[tags-reset-tags-tables]."
>>>
>>> The above is only true for the project whose TAGS was manually
>>> visited, right?  IOW, it's not that once the use invokes
>>> visit-tags-table once, this mode will be effectively disabled for the
>>> entire session, right?
>>
>> No, it's the latter. It's off for the whole session, just like a visited
>> TAGS file is active for the whole session (not limited to any specific
>> project).
> 
> OK, then please tweak my suggested text to explain the situation
> correctly instead.

How about this?

If you select a tags table manually (for example, using
\\[visit-tags-table]), then this mode will be effectively
disabled for the entire session.  Use \\[tags-reset-tags-tables]
to countermand the effect of a previous \\[visit-tags-table].

>> a tags file, in general, can't always be attributed to a specific
>> project.
> 
> That's too bad, IMO, but it's a separate issue.  One of the annoyances
> I had with tags was that it was difficult to have several independent
> tags tables loaded, each one for a different set of sources.  I hoped
> that project.el has solved this already, but I guess we are not there
> yet.

etags-regen-mode kind of solves that, by checking and resynchronizing 
tags tables when you switch between projects. That works when a tags 
file already exists with the recognized name in that other project (e.g. 
because you worked on it just recently).

Projectile has a different solution using local tags tables, which is 
easy to adapt to project.el:

(defun project-visit-tags ()
   (let* ((pr (project-current))
          (tags-file (and pr
                          (expand-file-name "TAGS" (project-root pr)))))
     (and tags-file
          (file-exists-p tags-file)
          (visit-tags-table tags-file t))))

(add-hook 'find-file-hook #'project-visit-tags)

And if you limit the above to only certain projects (by e.g. checking 
for some additional file in the directory), then etags-regen-mode should 
stay active in the other projects, because it won't see the buffer-local 
bindings for tags-file-name and tags-table-list (the above snippet keeps 
the global value nil).

The buffer-local tag tables are not that well-tested overall (e.g. even 
tags-reset-tags-tables resets the local binding, if available, rather 
than the global one), but this combination should work in a personal config.