GNU bug report logs - #68568
transient.el interns potentially enormous symbols as commands

Previous Next

Package: emacs;

Reported by: João Távora <joaotavora <at> gmail.com>

Date: Thu, 18 Jan 2024 11:51:01 UTC

Severity: normal

Tags: wontfix

Done: Eli Zaretskii <eliz <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


Message #26 received at 68568 <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: João Távora <joaotavora <at> gmail.com>, jonas <at> bernoul.li
Cc: 68568 <at> debbugs.gnu.org
Subject: Re: bug#68568: transient.el interns potentially enormous symbols as
 commands
Date: Sat, 27 Jan 2024 11:15:11 +0200
Ping!

Jonas, any comments or suggestions?

> From: João Távora <joaotavora <at> gmail.com>
> Date: Thu, 18 Jan 2024 11:50:19 +0000
> 
> Hello,
> 
> I'd never used a package that made use of "transient.el" before.
> I have now, via gptel.el  Takes a bit of getting used to, but I like it
> (and can see why people like it in Magit).
> 
> Now, immediately after using it, I start noticing that the completion
> that Fido mode offers on M-x starts to get weirdly contaminated by these
> symbols with enormous symbols names.  This makes my Emacs almost
> unusable.  I'd think other completion packages would be similarly
> affected unless they special case transient symols some how.
> 
> Peeping into the transient source code, we can see that it uses a lot
> of 'eval' to define some commands just in time as a user navigates the
> menus and submenus.
> 
> All these commands seem point to the same actual command, and do not
> seem to be meant to be called with M-x at all.  They are generated at
> lazily at runtime and only for the submenus being visited.
> 
> So they're just temporary artefacts of implementation.  Who know if this
> is where the library gets its name.  It's curious, but not going to
> argue much on this approach.
> 
> Anyway, transient uses 'intern' when I think it could just use
> 'make-symbol' to avoid polluting the obarray and this whole problem.  It
> seems to keep functioning and solves my problem.  Here's the trivial
> patch.  Would you look at it, Jonas?
> 
> diff --git a/lisp/transient.el b/lisp/transient.el
> index f9060f5ba85..249c25262ea 100644
> --- a/lisp/transient.el
> +++ b/lisp/transient.el
> @@ -1127,7 +1127,7 @@ transient--parse-suffix
>         ((and (commandp car)
>               (not (stringp car)))
>          (let ((cmd pop)
> -              (sym (intern
> +              (sym (make-symbol
>                      (format "transient:%s:%s"
>                              prefix
>                              (let ((desc (plist-get args :description)))
> @@ -1156,7 +1156,7 @@ transient--parse-suffix
>               (when-let ((shortarg (transient--derive-shortarg arg)))
>                 (setq args (plist-put args :shortarg shortarg)))
>               (setq args (plist-put args :argument arg))))
> -          (setq sym (intern (format "transient:%s:%s" prefix arg)))
> +          (setq sym (make-symbol (format "transient:%s:%s" prefix arg)))
>            (setq args (plist-put
>                        args :command
>                        `(prog1 ',sym
> 
> 
> 
> If some kind of persistent storage for these symbols IS needed I
> recommend a separate obarray.  Also, why does the full and potentially
> very long description in plain text have to be a part of the symbol
> name?  This doesn't matter with the 'make-symbol' approach, but I still
> find it curious.
> 
> João
> 
> 
> 
> 




This bug report was last modified 1 year and 111 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.