From: Ergus <spacibba@aol.com>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: help-gnu-emacs@gnu.org
Subject: Re: Why is Elisp slow?
Date: Thu, 9 May 2019 11:49:15 +0200 [thread overview]
Message-ID: <20190509094915.zja6oba6dkpqnbpc@Ergus> (raw)
In-Reply-To: <jwvlfziwe0w.fsf-monnier+emacs@gnu.org>
Hi:
After some mails in the SBCL mailing list and make some
question-reply-question there; I arrived the conclusion that SBCL is not
an alternative :( I was very wrong.
I'll copy-paste the main answers here just in case someone wants to go
this way in the future. Or in case someone more expert see some possible
workaround for the issues exposed here.
----------------------------------------
Your question as stated is too open-ended for me to discern the exact
intent, but I think's it's something like this: there is much common-lisp
code that people run in emacs, and you'd like not to have to maintain a
common-lisp compiler as well as elisp compiler. Instead you'd like to
retarget the output of the SBCL compiler to produce elisp byte code for
execution.
It's unclear whether you'd expect this to be an out-of-process compiler or
an in-process compiler. If in-process, then you've got larger problems
than figuring out how to call C. SBCL is not intended to be a "subsystem"
of other lisps, nor even to allow main() to be anything other than its own
main(), though that limitation has been relaxed a bit.
If out-of-process, then I would imagine that SBCL would operate as a file
compiler only, and not a compiler of arbitrary forms. You need to figure
out how to treat emacs as the virtual machine which the SBCL compiler
targets, and a suitable interface for getting the compiled code out of an
SBCL '.fasl' file and into emacs. The "machine code" in the '.fasl' file
would actually be emacs byte code. (I'm assuming that you plan to keep
more-or-less the same byte code execution engine)
I don't see why C functions are a particular problem. SBCL uses C
functions all the time. In fact it is extremely interoperable with C, but
that's really asking the wrong question imho.
Portability is the real question, since you brought it up. Are you implying
that SBCL's compiler should produce machine code that would run within
emacs? This is highly unlikely; I won't say impossible, but darn near so.
First of all, SBCL can produce machine code only for a tiny fraction of
the CPUs that emacs supports. Secondly, producing machine code assumes that
the entirety of the runtime (comprised of the memory layout, heap objects,
and support routines) is exactly as SBCL expects it to be - symbols look
like SBCL symbols, special variables get bound in exactly the way that SBCL
expects them to get bound. SBCL's compiled lisp files are not a portable
abstraction like a '.o' file (or '.so' if you like) that could be loaded
into *any* other program (a C program, Java program, etc) and just run.
But as I said initially, I think you're trying to suggest that you would
produce code that is executed by the emacs lisp engine, not the CPU
directly.
So that would be essentially 1 new architecture that SBCL would have to
support, namely the emacs virtual machine. That sounds more plausible and
there's no reason to care about the set of CPUs that we can directly
compile for, nor even how the existing architectures would call C code.
You'd have to invent that as part of the retargeting to the emacs vm.
Doug
----------------------------------------
I believe the most viable way to use SBCL for Emacs would be to rethink
the approach: instead of a graphics engine written in C - in addition to
many Lisp functions - and Elisp used to "script" that, with SBCL you no
longer need to have much of that C code for performance reasons.
The entry point to this hypothetical new Emacs would be in Common Lisp,
as well as an Elisp environment that would be mostly macrology on top of
CL (to start with). After that, you could consider rewriting much of the
rendering engine into Lisp too, and leave only a tiny amount of C
strictly for interfacing with the operating system.
I know some people have discussed about turning SBCL into a shared
library but the amount of work would be considerable and with little
gain because I doubt that the SBCL maintainers are interested in
committing to a stable C ABI to the compiler internals - otherwise
embedding SBCL into a C program would be of little use except for maybe
running CL away from the main thread.
Stelian Ionescu
----------------------------------------
I expect portability to be a real issue here. If you *do* want to rely on S=
BCL to generate native machine code for you, and abandon supporting platfor=
ms that SBCL doesn't, that would be OK. This would entail significantly mod=
ifying the Emacs runtime though. The SBCL compiler is married pretty heavil=
y to its runtime (mainly through the GC, which is written in C), and SBCL i=
s a small C program which simply jumps to the Lisp entry point in a large L=
isp image and stays there in its own world, with its own calling convention=
and object layour, occasionally calling back out to C for operating system=
tools and GC, which understands Lisp objects and calling conventions. So L=
isp/C interoperation works very well, but as others have stated, it works i=
n a very SBCL-specific manner. I reckon the hard part would be getting the =
C engine for Emacs to fit in the picture, hence the suggestion to rewrite m=
uch of it in Lisp.
But the reality is I sort of doubt that eliminating support for a wide vari=
ety of other architectures is acceptable to Emacs. Hence the suggestion to =
create an Emacs bytecode backend. This would solve the portability problem,=
at the cost of some efficiency. SBCL tries much harder than Emacs to produ=
ce good code (by utilizing high level optimizations such as constraint (e.g=
. type) propagation), however, so even then the bytecode produced by SBCL w=
ould be superior compared to what Emacs can produce now. A problem with thi=
s is that the compiler really does expect to be targeting a CPU ISA rather =
than something higher level, so you'll have to be clever to figure out how =
to set up the translation from the machine independent intermediate represe=
ntation (IR2), and Elisp bytecode.
Finally, another option to reap the benefits of SBCL's fastish code generat=
ion while not sacrificing portability is to figure out how to make Emacs a =
portable Common Lisp program, through use of portable libraries for foreign=
code interop, graphics, and Elisp (through macrology, most likely). Then i=
t will run on all platforms that have C compilers through other Lisp implem=
entations which do not target machine code (like ECL, CLISP, etc...) and us=
e SBCL for the platforms it supports. This approach is taken by StumpWM, wh=
ich is fairly similar to Emacs.
=20
Charles
----------------------------------------
On Tue, May 07, 2019 at 10:22:39AM -0400, Stefan Monnier wrote:
>> embed ECL (Embeddable Common Lisp), which
>> * is significantly slower than SBCL, about 2~3x slower? but is still
>> much faster than Elisp.
>
>Last time this discussion came up, ECL seemed like the most promising
>option indeed, but the performance was not that impressive compared to
>Emacs. Maybe the situation has changed?
>Also in terms of maintenance, it's minimal, so it wouldn't help very
>much on the side of manpower.
>
>
> Stefan
>
>
next prev parent reply other threads:[~2019-05-09 9:49 UTC|newest]
Thread overview: 284+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-05 2:15 Optimising Elisp code Davin Pearson
2018-10-05 2:19 ` Davin Pearson
2018-10-05 9:46 ` Emanuel Berg
2018-10-05 10:58 ` Noam Postavsky
2018-10-05 10:03 ` tomas
2018-10-05 14:28 ` Barry Margolin
2018-10-05 14:42 ` Emanuel Berg
2018-10-05 15:04 ` Emanuel Berg
2018-10-05 17:05 ` Óscar Fuentes
[not found] ` <mailman.1736.1538759161.1284.help-gnu-emacs@gnu.org>
2018-10-05 17:23 ` Emanuel Berg
2018-10-05 17:46 ` Óscar Fuentes
[not found] ` <mailman.1737.1538762057.1284.help-gnu-emacs@gnu.org>
2018-10-05 18:50 ` Emanuel Berg
2018-10-05 19:14 ` Emanuel Berg
2018-10-05 19:17 ` Emanuel Berg
2018-10-05 19:26 ` Emanuel Berg
2018-10-05 19:40 ` Stefan Monnier
[not found] ` <mailman.1741.1538768445.1284.help-gnu-emacs@gnu.org>
2018-10-05 21:55 ` Emanuel Berg
2018-10-05 18:04 ` James K. Lowden
2018-10-05 19:02 ` Emanuel Berg
2018-10-07 2:57 ` Barry Margolin
2018-10-06 10:45 ` Knowing where a function has been used (e.g. for optimizing) [Was: Re: Optimising Elisp code] Garreau, Alexandre
2018-10-06 14:40 ` Optimising Elisp code Stefan Monnier
2018-10-06 16:55 ` Garreau, Alexandre
2018-10-06 19:24 ` tomas
2018-10-06 19:55 ` Knowing where a function has been used (bis) [Was: Re: Optimising Elisp code] Garreau, Alexandre
2018-10-06 20:27 ` tomas
2018-10-06 21:42 ` Garreau, Alexandre
2018-10-07 8:10 ` tomas
2018-10-07 13:56 ` Garreau, Alexandre
[not found] ` <mailman.1787.1538899813.1284.help-gnu-emacs@gnu.org>
2018-10-07 12:54 ` Emanuel Berg
[not found] ` <mailman.1775.1538857674.1284.help-gnu-emacs@gnu.org>
2018-10-07 12:52 ` Emanuel Berg
2018-10-07 13:19 ` Stefan Monnier
[not found] ` <mailman.1792.1538918415.1284.help-gnu-emacs@gnu.org>
2018-10-07 15:59 ` Emanuel Berg
2018-10-07 16:30 ` Optimising Elisp code [again] Garreau, Alexandre
[not found] ` <mailman.1805.1538929865.1284.help-gnu-emacs@gnu.org>
2018-10-08 14:11 ` Emanuel Berg
2018-10-08 14:43 ` tomas
[not found] ` <mailman.1852.1539009893.1284.help-gnu-emacs@gnu.org>
2018-10-09 0:38 ` Barry Margolin
2018-10-09 6:26 ` Emanuel Berg
2018-10-09 8:07 ` Garreau, Alexandre
[not found] ` <mailman.1903.1539072429.1284.help-gnu-emacs@gnu.org>
2018-10-09 13:28 ` Emanuel Berg
2018-10-09 15:03 ` Garreau, Alexandre
[not found] ` <mailman.1911.1539097442.1284.help-gnu-emacs@gnu.org>
2018-10-09 15:26 ` Emanuel Berg
2018-10-09 19:35 ` Garreau, Alexandre
2018-10-10 16:18 ` Barry Margolin
2018-10-10 20:53 ` Óscar Fuentes
2018-10-10 23:54 ` Garreau, Alexandre
[not found] ` <mailman.1975.1539205047.1284.help-gnu-emacs@gnu.org>
2018-10-11 18:10 ` Emanuel Berg
2018-10-12 19:52 ` Robert Thorpe
2018-10-07 16:10 ` Knowing where a function has been used (bis) [Was: Re: Optimising Elisp code] Emanuel Berg
2018-10-07 16:35 ` Garreau, Alexandre
2018-10-07 19:35 ` Barry Margolin
2018-10-08 14:18 ` Emanuel Berg
2018-10-08 15:23 ` Garreau, Alexandre
2018-10-08 20:52 ` Emanuel Berg
2018-10-09 0:41 ` Barry Margolin
2018-10-09 6:35 ` Emanuel Berg
2018-10-10 16:24 ` Barry Margolin
2018-10-10 16:32 ` Emanuel Berg
2018-10-11 19:29 ` Barry Margolin
2018-10-11 20:05 ` Emanuel Berg
2018-10-12 22:32 ` Barry Margolin
2018-10-12 23:03 ` Eric Abrahamsen
2018-10-13 20:51 ` Emanuel Berg
2018-10-14 7:55 ` tomas
[not found] ` <mailman.2146.1539503732.1284.help-gnu-emacs@gnu.org>
2018-10-14 19:10 ` Emanuel Berg
2018-10-15 8:25 ` tomas
[not found] ` <mailman.2179.1539591977.1284.help-gnu-emacs@gnu.org>
2018-10-15 19:27 ` Emanuel Berg
2018-10-16 0:55 ` Van L
2018-10-17 0:20 ` Garreau, Alexandre
[not found] ` <mailman.2284.1539735662.1284.help-gnu-emacs@gnu.org>
2018-10-17 6:49 ` Emanuel Berg
2018-10-10 20:50 ` Óscar Fuentes
[not found] ` <mailman.1806.1538930105.1284.help-gnu-emacs@gnu.org>
2018-10-08 14:14 ` Emanuel Berg
2018-10-08 15:37 ` Naming, and Gnus functions length [Was: Re: Knowing where a function has been used (bis) [Was: Re: Optimising Elisp code]] Garreau, Alexandre
[not found] ` <mailman.1860.1539013068.1284.help-gnu-emacs@gnu.org>
2018-10-08 15:43 ` Emanuel Berg
2018-10-08 15:52 ` Naming, and Gnus functions length [ Garreau, Alexandre
[not found] ` <mailman.1863.1539013974.1284.help-gnu-emacs@gnu.org>
2018-10-08 16:39 ` Emanuel Berg
2018-10-08 20:03 ` Naming, and Gnus functions length [Was: Re: Knowing where a function has been used (bis) [Was: Re: Optimising Elisp code]] Eli Zaretskii
[not found] ` <mailman.1874.1539029031.1284.help-gnu-emacs@gnu.org>
2018-10-08 20:44 ` Why is Elisp slow? (was: Re: Naming, and Gnus functions length [Was: Re: Knowing where a function has been used (bis) [Was: Re: Optimising Elisp code]]) Emanuel Berg
2018-10-08 23:53 ` Why is Elisp slow? Garreau, Alexandre
2018-10-09 12:27 ` Stefan Monnier
[not found] ` <mailman.1893.1539042845.1284.help-gnu-emacs@gnu.org>
2018-10-09 6:23 ` Emanuel Berg
2018-10-09 8:05 ` Garreau, Alexandre
2018-10-09 15:04 ` Eli Zaretskii
2019-05-02 4:49 ` Van L
2019-05-02 7:56 ` tomas
2019-05-02 11:06 ` Marcin Borkowski
2019-05-02 13:18 ` tomas
2019-05-02 15:34 ` Eli Zaretskii
2019-05-02 19:13 ` Marcin Borkowski
2019-05-02 19:45 ` Eli Zaretskii
2019-05-04 11:55 ` Marcin Borkowski
2019-05-02 20:00 ` tomas
2019-05-04 11:52 ` Marcin Borkowski
2019-05-02 19:33 ` Óscar Fuentes
2019-05-02 19:49 ` Eli Zaretskii
2019-05-02 20:12 ` Óscar Fuentes
2019-05-02 20:20 ` Eli Zaretskii
2019-05-02 21:40 ` Ergus
2019-05-02 23:39 ` 조성빈
2019-05-03 0:44 ` Ergus
2019-05-03 1:06 ` 조성빈
2019-05-03 10:36 ` Ergus
2019-05-03 11:52 ` 조성빈
2019-05-03 12:44 ` Eli Zaretskii
2019-05-03 12:58 ` Ergus
2019-05-03 14:00 ` Eli Zaretskii
2019-05-03 22:57 ` Stefan Monnier
2019-05-04 13:32 ` Ergus
2019-05-04 14:03 ` Stefan Monnier
2019-05-04 22:41 ` Emanuel Berg
2019-05-04 22:56 ` Stefan Monnier
2019-05-04 23:19 ` Emanuel Berg
2019-05-05 15:40 ` Stefan Monnier
2019-05-06 6:53 ` tomas
2019-05-06 8:25 ` Emanuel Berg
2019-05-05 0:12 ` 조성빈
2019-05-05 3:15 ` Stefan Monnier
2019-05-05 0:43 ` Ergus
2019-05-05 3:07 ` 조성빈
2019-05-05 15:50 ` Stefan Monnier
2019-05-06 7:33 ` Tadeus Prastowo
2019-05-06 9:03 ` 조성빈
2019-05-06 10:51 ` Tadeus Prastowo
2019-05-06 12:58 ` Ergus
2019-05-06 13:08 ` Stefan Monnier
2019-05-06 16:17 ` Ergus
2019-05-06 17:25 ` Stefan Monnier
2019-05-06 17:45 ` 조성빈
2019-05-06 18:08 ` Stefan Monnier
2019-05-06 18:18 ` 조성빈
2019-05-06 18:47 ` Stefan Monnier
2019-05-06 20:23 ` Ergus
2019-05-06 20:41 ` 조성빈
2019-05-06 21:45 ` Jean-Christophe Helary
2019-05-06 22:03 ` Ergus
2019-05-06 23:07 ` Ergus
2019-05-07 10:49 ` Ergus
2019-05-07 11:51 ` 조성빈
2019-05-07 12:38 ` Ergus
2019-05-07 12:56 ` Stefan Monnier
2019-05-07 13:01 ` 조성빈
2019-05-07 13:04 ` Stefan Monnier
2019-05-07 13:14 ` Ergus
2019-05-07 13:43 ` 조성빈
2019-05-07 14:22 ` Stefan Monnier
2019-05-07 14:41 ` Ergus
2019-05-09 9:49 ` Ergus [this message]
2019-05-10 3:20 ` 조성빈
2019-05-10 4:26 ` Ergus
2019-05-10 4:35 ` 조성빈
2019-05-10 8:27 ` tomas
2019-05-07 13:16 ` 조성빈
2019-05-07 13:40 ` Ergus
2019-05-06 20:51 ` Óscar Fuentes
2019-05-07 2:35 ` 조성빈
2019-05-10 5:14 ` Van L
2019-05-06 13:18 ` 조성빈
2019-05-06 13:33 ` Óscar Fuentes
2019-05-06 14:04 ` 조성빈
2019-05-10 7:20 ` Van L
2019-05-10 14:38 ` Lisp, C, and C++ (was: Re: Why is Elisp slow?) Emanuel Berg
2019-05-10 14:49 ` Emanuel Berg
2019-05-06 23:39 ` Why is Elisp slow? Emanuel Berg
2019-05-05 5:25 ` Paul W. Rankin
2019-05-05 13:19 ` Óscar Fuentes
2019-05-05 13:46 ` Ergus
2019-05-06 7:01 ` tomas
2019-05-05 12:51 ` Stefan Monnier
2019-05-10 3:15 ` Van L
2019-05-04 14:10 ` Eli Zaretskii
2019-05-03 12:51 ` Ergus
2019-05-03 13:16 ` 조성빈
2019-05-03 13:32 ` Ergus
2019-05-03 14:04 ` Eli Zaretskii
2019-05-04 0:32 ` Emanuel Berg
2019-05-04 11:29 ` Marcin Borkowski
2019-05-03 1:45 ` Paul W. Rankin
2019-05-03 7:00 ` Eli Zaretskii
2019-05-03 9:58 ` Ergus
2019-05-03 12:41 ` Eli Zaretskii
2019-05-03 22:18 ` Óscar Fuentes
2019-05-04 13:27 ` Ergus
2019-05-04 13:38 ` 조성빈
2019-05-04 0:33 ` Emanuel Berg
2019-05-03 7:08 ` tomas
2019-05-10 13:14 ` Van L
2019-05-10 13:22 ` Michael Heerdegen
2019-05-10 14:44 ` Emanuel Berg
2019-05-11 0:38 ` Emanuel Berg
2019-05-11 1:55 ` Stefan Monnier
2019-05-11 2:16 ` Emanuel Berg
2019-05-11 7:32 ` Is Elisp really that slow? (was: Why is Elisp slow?) tomas
2019-05-11 7:42 ` 조성빈
2019-05-11 7:57 ` tomas
2019-05-11 14:30 ` 조성빈
2019-05-11 17:01 ` tomas
2019-05-11 23:09 ` Emanuel Berg
2019-05-12 7:54 ` tomas
2019-05-12 8:09 ` Emanuel Berg
2019-05-12 9:46 ` 조성빈
2019-05-12 14:21 ` Eli Zaretskii
2019-05-12 14:45 ` Is Elisp really that slow? Óscar Fuentes
2019-05-12 15:28 ` Eli Zaretskii
2019-05-12 15:46 ` Óscar Fuentes
2019-05-12 17:20 ` Eli Zaretskii
2019-05-12 18:37 ` Óscar Fuentes
2019-05-12 18:53 ` Eli Zaretskii
2019-05-13 1:44 ` Emanuel Berg
2019-05-12 21:18 ` Stefan Monnier
2019-05-12 22:22 ` Óscar Fuentes
2019-05-14 13:39 ` Stefan Monnier
2019-05-14 15:09 ` Óscar Fuentes
2019-05-13 0:57 ` Samuel Wales
2019-05-13 12:37 ` Stefan Monnier
2019-05-13 14:23 ` Emanuel Berg
2019-05-13 14:33 ` Emanuel Berg
2019-05-14 8:24 ` tomas
2019-05-14 13:21 ` Emanuel Berg
2019-05-14 14:44 ` tomas
2019-05-15 11:25 ` Emanuel Berg
2019-05-15 12:05 ` tomas
2019-05-15 23:02 ` Emanuel Berg
2019-05-16 6:48 ` tomas
2019-05-16 9:37 ` Noam Postavsky
2019-05-16 11:02 ` tomas
2019-05-23 14:23 ` Emanuel Berg
2019-05-24 1:33 ` Van L
2019-05-16 13:31 ` Eli Zaretskii
2019-05-23 14:28 ` Emanuel Berg
2019-05-23 14:54 ` Drew Adams
2019-05-23 14:55 ` Eli Zaretskii
2019-06-06 5:18 ` Emanuel Berg via help-gnu-emacs
2019-05-16 14:45 ` Stefan Monnier
2019-05-25 4:53 ` Emanuel Berg via help-gnu-emacs
2019-05-13 1:52 ` Emanuel Berg
2019-05-13 1:35 ` Emanuel Berg
2019-05-12 21:01 ` Stefan Monnier
2019-05-13 1:27 ` Emanuel Berg
2019-05-13 14:38 ` Eli Zaretskii
2019-05-13 15:00 ` Emanuel Berg
2019-05-13 15:25 ` Eli Zaretskii
2019-05-14 11:54 ` Emanuel Berg
2019-05-14 16:21 ` Eli Zaretskii
2019-05-14 17:05 ` Emanuel Berg
2019-05-14 18:30 ` Eli Zaretskii
2019-05-15 11:27 ` Emanuel Berg
2019-05-15 14:51 ` Eli Zaretskii
2019-05-16 23:19 ` Emanuel Berg
2019-05-17 6:41 ` Eli Zaretskii
2019-05-13 15:02 ` John Yates
2019-05-13 15:14 ` Eli Zaretskii
2019-05-13 22:40 ` Dmitry Gutov
2019-05-14 6:27 ` Paul W. Rankin
2019-05-14 13:10 ` Emanuel Berg
2019-05-13 15:42 ` Van L
2019-05-17 15:17 ` Ken Goldman
2019-06-04 1:36 ` Emanuel Berg via help-gnu-emacs
2019-05-24 4:28 ` Is Elisp really that slow? (was: Why is Elisp slow?) Xavier Maillard
2019-06-07 19:08 ` Emanuel Berg via help-gnu-emacs
2019-06-08 0:26 ` Samuel Wales
2019-06-08 0:30 ` Samuel Wales
2019-06-08 8:52 ` tomas
2019-06-08 21:00 ` Samuel Wales
2019-06-08 21:14 ` tomas
2019-06-08 21:44 ` Is Elisp really that slow? Óscar Fuentes
2019-06-08 23:29 ` Emanuel Berg via help-gnu-emacs
2019-06-11 4:10 ` Xavier Maillard
2019-06-09 6:46 ` Is Elisp really that slow? (was: Why is Elisp slow?) Eli Zaretskii
2019-06-11 20:23 ` Samuel Wales
2019-06-08 23:26 ` Emanuel Berg via help-gnu-emacs
2019-05-13 6:10 ` Why is Elisp slow? Van L
2019-05-03 6:55 ` Eli Zaretskii
2019-05-03 2:39 ` Stefan Monnier
2019-05-03 6:51 ` Eli Zaretskii
2019-05-02 19:10 ` Marcin Borkowski
2019-05-03 23:34 ` Samuel Wales
2019-05-04 6:19 ` Eli Zaretskii
[not found] ` <mailman.1772.1538855722.1284.help-gnu-emacs@gnu.org>
2018-10-07 12:45 ` Knowing where a function has been used (bis) [Was: Re: Optimising Elisp code] Emanuel Berg
[not found] ` <mailman.1752.1538822765.1284.help-gnu-emacs@gnu.org>
2018-10-07 12:41 ` Knowing where a function has been used (e.g. for optimizing) " Emanuel Berg
2018-10-07 13:46 ` Getting functions usage examples [Was: Re: Knowing where a function has been used (e.g. for optimizing) [Was: Re: Optimising Elisp code]] Garreau, Alexandre
2018-10-08 0:07 ` Van L
2018-10-08 15:40 ` Getting functions usage examples [ Garreau, Alexandre
2018-10-09 9:33 ` Van L
[not found] ` <mailman.1798.1538920786.1284.help-gnu-emacs@gnu.org>
2018-10-07 15:38 ` Getting functions usage examples [Was: Re: Knowing where a function has been used (e.g. for optimizing) [Was: Re: Optimising Elisp code]] Emanuel Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190509094915.zja6oba6dkpqnbpc@Ergus \
--to=spacibba@aol.com \
--cc=help-gnu-emacs@gnu.org \
--cc=monnier@iro.umontreal.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).