unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#54133: 29.0.50; Buffer-menu-visit-tags-table disrupts non-tags buffers
@ 2022-02-23 21:37 Bob Rogers
  2022-02-24  9:19 ` martin rudalics
  2022-02-24 15:15 ` Eli Zaretskii
  0 siblings, 2 replies; 7+ messages in thread
From: Bob Rogers @ 2022-02-23 21:37 UTC (permalink / raw)
  To: 54133

[-- Attachment #1: message body text --]
[-- Type: text/plain, Size: 1918 bytes --]

In GNU Emacs 29.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.20, cairo version 1.16.0)
 of 2022-02-19 built on orion
Repository revision: 563bb08c5998f82e034a0aa1b48dce29fb9bc375
Repository branch: rgr-smtpmail-env-from
Windowing system distributor 'The X.Org Foundation', version 11.0.12003000
System Description: openSUSE Leap 15.3

Configured using:
 'configure --with-dbus=no --with-gsettings=no --with-gif=ifavailable
 --with-tiff=no --with-gnutls=yes --with-gconf=no'

Configured features:
ACL CAIRO FREETYPE GIF GLIB GMP GNUTLS HARFBUZZ JPEG LIBSELINUX LIBXML2
MODULES NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND SQLITE3 THREADS
TOOLKIT_SCROLL_BARS X11 XDBE XIM XPM GTK3 ZLIB

To reproduce:

   In master ecaedf2117cb015ad4028e4d6fc7058608c98096:

   1.  "emacs -Q &"

   2.  Visit pretty much any random file that is NOT a tags file; for
this purpose, lisp/abbrev.el from the source tree will do nicely.

   3.  Type "C-x C-b" to get the "*Buffer List*" window to appear.

   4.  Type "C-x o" to move the to the buffer list, then move to the
abbrev.el line, and type "t" to invoke Buffer-menu-visit-tags-table on
it (which I seem to do accidentally more often than I care to admit).
This produces the error message:

	user-error: File /scratch/rogers/emacs/lisp/abbrev.el is not a valid tags table

but the abbrev.el buffer is left in tags-table-mode, and any undo
information is thrown away.

   The attached patch addresses the problem in a straightforward way by
making Buffer-menu-visit-tags-table prompt the user for buffers not
already in tags-table-mode.

   The real problem is that visit-tags-table assumes that the user knows
what they're doing, and makes these irreversible changes before being
sure of having a valid tags table.  That would be a harder thing to fix,
though -- and might not deal as well with my buffer-menu typos.  ;-}

					-- Bob Rogers
					   http://www.rgrjr.com/


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-patch, Size: 1780 bytes --]

From 05d2d1855cddc8d5c310d718c07d91ae861b8436 Mon Sep 17 00:00:00 2001
From: Bob Rogers <rogers@rgrjr.com>
Date: Wed, 23 Feb 2022 16:23:17 -0500
Subject: [PATCH] Make Buffer-menu-visit-tags-table more circumspect

* lisp/buff-menu.el:
   + (Buffer-menu-visit-tags-table):  Ask before visit-tags-table on a
     buffer not already in tags-table-mode, lest it destroy state.
---
 lisp/buff-menu.el | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el
