* bug#70938: 30.0.50; Edebug appropriates overriding-terminal-local-map
@ 2024-05-14 13:24 Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-14 19:59 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-14 21:23 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 2 replies; 10+ messages in thread
From: Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-05-14 13:24 UTC (permalink / raw)
To: 70938
While I was edebugging in todo-mode.el (bug#70937) Emacs got into a
state where Edebug kicked in even after I removed the instrumentation
from the code. AFAICT from further debugging, the issue has to do with
the way todo-mode.el uses set-transient-map. To provide a reproducer
that does not involve todo-mode.el I have extracted and simplified the
triggering function from that file and included it in the attached file.
0. emacs -Q -l test-edebug-override-map.el
1. M-x srb-test
2. At the prompt type one of the keys listed between the curly braces,
which removes that group and prompts again; keeping typing till there
is no further prompt, then a message displays the typed keys in the
order they were typed in.
3. Now visit test-edebug-override-map.el and with point in the function
srb-test--next type `C-u C-M-x' to instrument it for Edebug.
4. Type M-s srb-test again and when Edebug stops execution, type `f'
twice to step through the entire function so Edebug releases control.
5. Now with point again in srb-test--next type `C-M-x' to remove the
instrumentation. You can confirm this by repeating steps 1-2 without
Edebug kicking.
6. Now type any of the keys that were listed in the prompt on invoking
srb-test (these keys are the strings in the value of
srb-test--key-groups).
=> This makes Edebug kick in with execution stopped at one of the two
occurrences of the sexp `(setq keys-so-far (concat keys-so-far " "
(funcall this-key)))' in srb-test--next. The same thing happens with
sequences containg one of these keys, e.g. `M-x k'.
I did find a way to prevent Edebug from kicking in: uncomment the lines
in the test file containing "exitfn"; this explicitly deactivates the
transient map when the function returns, but it also makes the function
a noop, so it's no fix for the problem.
After step 4., when I type `C-h b' to show all current key bindings, the
*Help* buffer contains a listing like this:
Overriding Bindings:
Key Binding
c .. d #<interpreted-function AA2>
h #<interpreted-function BAB>
i #<interpreted-function 8CC>
k #<interpreted-function 9AC>
n #<interpreted-function A7F>
p #<interpreted-function 917>
r #<interpreted-function B53>
t #<interpreted-function BD6>
y #<interpreted-function 9F1>
The codes AA2, etc. are links, and clicking on these pops up a *Help
Source* buffer containing elisp code like this:
#[nil
((edebug-enter 'edebug-anon5 (list)
#'(lambda nil :closure-dont-trim-context
(edebug-after (edebug-before 0) 7
(setq keys-so-far
(edebug-after
(edebug-before 1) 6
(concat
(edebug-after 0 2
keys-so-far)
" "
(edebug-after
(edebug-before 3) 5
(funcall
(edebug-after 0 4
this-key)))))))
This is evidently from the instrumented function. What I haven't been
able to determine is why this remains even after the instrumentation has
been removed; it seems that Edebug has appropriated
overriding-terminal-local-map. The only way I have found to release it
is `M-x unload-library RET edebug'.
In GNU Emacs 30.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version
3.24.41, cairo version 1.18.0) of 2024-05-08 built on strobelfs
Repository revision: e020f4e9ce5d98438033fea098d943c311b0fa3d
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.12101013
System Description: Linux From Scratch r12.1-53
Configured using:
'configure -C 'CFLAGS=-Og -g3' PKG_CONFIG_PATH=/opt/qt5/lib/pkgconfig'
Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
LCMS2 LIBSYSTEMD LIBXML2 MODULES NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG
RSVG SECCOMP SOUND SQLITE3 THREADS TIFF TOOLKIT_SCROLL_BARS TREE_SITTER
WEBP X11 XDBE XIM XINPUT2 XPM GTK3 ZLIB
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#70938: 30.0.50; Edebug appropriates overriding-terminal-local-map
2024-05-14 13:24 bug#70938: 30.0.50; Edebug appropriates overriding-terminal-local-map Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-05-14 19:59 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-14 20:15 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-14 21:23 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
1 sibling, 1 reply; 10+ messages in thread
From: Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-05-14 19:59 UTC (permalink / raw)
To: 70938; +Cc: stephen.berman
Stephen Berman via "Bug reports for GNU Emacs, the Swiss army knife of
text editors" <bug-gnu-emacs@gnu.org> writes:
> 0. emacs -Q -l test-edebug-override-map.el
Where can one find "test-edebug-override-map.el"?
TIA,
Michael.
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#70938: 30.0.50; Edebug appropriates overriding-terminal-local-map
2024-05-14 19:59 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-05-14 20:15 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 0 replies; 10+ messages in thread
From: Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-05-14 20:15 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: 70938
[-- Attachment #1: Type: text/plain, Size: 390 bytes --]
On Tue, 14 May 2024 21:59:07 +0200 Michael Heerdegen <michael_heerdegen@web.de> wrote:
> Stephen Berman via "Bug reports for GNU Emacs, the Swiss army knife of
> text editors" <bug-gnu-emacs@gnu.org> writes:
>
>> 0. emacs -Q -l test-edebug-override-map.el
>
> Where can one find "test-edebug-override-map.el"?
Oh, no, I forgot to attach it, sorry! Now it's attached here.
Steve Berman
[-- Attachment #2: test-edebug-override-map.el --]
[-- Type: application/emacs-lisp, Size: 2519 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#70938: 30.0.50; Edebug appropriates overriding-terminal-local-map
2024-05-14 13:24 bug#70938: 30.0.50; Edebug appropriates overriding-terminal-local-map Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-14 19:59 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-05-14 21:23 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-14 22:02 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
1 sibling, 1 reply; 10+ messages in thread
From: Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-05-14 21:23 UTC (permalink / raw)
To: 70938; +Cc: stephen.berman
Stephen Berman via "Bug reports for GNU Emacs, the Swiss army knife of
text editors" <bug-gnu-emacs@gnu.org> writes:
> This is evidently from the instrumented function. What I haven't been
> able to determine is why this remains even after the instrumentation has
> been removed; it seems that Edebug has appropriated
> overriding-terminal-local-map. The only way I have found to release it
> is `M-x unload-library RET edebug'.
Thanks. I can reproduce the issue. And this is a very valuable recipe,
because this may be the problem we are hunting for quite a while.
I agree with your analysis - the transient map the edebugged code adds
is never removed, its bound commands are instrumented code. Just M-:
overriding-terminal-local-map RET to verify.
AFAIU, this is caused only by this one binding:
(overriding-terminal-local-map nil)
in `edebug--recursive-edit'. This seems to make the cleanup code of the
added transient map in `pre-command-hook' think that the transient map
is gone, we are done and removes itself from the hook. Then the added
transient map stays forever, unless you clear
`overriding-terminal-local-map' manually.
But what can we do - does anyone have a good idea? Could the cleanup
code that removes the transient map maybe check whether the variable
`overriding-terminal-local-map' it sees is really the global one?
Thanks,
Michael.
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#70938: 30.0.50; Edebug appropriates overriding-terminal-local-map
2024-05-14 21:23 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-05-14 22:02 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-15 15:24 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 1 reply; 10+ messages in thread
From: Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-05-14 22:02 UTC (permalink / raw)
To: 70938; +Cc: stephen.berman
Michael Heerdegen via "Bug reports for GNU Emacs, the Swiss army knife
of text editors" <bug-gnu-emacs@gnu.org> writes:
> But what can we do - does anyone have a good idea? Could the cleanup
> code that removes the transient map maybe check whether the variable
> `overriding-terminal-local-map' it sees is really the global one?
Here is a recipe that doesn't involve Edebug (please use a separate
emacs session to try) but does the same thing:
#+begin_src emacs-lisp
(progn
(set-transient-map (let ((m (make-sparse-keymap)))
(define-key m [?^]
(lambda () (interactive) (message "Hmm...")))
m))
(let ((overriding-terminal-local-map nil))
(recursive-edit)))
#+end_src
After evaluating this, whenever one returns to top-level one is stuck
with the transient map (just hit ^ to check).
Michael.
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#70938: 30.0.50; Edebug appropriates overriding-terminal-local-map
2024-05-14 22:02 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-05-15 15:24 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-15 18:51 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 1 reply; 10+ messages in thread
From: Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-05-15 15:24 UTC (permalink / raw)
To: 70938; +Cc: stephen.berman
[-- Attachment #1: Type: text/plain, Size: 498 bytes --]
Michael Heerdegen via "Bug reports for GNU Emacs, the Swiss army knife
of text editors" <bug-gnu-emacs@gnu.org> writes:
> #+begin_src emacs-lisp
> (progn
> (set-transient-map (let ((m (make-sparse-keymap)))
> (define-key m [?^]
> (lambda () (interactive) (message "Hmm...")))
> m))
> (let ((overriding-terminal-local-map nil))
> (recursive-edit)))
> #+end_src
A possible approach that seems to fix the reported bug:
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-WIP-Fix-Bug-70868-Edebug-appropriates-overriding-ter.patch --]
[-- Type: text/x-diff, Size: 2433 bytes --]
From 7f5db96e7d40fc3f71c82d7a004a21bc7515c81d Mon Sep 17 00:00:00 2001
From: Michael Heerdegen <michael_heerdegen@web.de>
Date: Wed, 15 May 2024 17:13:35 +0200
Subject: [PATCH] WIP: Fix Bug#70868 Edebug appropriates
overriding-terminal-local-map
* lisp/subr.el (set-transient-map): Try to make the cleanup code more
reliable in case `overriding-terminal-local-map' gets shadowed: When the
added map is not present there, try to detect whether shadowing is
currently happening. Delay the cleanup in this case.
---
lisp/subr.el | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)
diff --git a/lisp/subr.el b/lisp/subr.el
index 80c7ffe32bc..2f8809d706e 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -6573,12 +6573,25 @@ set-transient-map
(clearfun (make-symbol "clear-transient-map"))
(exitfun
(lambda ()
- (internal-pop-keymap map 'overriding-terminal-local-map)
- (remove-hook 'pre-command-hook clearfun)
- ;; Clear the prompt after exiting.
- (when message (message ""))
- (when set-transient-map-timer (cancel-timer set-transient-map-timer))
- (when on-exit (funcall on-exit)))))
+ (cond
+ ((memq map overriding-terminal-local-map)
+ (internal-pop-keymap map 'overriding-terminal-local-map)
+ (remove-hook 'pre-command-hook clearfun)
+ ;; Clear the prompt after exiting.
+ (when message (message ""))
+ (when set-transient-map-timer (cancel-timer set-transient-map-timer))
+ (when on-exit (funcall on-exit)))
+ (;; FIXME: We rather want something like
+ ;; (variable-references-default-toplevel-value-p
+ ;; 'overriding-terminal-local-map)
+ (eq overriding-terminal-local-map
+ (default-toplevel-value 'overriding-terminal-local-map))
+ ;; We are probably done:
+ (remove-hook 'pre-command-hook clearfun))
+ ;; If none of these conditions was fulfilled,
+ ;; overriding-terminal-local-map is currently shadowed - keep
+ ;; clearfun in 'pre-command-hook
+ ))))
;; Don't use letrec, because equal (in add/remove-hook) could get trapped
;; in a cycle. (bug#46326)
(fset clearfun
--
2.39.2
[-- Attachment #3: Type: text/plain, Size: 83 bytes --]
Comments, corrections, enhancements and better ideas all very welcome.
Michael.
^ permalink raw reply related [flat|nested] 10+ messages in thread
* bug#70938: 30.0.50; Edebug appropriates overriding-terminal-local-map
2024-05-15 15:24 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-05-15 18:51 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-21 9:15 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 1 reply; 10+ messages in thread
From: Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-05-15 18:51 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: 70938
On Wed, 15 May 2024 17:24:24 +0200 Michael Heerdegen <michael_heerdegen@web.de> wrote:
> Michael Heerdegen via "Bug reports for GNU Emacs, the Swiss army knife
> of text editors" <bug-gnu-emacs@gnu.org> writes:
>
>> #+begin_src emacs-lisp
>> (progn
>> (set-transient-map (let ((m (make-sparse-keymap)))
>> (define-key m [?^]
>> (lambda () (interactive) (message "Hmm...")))
>> m))
>> (let ((overriding-terminal-local-map nil))
>> (recursive-edit)))
>> #+end_src
>
> A possible approach that seems to fix the reported bug:
I confirm your patch prevents Edebug from "appropriating"
overriding-terminal-local-map both in my test case and also in
todo-mode.el, where I first bumped into the problem. And your analysis
of why Edebug triggered the problem seems convincing to me, too.
Thanks!
Steve Berman
^ permalink raw reply [flat|nested] 10+ messages in thread
* bug#70938: 30.0.50; Edebug appropriates overriding-terminal-local-map
2024-05-15 18:51 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-05-21 9:15 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-27 14:37 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
0 siblings, 1 reply; 10+ messages in thread
From: Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-05-21 9:15 UTC (permalink / raw)
To: Michael Heerdegen; +Cc: 70938
On Wed, 15 May 2024 20:51:08 +0200 Stephen Berman <stephen.berman@gmx.net> wrote:
> On Wed, 15 May 2024 17:24:24 +0200 Michael Heerdegen
> <michael_heerdegen@web.de> wrote:
>
>> Michael Heerdegen via "Bug reports for GNU Emacs, the Swiss army knife
>> of text editors" <bug-gnu-emacs@gnu.org> writes:
>>
>>> #+begin_src emacs-lisp
>>> (progn
>>> (set-transient-map (let ((m (make-sparse-keymap)))
>>> (define-key m [?^]
>>> (lambda () (interactive) (message "Hmm...")))
>>> m))
>>> (let ((overriding-terminal-local-map nil))
>>> (recursive-edit)))
>>> #+end_src
>>
>> A possible approach that seems to fix the reported bug:
>
> I confirm your patch prevents Edebug from "appropriating"
> overriding-terminal-local-map both in my test case and also in
> todo-mode.el, where I first bumped into the problem. And your analysis
> of why Edebug triggered the problem seems convincing to me, too.
> Thanks!
Do you (or does anyone else) have any reason not to install this patch?
Steve Berman
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2024-05-27 15:48 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-14 13:24 bug#70938: 30.0.50; Edebug appropriates overriding-terminal-local-map Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-14 19:59 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-14 20:15 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-14 21:23 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-14 22:02 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-15 15:24 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-15 18:51 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-21 9:15 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-27 14:37 ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-05-27 15:48 ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
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).