* bug#58875: 29.0.50; emoji-insert triggers a Lisp error
@ 2022-10-29 20:28 Kévin Le Gouguec
2022-10-30 17:31 ` Kévin Le Gouguec
0 siblings, 1 reply; 5+ messages in thread
From: Kévin Le Gouguec @ 2022-10-29 20:28 UTC (permalink / raw)
To: 58875; +Cc: Jonas Bernoulli, Lars Ingebrigtsen
$ emacs -Q
M-x toggle-debug-on-error
C-x 8 e e
⇒
> Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p vector)
> apply(debug (error (wrong-type-argument number-or-marker-p vector)))
> transient--exit-and-debug(error (wrong-type-argument number-or-marker-p vector))
> transient--use-level-p(vector)
> transient--init-suffix(nil (vector 1 'transient-columns (list :description "Emoji") (list (vector 1 'transient-column nil (list (list 1 'transient-suffix (list :key "r" :description "Recent " :command 'transient:emoji--command-Emoji:Recent\ )) (list 1 'transient-suffix (list :key "s" :description "Smileys 😀🥰😋🤗🤐😌😷🤠😎😕😤" :command 'emoji--command-Emoji\ >\ Smileys)) (list 1 'transient-suffix (list :key "e" :description "Emotion 💋💯💢💥💫💦💨🕳️💬👁️🗨️🗨️" :command 'emoji--command-Emoji\ >\ Emotion)) (list 1 'transient-suffix (list :key "b" :description "Body 👋👌👈👍✍️👏💪🤚🤌👉👎💅🙌" :command 'emoji--command-Emoji\ >\ Body)) (list 1 'transient-suffix (list :key "p" :description "People 🧑🙍🫅🧜💆🤺🧘🧑🤝🧑🫂🧓🙎👳" :command 'emoji--command-Emoji\ >\ People)) (list 1 'transient-suffix (list :key "a" :description "Animals & Nature 🐵🦃🐸🐊🐳🐌💐" :command 'emoji--command-Emoji\ >\ Animals\ &\ Nature)))) (vector 1 'transient-column nil (list (list 1 'transient-suffix (list :key "f" :description "Food & Drink 🍇🥑🍞🍱🦀🍦🍼🥢🍈" :command 'emoji--command-Emoji\ >\ Food\ &\ Drink)) (list 1 'transient-suffix (list :key "t" :description "Travel & Places 🌍🏔️🏟️⛪⛲🚂⚓" :command 'emoji--command-Emoji\ >\ Travel\ &\ Places)) (list 1 'transient-suffix (list :key "c" :description "Activities 🎃🎖️⚽🎯🎭🎄🏆⚾🪀🖼️" :command 'emoji--command-Emoji\ >\ Activities)) (list 1 'transient-suffix (list :key "o" :description "Objects 👓🔇🎼🎷📱🔋🎥📔💰✉️✏️" :command 'emoji--command-Emoji\ >\ Objects)) (list 1 'transient-suffix (list :key "y" :description "Symbols 🏧⚠️⬆️🛐♈🔀♀️✖️‼️💱⚕️" :command 'emoji--command-Emoji\ >\ Symbols)) (list 1 'transient-suffix (list :key "l" :description "Flags 🏁🇦🇨🏴🚩🇦🇩🏴🎌🇦🇪🏴🏴🇦🇫🏳️" :command 'emoji--command-Emoji\ >\ Flags)))))))
> transient--init-child(nil (vector 1 'transient-columns (list :description "Emoji") (list (vector 1 'transient-column nil (list (list 1 'transient-suffix (list :key "r" :description "Recent " :command 'transient:emoji--command-Emoji:Recent\ )) (list 1 'transient-suffix (list :key "s" :description "Smileys 😀🥰😋🤗🤐😌😷🤠😎😕😤" :command 'emoji--command-Emoji\ >\ Smileys)) (list 1 'transient-suffix (list :key "e" :description "Emotion 💋💯💢💥💫💦💨🕳️💬👁️🗨️🗨️" :command 'emoji--command-Emoji\ >\ Emotion)) (list 1 'transient-suffix (list :key "b" :description "Body 👋👌👈👍✍️👏💪🤚🤌👉👎💅🙌" :command 'emoji--command-Emoji\ >\ Body)) (list 1 'transient-suffix (list :key "p" :description "People 🧑🙍🫅🧜💆🤺🧘🧑🤝🧑🫂🧓🙎👳" :command 'emoji--command-Emoji\ >\ People)) (list 1 'transient-suffix (list :key "a" :description "Animals & Nature 🐵🦃🐸🐊🐳🐌💐" :command 'emoji--command-Emoji\ >\ Animals\ &\ Nature)))) (vector 1 'transient-column nil (list (list 1 'transient-suffix (list :key "f" :description "Food & Drink 🍇🥑🍞🍱🦀🍦🍼🥢🍈" :command 'emoji--command-Emoji\ >\ Food\ &\ Drink)) (list 1 'transient-suffix (list :key "t" :description "Travel & Places 🌍🏔️🏟️⛪⛲🚂⚓" :command 'emoji--command-Emoji\ >\ Travel\ &\ Places)) (list 1 'transient-suffix (list :key "c" :description "Activities 🎃🎖️⚽🎯🎭🎄🏆⚾🪀🖼️" :command 'emoji--command-Emoji\ >\ Activities)) (list 1 'transient-suffix (list :key "o" :description "Objects 👓🔇🎼🎷📱🔋🎥📔💰✉️✏️" :command 'emoji--command-Emoji\ >\ Objects)) (list 1 'transient-suffix (list :key "y" :description "Symbols 🏧⚠️⬆️🛐♈🔀♀️✖️‼️💱⚕️" :command 'emoji--command-Emoji\ >\ Symbols)) (list 1 'transient-suffix (list :key "l" :description "Flags 🏁🇦🇨🏴🚩🇦🇩🏴🎌🇦🇪🏴🏴🇦🇫🏳️" :command 'emoji--command-Emoji\ >\ Flags)))))))
> #f(compiled-function (c) #<bytecode -0x142f01508458fb8e>)((vector 1 'transient-columns (list :description "Emoji") (list (vector 1 'transient-column nil (list (list 1 'transient-suffix (list :key "r" :description "Recent " :command 'transient:emoji--command-Emoji:Recent\ )) (list 1 'transient-suffix (list :key "s" :description "Smileys 😀🥰😋🤗🤐😌😷🤠😎😕😤" :command 'emoji--command-Emoji\ >\ Smileys)) (list 1 'transient-suffix (list :key "e" :description "Emotion 💋💯💢💥💫💦💨🕳️💬👁️🗨️🗨️" :command 'emoji--command-Emoji\ >\ Emotion)) (list 1 'transient-suffix (list :key "b" :description "Body 👋👌👈👍✍️👏💪🤚🤌👉👎💅🙌" :command 'emoji--command-Emoji\ >\ Body)) (list 1 'transient-suffix (list :key "p" :description "People 🧑🙍🫅🧜💆🤺🧘🧑🤝🧑🫂🧓🙎👳" :command 'emoji--command-Emoji\ >\ People)) (list 1 'transient-suffix (list :key "a" :description "Animals & Nature 🐵🦃🐸🐊🐳🐌💐" :command 'emoji--command-Emoji\ >\ Animals\ &\ Nature)))) (vector 1 'transient-column nil (list (list 1 'transient-suffix (list :key "f" :description "Food & Drink 🍇🥑🍞🍱🦀🍦🍼🥢🍈" :command 'emoji--command-Emoji\ >\ Food\ &\ Drink)) (list 1 'transient-suffix (list :key "t" :description "Travel & Places 🌍🏔️🏟️⛪⛲🚂⚓" :command 'emoji--command-Emoji\ >\ Travel\ &\ Places)) (list 1 'transient-suffix (list :key "c" :description "Activities 🎃🎖️⚽🎯🎭🎄🏆⚾🪀🖼️" :command 'emoji--command-Emoji\ >\ Activities)) (list 1 'transient-suffix (list :key "o" :description "Objects 👓🔇🎼🎷📱🔋🎥📔💰✉️✏️" :command 'emoji--command-Emoji\ >\ Objects)) (list 1 'transient-suffix (list :key "y" :description "Symbols 🏧⚠️⬆️🛐♈🔀♀️✖️‼️💱⚕️" :command 'emoji--command-Emoji\ >\ Symbols)) (list 1 'transient-suffix (list :key "l" :description "Flags 🏁🇦🇨🏴🚩🇦🇩🏴🎌🇦🇪🏴🏴🇦🇫🏳️" :command 'emoji--command-Emoji\ >\ Flags)))))))
> mapcan(#f(compiled-function (c) #<bytecode -0x142f01508458fb8e>) ((vector 1 'transient-columns (list :description "Emoji") (list (vector 1 'transient-column nil (list (list 1 'transient-suffix (list :key "r" :description "Recent " :command ...)) (list 1 'transient-suffix (list :key "s" :description "Smileys 😀🥰😋🤗🤐😌😷🤠😎😕😤" :command ...)) (list 1 'transient-suffix (list :key "e" :description "Emotion 💋💯💢💥💫💦💨🕳️💬👁️🗨️🗨️" :command ...)) (list 1 'transient-suffix (list :key "b" :description "Body 👋👌👈👍✍️👏💪🤚🤌👉👎💅🙌" :command ...)) (list 1 'transient-suffix (list :key "p" :description "People 🧑🙍🫅🧜💆🤺🧘🧑🤝🧑🫂🧓🙎👳" :command ...)) (list 1 'transient-suffix (list :key "a" :description "Animals & Nature 🐵🦃🐸🐊🐳🐌💐" :command ...)))) (vector 1 'transient-column nil (list (list 1 'transient-suffix (list :key "f" :description "Food & Drink 🍇🥑🍞🍱🦀🍦🍼🥢🍈" :command ...)) (list 1 'transient-suffix (list :key "t" :description "Travel & Places 🌍🏔️🏟️⛪⛲🚂⚓" :command ...)) (list 1 'transient-suffix (list :key "c" :description "Activities 🎃🎖️⚽🎯🎭🎄🏆⚾🪀🖼️" :command ...)) (list 1 'transient-suffix (list :key "o" :description "Objects 👓🔇🎼🎷📱🔋🎥📔💰✉️✏️" :command ...)) (list 1 'transient-suffix (list :key "y" :description "Symbols 🏧⚠️⬆️🛐♈🔀♀️✖️‼️💱⚕️" :command ...)) (list 1 'transient-suffix (list :key "l" :description "Flags 🏁🇦🇨🏴🚩🇦🇩🏴🎌🇦🇪🏴🏴🇦🇫🏳️" :command ...)))))) [1 transient-columns (:hide #f(compiled-function () #<bytecode 0x173b9ba52e4fa3e2>)) ([1 transient-column (:description "Value commands") ((1 transient-suffix (:key "C-x s " :description "Set" :command transient-set)) (1 transient-suffix (:key "C-x C-s" :description "Save" :command transient-save)) (1 transient-suffix (:key "C-x C-k" :description "Reset" :command transient-reset)) (1 transient-suffix (:key "C-x p " :description "Previous value" :command transient-history-prev)) (1 transient-suffix (:key "C-x n " :description "Next value" :command transient-history-next)))] [1 transient-column (:description "Sticky commands") ((1 transient-suffix (:key "C-g" :description "Quit prefix or transient" :command transient-quit-one)) (1 transient-suffix (:key "C-q" :description "Quit transient stack" :command transient-quit-all)) (1 transient-suffix (:key "C-z" :description "Suspend transient stack" :command transient-suspend)))] [1 transient-column (:description "Customize") ((1 transient-suffix (:key "C-x t" :command transient-toggle-common :description #f(compiled-function () #<bytecode 0x1e0d3e4688a317b5>))) (1 transient-suffix (:key "C-x l" :description "Show/hide suffixes" :command transient-set-level)))])]))
> cl-mapcan(#f(compiled-function (c) #<bytecode -0x142f01508458fb8e>) ((vector 1 'transient-columns (list :description "Emoji") (list (vector 1 'transient-column nil (list (list 1 'transient-suffix (list :key "r" :description "Recent " :command ...)) (list 1 'transient-suffix (list :key "s" :description "Smileys 😀🥰😋🤗🤐😌😷🤠😎😕😤" :command ...)) (list 1 'transient-suffix (list :key "e" :description "Emotion 💋💯💢💥💫💦💨🕳️💬👁️🗨️🗨️" :command ...)) (list 1 'transient-suffix (list :key "b" :description "Body 👋👌👈👍✍️👏💪🤚🤌👉👎💅🙌" :command ...)) (list 1 'transient-suffix (list :key "p" :description "People 🧑🙍🫅🧜💆🤺🧘🧑🤝🧑🫂🧓🙎👳" :command ...)) (list 1 'transient-suffix (list :key "a" :description "Animals & Nature 🐵🦃🐸🐊🐳🐌💐" :command ...)))) (vector 1 'transient-column nil (list (list 1 'transient-suffix (list :key "f" :description "Food & Drink 🍇🥑🍞🍱🦀🍦🍼🥢🍈" :command ...)) (list 1 'transient-suffix (list :key "t" :description "Travel & Places 🌍🏔️🏟️⛪⛲🚂⚓" :command ...)) (list 1 'transient-suffix (list :key "c" :description "Activities 🎃🎖️⚽🎯🎭🎄🏆⚾🪀🖼️" :command ...)) (list 1 'transient-suffix (list :key "o" :description "Objects 👓🔇🎼🎷📱🔋🎥📔💰✉️✏️" :command ...)) (list 1 'transient-suffix (list :key "y" :description "Symbols 🏧⚠️⬆️🛐♈🔀♀️✖️‼️💱⚕️" :command ...)) (list 1 'transient-suffix (list :key "l" :description "Flags 🏁🇦🇨🏴🚩🇦🇩🏴🎌🇦🇪🏴🏴🇦🇫🏳️" :command ...)))))) [1 transient-columns (:hide #f(compiled-function () #<bytecode 0x173b9ba52e4fa3e2>)) ([1 transient-column (:description "Value commands") ((1 transient-suffix (:key "C-x s " :description "Set" :command transient-set)) (1 transient-suffix (:key "C-x C-s" :description "Save" :command transient-save)) (1 transient-suffix (:key "C-x C-k" :description "Reset" :command transient-reset)) (1 transient-suffix (:key "C-x p " :description "Previous value" :command transient-history-prev)) (1 transient-suffix (:key "C-x n " :description "Next value" :command transient-history-next)))] [1 transient-column (:description "Sticky commands") ((1 transient-suffix (:key "C-g" :description "Quit prefix or transient" :command transient-quit-one)) (1 transient-suffix (:key "C-q" :description "Quit transient stack" :command transient-quit-all)) (1 transient-suffix (:key "C-z" :description "Suspend transient stack" :command transient-suspend)))] [1 transient-column (:description "Customize") ((1 transient-suffix (:key "C-x t" :command transient-toggle-common :description #f(compiled-function () #<bytecode 0x1e0d3e4688a317b5>))) (1 transient-suffix (:key "C-x l" :description "Show/hide suffixes" :command transient-set-level)))])]))
> transient--init-suffixes(emoji--command-Emoji)
> transient--init-objects(emoji--command-Emoji nil nil)
> transient-setup(emoji--command-Emoji)
> emoji--command-Emoji()
> emoji-insert()
> funcall-interactively(emoji-insert)
> call-interactively(emoji-insert nil nil)
> command-execute(emoji-insert)
If I revert 2022-10-28 "* lisp/transient.el: Update to package version
v0.3.7-173-g81b29ca" (de5a3fa1e5), then I no longer get an error.
Haven't dug deeper yet. FWIW it's not clear to me if the fault lies on
the side of transient.el or emoji.el: Magit and rg.el's transients work
fine AFAICT.
Thanks for your time.
In GNU Emacs 29.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version
3.24.34, cairo version 1.17.6) of 2022-10-29 built on amdahl30
Repository revision: 44f1b1edcf74de3be7251780f058b29ccd038150
Repository branch: master
Windowing system distributor 'The X.Org Foundation', version 11.0.12101004
System Description: openSUSE Tumbleweed
Configured using:
'configure --with-cairo --with-gconf --with-sqlite3 --with-xinput2'
Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 M17N_FLT MODULES NOTIFY
INOTIFY PDUMPER PNG RSVG SECCOMP SOUND SQLITE3 THREADS TIFF
TOOLKIT_SCROLL_BARS WEBP X11 XDBE XIM XINPUT2 XPM GTK3 ZLIB
Important settings:
value of $LANG: en_US.UTF-8
value of $XMODIFIERS: @im=local
locale-coding-system: utf-8-unix
^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#58875: 29.0.50; emoji-insert triggers a Lisp error
2022-10-29 20:28 bug#58875: 29.0.50; emoji-insert triggers a Lisp error Kévin Le Gouguec
@ 2022-10-30 17:31 ` Kévin Le Gouguec
2022-11-02 22:39 ` Jonas Bernoulli
0 siblings, 1 reply; 5+ messages in thread
From: Kévin Le Gouguec @ 2022-10-30 17:31 UTC (permalink / raw)
To: 58875; +Cc: Lars Ingebrigtsen, Jonas Bernoulli
Kévin Le Gouguec <kevin.legouguec@gmail.com> writes:
> If I revert 2022-10-28 "* lisp/transient.el: Update to package version
> v0.3.7-173-g81b29ca" (de5a3fa1e5), then I no longer get an error.
>
> Haven't dug deeper yet. FWIW it's not clear to me if the fault lies on
> the side of transient.el or emoji.el: Magit and rg.el's transients work
> fine AFAICT.
Bisecting the transient repo with…
~/src/emacs/master/src/emacs -Q --batch \
-L ~/.emacs.d/elpa/compat-28.1.2.2 \
-L ~/src/emacs/transient/lisp \
-eval '(emoji-insert)' || false
… points to:
ea851f3bde0b769b04ad03ab1a1341c013d0ddc6 is the first bad commit
commit ea851f3bde0b769b04ad03ab1a1341c013d0ddc6
Author: Jonas Bernoulli <jonas@bernoul.li>
Date: Thu Oct 20 12:19:22 2022 +0200
Turn suffix specifications into code instead of data
The macro `transient-define-prefix' manipulates its GROUP arguments,
but until now it expanded to new vectors using vector syntax, i.e.,
data. An effort was made to evaluate lambda expressions, but that did
not really work.
Now the GROUP arguments are expanded into code, which evaluates to new
vectors. This way lambda expressions are automatically evaluated and
byte-compiled, but we now have to take care to quote certain lists and
symbols.
Functions such as `transient-insert-suffix' take group and suffix
specs of the same form as `transient-define-prefix' but because there
is no macro expansion step, they have to `eval' the result of parsing
these specifications.
Add a new macro `transient-define-groups', which can be used to define
suffix groups that are shared between multiple prefix commands, but
don't use it for `transient-common-commands' to avoid having to make
a bunch of functions available at compile time.
Still haven't actually looked at what the fuss is about. Based solely
on emoji.el's use of internal transient-- functions, I'd be tempted to
conclude that emoji--define-transient needs to be updated 🤔
^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#58875: 29.0.50; emoji-insert triggers a Lisp error
2022-10-30 17:31 ` Kévin Le Gouguec
@ 2022-11-02 22:39 ` Jonas Bernoulli
2022-11-03 6:26 ` Eli Zaretskii
0 siblings, 1 reply; 5+ messages in thread
From: Jonas Bernoulli @ 2022-11-02 22:39 UTC (permalink / raw)
To: Kévin Le Gouguec, 58875; +Cc: Lars Ingebrigtsen
Kévin Le Gouguec <kevin.legouguec@gmail.com> writes:
> Kévin Le Gouguec <kevin.legouguec@gmail.com> writes:
>
>> If I revert 2022-10-28 "* lisp/transient.el: Update to package version
>> v0.3.7-173-g81b29ca" (de5a3fa1e5), then I no longer get an error.
>>
>> Haven't dug deeper yet. FWIW it's not clear to me if the fault lies on
>> the side of transient.el or emoji.el: Magit and rg.el's transients work
>> fine AFAICT.
>
> Bisecting the transient repo with…
>
> ~/src/emacs/master/src/emacs -Q --batch \
> -L ~/.emacs.d/elpa/compat-28.1.2.2 \
> -L ~/src/emacs/transient/lisp \
> -eval '(emoji-insert)' || false
>
> … points to:
>
> ea851f3bde0b769b04ad03ab1a1341c013d0ddc6 is the first bad commit
> commit ea851f3bde0b769b04ad03ab1a1341c013d0ddc6
> Author: Jonas Bernoulli <jonas@bernoul.li>
> Date: Thu Oct 20 12:19:22 2022 +0200
>
> Turn suffix specifications into code instead of data
>
> The macro `transient-define-prefix' manipulates its GROUP arguments,
> but until now it expanded to new vectors using vector syntax, i.e.,
> data. An effort was made to evaluate lambda expressions, but that did
> not really work.
>
> Now the GROUP arguments are expanded into code, which evaluates to new
> vectors. This way lambda expressions are automatically evaluated and
> byte-compiled, but we now have to take care to quote certain lists and
> symbols.
>
> Functions such as `transient-insert-suffix' take group and suffix
> specs of the same form as `transient-define-prefix' but because there
> is no macro expansion step, they have to `eval' the result of parsing
> these specifications.
>
> Add a new macro `transient-define-groups', which can be used to define
> suffix groups that are shared between multiple prefix commands, but
> don't use it for `transient-common-commands' to avoid having to make
> a bunch of functions available at compile time.
>
> Still haven't actually looked at what the fuss is about. Based solely
> on emoji.el's use of internal transient-- functions, I'd be tempted to
> conclude that emoji--define-transient needs to be updated 🤔
Fixed with da89281837ae85b7656070b7afbd3e6d94293b88. Thanks for the
report.
Cheers,
Jonas
^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#58875: 29.0.50; emoji-insert triggers a Lisp error
2022-11-02 22:39 ` Jonas Bernoulli
@ 2022-11-03 6:26 ` Eli Zaretskii
2022-11-03 17:32 ` Kévin Le Gouguec
0 siblings, 1 reply; 5+ messages in thread
From: Eli Zaretskii @ 2022-11-03 6:26 UTC (permalink / raw)
To: Jonas Bernoulli; +Cc: 58875-done, larsi, kevin.legouguec
> Cc: Lars Ingebrigtsen <larsi@gnus.org>
> From: Jonas Bernoulli <jonas@bernoul.li>
> Date: Wed, 02 Nov 2022 23:39:04 +0100
>
> Fixed with da89281837ae85b7656070b7afbd3e6d94293b88. Thanks for the
> report.
Thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
* bug#58875: 29.0.50; emoji-insert triggers a Lisp error
2022-11-03 6:26 ` Eli Zaretskii
@ 2022-11-03 17:32 ` Kévin Le Gouguec
0 siblings, 0 replies; 5+ messages in thread
From: Kévin Le Gouguec @ 2022-11-03 17:32 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: 58875-done, Jonas Bernoulli, larsi
Eli Zaretskii <eliz@gnu.org> writes:
>> Cc: Lars Ingebrigtsen <larsi@gnus.org>
>> From: Jonas Bernoulli <jonas@bernoul.li>
>> Date: Wed, 02 Nov 2022 23:39:04 +0100
>>
>> Fixed with [2eb2eb0c9ead205935be58ce9bb54465d48b20c8]. Thanks for the
>> report.
Confirming the fix 👌
> Thanks.
Seconded; and thanks Eli for closing 🙇
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-11-03 17:32 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-29 20:28 bug#58875: 29.0.50; emoji-insert triggers a Lisp error Kévin Le Gouguec
2022-10-30 17:31 ` Kévin Le Gouguec
2022-11-02 22:39 ` Jonas Bernoulli
2022-11-03 6:26 ` Eli Zaretskii
2022-11-03 17:32 ` Kévin Le Gouguec
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).