index 50c2c155ca..0bed539008 100644
--- a/lisp/buff-menu.el
+++ b/lisp/buff-menu.el
@@ -530,10 +530,21 @@ Buffer-menu-multi-occur
 (defun Buffer-menu-visit-tags-table ()
   "Visit the tags table in the buffer on this line.  See `visit-tags-table'."
   (interactive nil Buffer-menu-mode)
-  (let ((file (buffer-file-name (Buffer-menu-buffer t))))
-    (if file
-	(visit-tags-table file)
-      (error "Specified buffer has no file"))))
+  (let* ((buffer (Buffer-menu-buffer t))
+         (file (buffer-file-name buffer)))
+    (or file
+        (error "Specified buffer has no file"))
+    ;; Ensure that it's really a tags file buffer (or the user at
+    ;; least believes it should be).  Otherwise, visit-tags-table will
+    ;; change the mode and discard any undo information.
+    (if (not (or (eq (with-current-buffer buffer
+                       major-mode)
+                     'tags-table-mode)
+                 (yes-or-no-p
+                  (format "%s is not a tags table; visit as such anyway? "
+                          buffer))))
+        (error "Aborted."))
+    (visit-tags-table file)))
 
 (defun Buffer-menu-1-window ()
   "Select this line's buffer, alone, in full frame."
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* bug#54133: 29.0.50; Buffer-menu-visit-tags-table disrupts non-tags buffers
  2022-02-23 21:37 bug#54133: 29.0.50; Buffer-menu-visit-tags-table disrupts non-tags buffers Bob Rogers
@ 2022-02-24  9:19 ` martin rudalics
  2022-02-24 15:15 ` Eli Zaretskii
  1 sibling, 0 replies; 7+ messages in thread
From: martin rudalics @ 2022-02-24  9:19 UTC (permalink / raw)
  To: Bob Rogers, 54133

 >     The real problem is that visit-tags-table assumes that the user knows
 > what they're doing, and makes these irreversible changes before being
 > sure of having a valid tags table.  That would be a harder thing to fix,
 > though -- and might not deal as well with my buffer-menu typos.  ;-}

IIUC the problem is that ‘tags-verify-table' calls 'tags-table-mode'
first and 'verify-tags-table-function' afterwards.

martin





^ permalink raw reply	[flat|nested] 7+ messages in thread

* bug#54133: 29.0.50; Buffer-menu-visit-tags-table disrupts non-tags buffers
  2022-02-23 21:37 bug#54133: 29.0.50; Buffer-menu-visit-tags-table disrupts non-tags buffers Bob Rogers
  2022-02-24  9:19 ` martin rudalics
@ 2022-02-24 15:15 ` Eli Zaretskii
  2022-02-24 17:30   ` Bob Rogers
  1 sibling, 1 reply; 7+ messages in thread
From: Eli Zaretskii @ 2022-02-24 15:15 UTC (permalink / raw)
  To: Bob Rogers; +Cc: 54133

> From: Bob Rogers <rogers@rgrjr.com>
> Date: Wed, 23 Feb 2022 16:37:11 -0500
> 
>    1.  "emacs -Q &"
> 
>    2.  Visit pretty much any random file that is NOT a tags file; for
> this purpose, lisp/abbrev.el from the source tree will do nicely.
> 
>    3.  Type "C-x C-b" to get the "*Buffer List*" window to appear.
> 
>    4.  Type "C-x o" to move the to the buffer list, then move to the
> abbrev.el line, and type "t" to invoke Buffer-menu-visit-tags-table on
> it (which I seem to do accidentally more often than I care to admit).
> This produces the error message:
> 
> 	user-error: File /scratch/rogers/emacs/lisp/abbrev.el is not a valid tags table
> 
> but the abbrev.el buffer is left in tags-table-mode, and any undo
> information is thrown away.
> 
>    The attached patch addresses the problem in a straightforward way by
> making Buffer-menu-visit-tags-table prompt the user for buffers not
> already in tags-table-mode.
> 
>    The real problem is that visit-tags-table assumes that the user knows
> what they're doing, and makes these irreversible changes before being
> sure of having a valid tags table.  That would be a harder thing to fix,
> though -- and might not deal as well with my buffer-menu typos.  ;-}

Does the alternative patch below give good results?

diff --git a/lisp/buff-menu.el b/lisp/buff-menu.el
index 50c2c15..179cc54 100644
--- a/lisp/buff-menu.el
+++ b/lisp/buff-menu.el
@@ -527,13 +527,18 @@ Buffer-menu-multi-occur
   (multi-occur (Buffer-menu-marked-buffers) regexp nlines))
 
 \f
+(autoload 'etags-verify-tags-table "etags")
 (defun Buffer-menu-visit-tags-table ()
   "Visit the tags table in the buffer on this line.  See `visit-tags-table'."
   (interactive nil Buffer-menu-mode)
