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: Jonas Bernoulli <jonas <at> bernoul.li>
To: bug-gnu-emacs <at> gnu.org
Subject: bug#3634: emacsclient: unwind-protect prevents printing final  form
Date: Sat, 7 Nov 2009 13:28:44 +0100
ping

On Sun, Jun 21, 2009 at 02:43, Jonas Bernoulli <jonas <at> 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
>
>
>
>
>




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.