Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

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

0 views
Skip to first unread message

Jonas Bernoulli

unread,
Nov 7, 2009, 7:28:44 AM11/7/09
to bug-gn...@gnu.org
ping

On Sun, Jun 21, 2009 at 02:43, Jonas Bernoulli <jo...@bernoul.li> wrote:
> 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
>
>
>
>
>


Stefan Monnier

unread,
Nov 7, 2009, 10:50:15 PM11/7/09
to Jonas Bernoulli, 36...@emacsbugs.donarmstrong.com
>> But when he does, emacsclient never returns. So I tried using
>> unwind-protect to make sure that emacsclient always returns:

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


Stefan

Glenn Morris

unread,
Jul 12, 2011, 7:07:08 PM7/12/11
to 3634...@debbugs.gnu.org
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))")

0 new messages