help-gnu-emacs
[Top][All Lists]

## Re: Problem quoting expression to be eval'ed by emacsclient

 From: Sebastien Vauban Subject: Re: Problem quoting expression to be eval'ed by emacsclient Date: Wed, 30 Oct 2013 10:59:24 +0100 User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3.50 (windows-nt)

```Eli Zaretskii wrote:
>> Date: Fri, 25 Oct 2013 14:37:28 +0200
>>
>>>> The above tests I made are from a Cygwin Zsh session.
>>>
>>> And emacsclient was a Cygwin build or a native build? If the latter, your
>>> problems could be due to this mix. (Your example works for me from cmd and
>>> even from MSYS Bash.)
>>
>> That does indeed makes a difference:
>>
>> --8<---------------cut here---------------start------------->8---
>> \$ emacsclient -e "(message \"hello\")"
>>
>> *ERROR*: End of file during parsing
>> --8<---------------cut here---------------end--------------->8---
>>
>> --8<---------------cut here---------------start------------->8---
>> \$ /usr/bin/emacsclient -e "(message \"hello\")"
>> /usr/bin/emacsclient: can't find socket; have you started the server?
>> To start the server in Emacs, type "M-x server-start".
>> "hello"
>> --8<---------------cut here---------------end--------------->8---
>
> I'm confused: didn't you say that /usr/bin is a Cygwin directory?

Yes, it is.

> If so, /usr/bin/emacsclient is a Cygwin build of emacsclient, right?

Right.

> Then what kind of emacsclient is in ~/bin?

That was answered later in my post; ~/bin/emacsclient is the following script:

--8<---------------cut here---------------start------------->8---
"C:/Program Files (x86)/emacs-trunk/bin/emacsclient" \$@
--8<---------------cut here---------------end--------------->8---

That's (mostly) a way to bypass the Cygwin emacsclient, as ~/bin is before
/usr/bin in my PATH environment variable:

--8<---------------cut here---------------start------------->8---
/cygdrive/d/Users/sva/bin
/cygdrive/d/Users/sva/winbin
...
/usr/bin
...
/cygdrive/c/Windows/system32
/cygdrive/c/Windows
...
--8<---------------cut here---------------end--------------->8---

IOW, a way to be able to instruct which "real" emacsclient program I want to
invoke when I type emacsclient in a shell, without the need to play with the
PATH environment variable.

>> However, that still leaves me with the following problem:
>>
>>   How can I work in a correct shell on Windows (read: not `cmd.exe'), and
>>   edit in my graphical Emacs w32?
>
> My best advice is to avoid that combination entirely.  It's just too
> fragile and replete of subtle "issues".
>
> Let me turn the table and ask why do you need to invoke emacsclient
> from the shell command line?  Why not simply visit the file from the
> running Emacs?  (You do have an Emacs session running at all times,
> right?)  emacsclient is mainly for letting other programs ask Emacs to
> edit a file.  Since the w32 Emacs does not support multiple tty
> devices in the same session, even invoking "emacsclient -t" bu hand
> doesn't make sense when the server is the w32 Emacs.  So I wonder why
> do you use this at all.

You're right asking such questions about the "why". It sometimes can be very
enlightening.

So, here, in my case, I almost only use `emacsclient' from "sendpatch", a shell
script (I wrote) which automates the sending of a diff per email, for other
colleagues to review and see what we commit in our SVN server.

High-level, what sendpatch does is the following:

1. it makes a patch file with the output of "svn diff",
2. asks for an email subject,
3. launches the preferred EDITOR of the user to let him write a more complete
commit message,
4. commits the diff in SVN, and
5. sends the "review" on a mailing list.

In my case, EDITOR is `emacsclient'. For other colleagues, it can be `vi' or
some such.

That script is written in Bash; it heavily relies on standard Unix commands
such as `cut', `grep', `head', `awk', etc.

> Another pertinent question is: why not use the Cygwin build of Emacs?
> It does support GUI sessions, and can even be built with the w32
> graphics as its "toolkit".

You're talking of the Cygwin package emacs-w32, right?

I wasn't aware of it. I will give it a try...

I thought that the graphical Cygwin Emacs was only a X-version (installed via
the Cygwin package emacs-X11, IIUC).

> If you use a Cygwin Emacs and emacsclient from the Cygwin shell, I don't
> expect you to have any problems with quoting.
>
> But if, for some reason, you must use this crazy mix, then I suggest
> to at least switch to the MSYS Bash.  It is friendlier to native
> programs than Cygwin shells, although you will have problems there as
> well.

But I'd loose Zsh, right?  OK, honestly, apart using `M-q' (to type another
command in the middle of a long command) and `vared' (to interactively a edit
variable), I don't really use special Zsh features either.

>> - an Emacs server must be contacted by an `emacsclient' of the same release
>
> This is not really accurate.  It's just that the format of the server
> file changed between Emacs 23 and 24, so you cannot mix client and
> server that are on different sides of that schism.

Thanks for the precision.

>> - Cygwin (/usr/bin) is second in my PATH, after ~/bin
>
> Why do you need Cygwin executables on your PATH?

You mean from PATH as seen in a CMD shell?  Or from a Bash shell?

I need the Cygwin executables them all the time in my Bash sessions.

And I need the Cygwin executables from Emacs as well (for the `M-x
find-grep-dired' or `M-x rgrep' commands, among others, which I use quite
extensively -- `rgrep', at least). And, there, I need them to be before the
default Windows executable, because of `find' (which also exist in
c:\Windows\system32).

Though, it's certainly possible to `setq' a couple (or a lot?) of vars to avoid

> And what kind of programs are in ~/bin?
>
>> I currently have a small `~/bin/emacsclient' script (one-liner) which allows
>> me
>> to set the full path to the right `emacsclient' without having to fiddle with
>> the PATH environment variable (as that requires me to quit my shell, and
>> start
>> a new one):
>>
>> --8<---------------cut here---------------start------------->8---
>> "C:/Program Files (x86)/emacs-trunk/bin/emacsclient" \$@
>> --8<---------------cut here---------------end--------------->8---
>>
>> This is a hack.
>
> I don't see anything wrong with such a script.  But it only works
> around the PATH problem, it does nothing to alleviate the subtle
> incompatibilities between native Windows executables and Cygwin/MSYS
> executables.

Rigth. And these are subtle incompatibilities about which I was unaware up to a
couple of days ago...

>> Indeed, I'd like to be able to launch whichever Emacs version
>> (clicking on one of the many versions I have on my Windows desktop), and that
>> launching `emacsclient' in the shell would work in all contexts.
>
> See above: I don't understand why you are invoking emacsclient in the
> first place.

I hope you now do.

> As for the v23 vs v24 emacsclient issue, you could have emacsclient23
> and emacsclient24 (scripts, aliases, whatever) to DTRT for each one.

Yes, but the question arises from the fact that `sendpatch' has no way to
detect (does it?) which Emacs server version is currently running, so which
`emacsclient' it has to call.