GNU bug report logs - #3634
emacsclient: unwind-protect prevents printing final form

Previous Next

Package: emacs;

Reported by: Jonas Bernoulli <jonas <at> bernoul.li>

Date: Sun, 21 Jun 2009 01:45:04 UTC

Severity: normal

Tags: moreinfo, notabug

Done: Glenn Morris <rgm <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: help-debbugs <at> gnu.org (GNU bug Tracking System)
To: Glenn Morris <rgm <at> gnu.org>
Cc: tracker <at> debbugs.gnu.org
Subject: bug#3634: closed (emacsclient: unwind-protect prevents printing
 final form)
Date: Tue, 12 Jul 2011 23:08:02 +0000
[Message part 1 (text/plain, inline)]
Your message dated Tue, 12 Jul 2011 19:07:08 -0400
with message-id <ps8vs3rtcz.fsf <at> fencepost.gnu.org>
and subject line Re: bug#3634: emacsclient: unwind-protect prevents printing final form
has caused the GNU bug report #3634,
regarding emacsclient: unwind-protect prevents printing final form
to be marked as done.

(If you believe you have received this mail in error, please contact
help-debbugs <at> gnu.org.)


-- 
3634: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=3634
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
From: Jonas Bernoulli <jonas <at> bernoul.li>
To: bug-gnu-emacs <at> gnu.org
Subject: emacsclient: unwind-protect prevents printing final form
Date: Sun, 21 Jun 2009 03:43:12 +0200
Hi

I am trying to write a wrapper around emacsclient that would allow
emacs to be used by external applications to complete some string.

However it does not seem to be possible to
1. return the last form and
2. ensure that emacsclient always returns
at the same time.

(The following examples assumes default-minibuffer-frame exists. Just
remove the respective line if it doesn't.)

This works as long as the user does not abort:

#!/bin/bash
STRING=$(emacsclient -e "\
(select-frame-set-input-focus default-minibuffer-frame)
(read-string \"> \")"
echo ${STRING:1:$((${#STRING}-2))

But when he does, emacsclient never returns. So I tried using
unwind-protect to make sure that emacsclient always returns:

#!/bin/bash
STRING=$(emacsclient -e "\
(let ((emonad-client (car server-clients)))
  (select-frame-set-input-focus default-minibuffer-frame)
  (unwind-protect (read-string \"> \")
    (when (memq emonad-client server-clients)
      (server-delete-client emonad-client t))))")
echo ${STRING:1:$((${#STRING}-2))

Now my script always returns but fails to print the final form to
standard output even when input was NOT aborted.

I tried several things to work around this:

1. Store the return value of read-string in some variable, and using
the variable as last form of let. When I use (message "veni vedi %s"
tmp) as last form I can see that forms after unwind-protect are
actually evaluated, the last form's value is just never printed to
stout.
2. condition-case
3. catch

However in all cases nothing was printed to standard output. It seems
that as soon as some non-local exit is used emacsclient refuses to
print anything to stout. And since exit-minibuffer does (throw 'exit
nil) to abort minibuffer output there is now way to prevent such an
non-local exit.

As a workaround it might be possible to explicitly print to stout, but
I could not find any information on how to do that.

thx

Jonas


[Message part 3 (message/rfc822, inline)]
From: Glenn Morris <rgm <at> gnu.org>
To: 3634-done <at> debbugs.gnu.org
Subject: Re: bug#3634: emacsclient: unwind-protect prevents printing final form
Date: Tue, 12 Jul 2011 19:07:08 -0400
Stefan Monnier wrote:

> I'd expect that using condition-case to catch `quit' would work.
> Have you tried it?

Works for me.

STRING=$(emacsclient -e "(condition-case nil (read-string \"> \") (quit nil))")


This bug report was last modified 13 years and 316 days ago.

Previous Next


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