[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Adding with-editor to Emacs?

From: Jonas Bernoulli
Subject: Re: Adding with-editor to Emacs?
Date: Fri, 01 Sep 2023 22:23:43 +0200

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Jonas Bernoulli <jonas@bernoul.li>
>> Cc: emacs-devel@gnu.org, rms@gnu.org
>> Date: Fri, 01 Sep 2023 19:44:53 +0200
>> Eli Zaretskii <eliz@gnu.org> writes:

>> - It implements a "sleeping editor".  This is a shell script, which
>>   outputs a request on stdout and then waits to be told to return.
>>   With-editor use a process filter too look for that output and when
>>   it sees it, it responds in a similar fashion to server.el.  This
>>   is useful because makes it possible to do this over Tramp.  (I
>>   believe this could also be done using regular emacsclient+server.el,
>>   but that is difficult to setup and a security risk if not done
>>   correctly.
> If we want a better/safer client-server connections for remote hosts,
> it should be handled in Tramp, I think.

Probably and it would be great if Tramp did handle that, but I don't
even use Tramp except when users report that there is an issue when
using Tramp with one of my packages.  So I am not the right person to
implement it there, but if Michael were to tackle this, then maybe I
would have some insights that could be useful.  Or not.

>> - It provides some convenience functionality to use this from various
>>   shells running inside Emacs.
> Can you provide details?  The above is too terse for me to understand
> the functionality.

Essentially what it does is "export EDITOR=emacsclient" without as if
that line existed in the shells init file.  When summarized like that,
this is of course a bit of a silly feature -- users can just put that
line in their init file instead.  (Also I should point out that I did
not actually want to add support for this, but got talked into it.)

The reason why people wanted me to this is that simply using
"emacsclient" as the value turned out not to be good enough.

>> > Emacs knows very well where to find its corresponding emacsclient.
>> I wasn't aware of that.  How can I make use of that knowledge?  I.e.,
>> is there a function that answers the question "what is the path of the
>> emacsclient that was installed with this version of emacs"?
> When Emacs runs installed, emacsclient is in the same directory where
> we install the Emacs binary, so emacsclient should be in
> invocation-directory.

"I have seen things you wouldn't believe..."

I wish this was true, but unfortunately keep coming up with new and
innovative ways of not doing that.  The worst platform is macOS, but I
also had to add a special case for Debian.  Users or distributions may
install emacs in a weird location, and then symlink emacs onto $PATH
(but without doing the same for emacsclient).  It is also possible to
install multiple versions of emacs in the same directory and append
version strings to the installed binaries.  To select one of these
versions a user/distribution may add a symlink named symlink in the
same directory.  One may or may not do the same for emacsclient.  If
emacsclient isn't a symlink, then an ancient emacsclient may still be
leftover from an earlier manual installed that was not properly
uninstalled. ...

> If Emacs runs uninstalled, emacsclient is in ../lib-src/ relative to
> invocation-directory.  Whether Emacs runs installed or not is
> determined by the value of installation-directory: if it's nil, Emacs
> runs installed.

... and that too.

> There could be a complication if the programs were renamed when
> installed (see TRANSFORM in the top-level Makefile).  When that
> happens, emacsclient's name is also TRANSFORMed in the same way.  You
> can find out what was the actual name under which Emacs was invoked
> from the value of invocation-name, and then apply the same TRANSFORM
> to the name of emacsclient.
>> > Why is there a need for a separate library?
>> I agree that there theoretically isn't a need for this library, but it
>> turned out that just setting EDITOR=emacsclient in the environment of
>> the sub process also doesn't cut it, because for many users (who never
>> use emacsclient directly), would have to add some configuration to make
>> it work.  The core and original functionality provided by with-editor,
>> is making the configuration unnecessary by using heuristics.
> Can you elaborate on the configuration that is needed?  I always
> thought that emacsclient worked for everybody OOTB.

Sadly that isn't the case, see above.

Normally these complications are the user's problem.  They may not even
use emacsclient.  If they don't actively choose to use emacsclient, they
will never know it is actually broken for them.  If they try to use it
and it doesn't work, they can decide whether it is worth trying to
figure out to work around those mistakes.  If they want to use it but
cannot fix it for themselves, they can contact the people who packaged
Emacs for them.

For me the situation was different, I started with something like this
in one of my packages, effectively forcing users to use "emacsclient":

  (let ((process-environment process-environment))
    (setenv "EDITOR"
            (expand-file-name "emacsclient" invocation-directory))
    (call-process "git" nil nil nil "commit"))

Like you I assumed this was a solved problem.

And then the "I cannot commit anymore" reports started pouring in.

I decided to implement with-editor, and to once in a while add a new
heuristic to detect the correct emacsclient, instead of having to
support users 1on1 for evermore, to figure out how exactly emacsclient
isn't located and/or named what it is supposed to be, in their
particular case.

>> > (I couldn't find the beginning of this discussion, so maybe I missed
>> > some of the relevant context, in which case I apologize.)
>> The text I quoted, was the very beginning of this discussion.
> Yes, but did RMS write anything that you haven't quoted?


> [[[ To any NSA and FBI agents reading my email: please consider    ]]]
> [[[ whether defending the US Constitution against all enemies,     ]]]
> [[[ foreign or domestic, requires you to follow Snowden's example. ]]]

and the signature?

No, the text I quoted is all of it.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]