-  (let ((file (buffer-file-name (Buffer-menu-buffer t))))
-    (if file
-	(visit-tags-table file)
-      (error "Specified buffer has no file"))))
+  (let* ((buf (Buffer-menu-buffer t))
+         (file (buffer-file-name buf)))
+    (cond
+     ((not file) (error "Specified buffer has no file"))
+     ((and buf (with-current-buffer buf
+                 (etags-verify-tags-table)))
+      (visit-tags-table file))
+     (t (error "Specified buffer is not a tags-table")))))
 
 (defun Buffer-menu-1-window ()
   "Select this line's buffer, alone, in full frame."





^ permalink raw reply related	[flat|nested] 7+ messages in thread

* bug#54133: 29.0.50; Buffer-menu-visit-tags-table disrupts non-tags buffers
  2022-02-24 15:15 ` Eli Zaretskii
@ 2022-02-24 17:30   ` Bob Rogers
  2022-02-24 17:42     ` Eli Zaretskii
  0 siblings, 1 reply; 7+ messages in thread
From: Bob Rogers @ 2022-02-24 17:30 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 54133

   From: Eli Zaretskii <eliz@gnu.org>
   Date: Thu, 24 Feb 2022 17:15:54 +0200

   > From: Bob Rogers <rogers@rgrjr.com>
   > Date: Wed, 23 Feb 2022 16:37:11 -0500
   >
   > . . .
   >
   >    The real problem is that visit-tags-table assumes that the user knows
   > what they're doing, and makes these irreversible changes before being
   > sure of having a valid tags table.  That would be a harder thing to fix,
   > though -- and might not deal as well with my buffer-menu typos.  ;-}

   Does the alternative patch below give good results?

This does ineed work, and I had considered something similar, but was
concerned that it would not be as robust.  etags-verify-tags-table is
called from etags-recognize-tags-table, which is only a part of the
tags-table-format-functions extension mechanism used by
initialize-new-tags-table.  So to avoid breaking this mechanism I would
either have had to call initialize-new-tags-table and have it possibly
set unwanted local variables, or delve more deeply into the internals by
running tags-table-format-functions myself.

   In short, I thought checking the major mode was the better choice,
since the file was already present in a buffer.

					-- Bob





^ permalink raw reply	[flat|nested] 7+ messages in thread

* bug#54133: 29.0.50; Buffer-menu-visit-tags-table disrupts non-tags buffers
  2022-02-24 17:30   ` Bob Rogers
@ 2022-02-24 17:42     ` Eli Zaretskii
  2022-02-24 18:02       ` Bob Rogers
  0 siblings, 1 reply; 7+ messages in thread
From: Eli Zaretskii @ 2022-02-24 17:42 UTC (permalink / raw)
  To: Bob Rogers; +Cc: 54133

> From: Bob Rogers <rogers@rgrjr.com>
> Date: Thu, 24 Feb 2022 12:30:53 -0500
> Cc: 54133@debbugs.gnu.org
> 
>    From: Eli Zaretskii <eliz@gnu.org>
>    Date: Thu, 24 Feb 2022 17:15:54 +0200
> 
>    > From: Bob Rogers <rogers@rgrjr.com>
>    > Date: Wed, 23 Feb 2022 16:37:11 -0500
>    >
>    > . . .
>    >
>    >    The real problem is that visit-tags-table assumes that the user knows
>    > what they're doing, and makes these irreversible changes before being
>    > sure of having a valid tags table.  That would be a harder thing to fix,
>    > though -- and might not deal as well with my buffer-menu typos.  ;-}
> 
>    Does the alternative patch below give good results?
> 
> This does ineed work, and I had considered something similar, but was
> concerned that it would not be as robust.  etags-verify-tags-table is
> called from etags-recognize-tags-table, which is only a part of the
> tags-table-format-functions extension mechanism used by
> initialize-new-tags-table.  So to avoid breaking this mechanism I would
> either have had to call initialize-new-tags-table and have it possibly
> set unwanted local variables, or delve more deeply into the internals by
> running tags-table-format-functions myself.

