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

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

bug#67687: Feature request: automatic tags management


From: Dmitry Gutov
Subject: bug#67687: Feature request: automatic tags management
Date: Mon, 1 Jan 2024 20:48:37 +0200
User-agent: Mozilla Thunderbird

On 01/01/2024 19:39, Eli Zaretskii wrote:
Date: Mon, 1 Jan 2024 19:23:28 +0200
Cc: stefankangas@gmail.com, eskinjp@gmail.com, 67687@debbugs.gnu.org,
  michael.albinus@gmx.de
From: Dmitry Gutov <dmitry@gutov.dev>

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.





reply via email to

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