Maybe we should have a more thorough implementation in
etags-verify-tags-table, then.  But that function's purpose is to do
what we need here.

>    In short, I thought checking the major mode was the better choice,
> since the file was already present in a buffer.

But what if the file is already in a buffer, but not under the right
major-mode?  E.g., what if the file was visited literally?





^ permalink raw reply	[flat|nested] 7+ messages in thread

* bug#54133: 29.0.50; Buffer-menu-visit-tags-table disrupts non-tags buffers
  2022-02-24 17:42     ` Eli Zaretskii
@ 2022-02-24 18:02       ` Bob Rogers
  2022-02-24 20:00         ` Eli Zaretskii
  0 siblings, 1 reply; 7+ messages in thread
From: Bob Rogers @ 2022-02-24 18:02 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 54133

   From: Eli Zaretskii <eliz@gnu.org>
   Date: Thu, 24 Feb 2022 19:42:14 +0200

   > From: Bob Rogers <rogers@rgrjr.com>
   > Date: Thu, 24 Feb 2022 12:30:53 -0500
   > 
   > . . .
   > 
   > This does ineed work, and I had considered something similar, but
   > was concerned that it would not be as robust . . .

   Maybe we should have a more thorough implementation in
   etags-verify-tags-table, then.  But that function's purpose is to do
   what we need here.

That would require disentangling detection and initialization.  Which
shouldn't be all that hard; it just seemed like more work than necessary
to scratch this particular itch.

   > In short, I thought checking the major mode was the better choice,
   > since the file was already present in a buffer.

   But what if the file is already in a buffer, but not under the right
   major-mode?  E.g., what if the file was visited literally?

Ah, so you mean that Buffer-menu-visit-tags-table is normally meant to
introduce tags-table-mode in buffers not already there.  I see now that
is implied by "Visit the tags table ..." in the command documentation.
In which case I withdraw my reservations.

   And maybe I'll have a look at cleaning up etags initialization when I
get a chance . . .

					-- Bob





^ permalink raw reply	[flat|nested] 7+ messages in thread

* bug#54133: 29.0.50; Buffer-menu-visit-tags-table disrupts non-tags buffers
  2022-02-24 18:02       ` Bob Rogers
@ 2022-02-24 20:00         ` Eli Zaretskii
  0 siblings, 0 replies; 7+ messages in thread
From: Eli Zaretskii @ 2022-02-24 20:00 UTC (permalink / raw)
  To: Bob Rogers; +Cc: 54133-done

> From: Bob Rogers <rogers@rgrjr.com>
> Date: Thu, 24 Feb 2022 13:02:40 -0500
> CC: 54133@debbugs.gnu.org
> 
>    Maybe we should have a more thorough implementation in
>    etags-verify-tags-table, then.  But that function's purpose is to do
>    what we need here.
> 
> That would require disentangling detection and initialization.  Which
> shouldn't be all that hard; it just seemed like more work than necessary
> to scratch this particular itch.
> 
>    > In short, I thought checking the major mode was the better choice,
>    > since the file was already present in a buffer.
> 
>    But what if the file is already in a buffer, but not under the right
>    major-mode?  E.g., what if the file was visited literally?
> 
> Ah, so you mean that Buffer-menu-visit-tags-table is normally meant to
> introduce tags-table-mode in buffers not already there.  I see now that
> is implied by "Visit the tags table ..." in the command documentation.
> In which case I withdraw my reservations.

Thanks, I installed the changes, and I'm marking this bug done.

>    And maybe I'll have a look at cleaning up etags initialization when I
> get a chance . . .

TIA.





^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2022-02-24 20:00 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-23 21:37 bug#54133: 29.0.50; Buffer-menu-visit-tags-table disrupts non-tags buffers Bob Rogers
2022-02-24  9:19 ` martin rudalics
2022-02-24 15:15 ` Eli Zaretskii
2022-02-24 17:30   ` Bob Rogers
2022-02-24 17:42     ` Eli Zaretskii
2022-02-24 18:02       ` Bob Rogers
2022-02-24 20:00         ` Eli Zaretskii

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).