Closed wwlytton closed 10 years ago
I just recent changed master in such a way that it should have fixed this. How recently had you pulled?
i had simply downloaded the .zip file; i'll clone instead; thanks
John Wiegley writes:
I just recent changed master in such a way that it should have fixed this. How recently had you pulled?
Reply to this email directly or view it on GitHub: https://github.com/jwiegley/emacs-async/issues/22#issuecomment-28032428
cloned current version and note that this error no longer present;thanks
FWIW, I believe I'm running into this today. I installed 4a7b07b via el-get but get an error like this when attempting to send with the documented smtpmail async config. Is this still an issue?
I'm not aware of it being an issue. Can you try a manual installation, and re-byte-compiling of async.el?
I just re-cloned and re-byte-compiled 4a7b07b and evaled the following:
(require 'smtpmail-async)
(setq
send-mail-function 'async-smtpmail-send-it
message-send-mail-function 'async-smtpmail-send-it)
I get the same error reported originally in this issue.
Will Maier notifications@github.com writes:
I just re-cloned and re-byte-compiled 4a7b07b and evaled the following:
(require 'smtpmail-async) (setq send-mail-function 'async-smtpmail-send-it message-send-mail-function 'async-smtpmail-send-it)
I get the same error reported originally in this issue.
I use smtpmail-async everyday and can't reproduce. Are you sure you have not a old async.el(c) somewhere in your load-path?
Thierry Get my Gnupg key: gpg --keyserver pgp.mit.edu --recv-keys 59F29997
I'm puzzled, too. M-x locate-library async
returns ~/.emacs.d/el-get/emacs-async/async.elc
, git status
returns 4a7b07b, I've re-run M-x byte-recompile-directory
a few times after wiping out the .elc files. And yet mu4e-compose-new
still bails with error in process sentinel: Invalid read syntax: "#"
.
I'm also encountering this issue with async-20140303.17
from elpa:
error in process sentinel: async-handle-result: Invalid read syntax: "#"
error in process sentinel: Invalid read syntax: "#"
I'm on OSX Mavericks with Emacs 24.3.1 (from Homebrew)
For me this is caused by the following three entries in the setq
form generated by async-inject-variables
:
mail-mode-abbrev-table '[## 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
smtpmail-address-buffer '#<killed buffer>
mail-header-format-function
'#[(header value)
"\302\303!!\304 :\203 @\202 \305\261\207"
[header value capitalize symbol-name ": " "\n"]
4 "Function to format headers without a specified formatting function."]
Try not byte-compiling the file containing your mail-header-format-function
. But I'm curious as to why this behavior has only now appeared.
Jason Terk notifications@github.com writes:
I'm also encountering this issue with async-20140303.17 from elpa:
error in process sentinel: async-handle-result: Invalid read syntax: "#" error in process sentinel: Invalid read syntax: "#"
Thanks for catching these infos, what I don't understand is why I have not these errors when sending mails. I will commit a fix to exclude the mentionned vars, please try.
Thierry Get my Gnupg key: gpg --keyserver pgp.mit.edu --recv-keys 59F29997
John Wiegley notifications@github.com writes:
But I'm curious as to why this behavior has only now appeared.
I am not sure of this, but it seems setting send-mail-function is involving other things than just setting message-send-mail-function. The mu4e manual says to users to set their send-mail* stuff like this:
--8<---------------cut here---------------start------------->8--- (setq send-mail-function 'async-smtpmail-send-it message-send-mail-function 'async-smtpmail-send-it) --8<---------------cut here---------------end--------------->8---
but send-mail-function is not needed because mu4e is using message-mode.
This is just an assumption, really not sure of this.
Thierry Get my Gnupg key: gpg --keyserver pgp.mit.edu --recv-keys 59F29997
Thanx for this quick new commit!!!
Indeed, the former error is gone! But now the started asynchronous process hangs while authenticating with the smtp server! I guess because the correct user is somehow not transmitted. See, I have tried with different smtp accounts:
With google no error in Messages but list-process buffer has:
Lisp expression: Opening STARTTLS connection to `smtp.gmail.com:587'...
Opening STARTTLS connection to `smtp.gmail.com:587'...done
Opening STARTTLS connection to `smtp.gmail.com:587'...
Opening STARTTLS connection to `smtp.gmail.com:587'...done
SMTP user name for smtp.gmail.com (default admin2):
Note: my user name at google is obviously not 'admin2'.
With another smtp server using SSL the async-procces does not hang but terminates with the error in Messages:
Sending...done
[mu4e] Message sent
error in process sentinel: async-handle-result: Sending failed: 503 AUTH first (#5.5.1)
error in process sentinel: Sending failed: 503 AUTH first (#5.5.1)
Btw. I'm also on OSX Mavericks with Emacs 24.3.50 (9.0) -- from Home-brew.
Adding the new exclusions to async-smtpmail-send-it
works for me. Is there a better solution than building a black list over time?
... and after a small elpa uninstall/reinstall dance I have async mail from mu4e working nicely. Thanks!
jterk, may I ask how you manage to authenticate with your smtp server? I still have that issue, see #22.
@emelin - I authenticate using the standard smtpmail mechanisms. I have the following set in my .emacs:
user-mail-address "me@mydomain.com"
smtpmail-default-smtp-server "smtp.mydomain.com"
smtpmail-local-domain "mydomain.com"
smtpmail-smtp-user "me@mydomain.com"
smtpmail-smtp-server "smtp.mydomain.com"
Credentials are in ~/.authinfo
machine smtp.mydomain.com login me@mydomain.com port 465 password PASSWORD_HERE
emelin notifications@github.com writes:
jterk, may I ask how you manage to authenticate with your smtp server? I still have that issue, see #22.
BTW you will find my smtp settings here in my .gnus.el file:
https://github.com/thierryvolpiatto/emacs-tv-config/blob/master/.gnus.el
I use a .authinfo.gpg file.
Are you using a local emacs or your emacs is remote?
If your emacs is remote, maybe you are prompted for a passwd and if you use a gpg agent, maybe you are prompted with a xwidget (e.g pinentry) which will not appear on your remote emacs?
Thierry Get my Gnupg key: gpg --keyserver pgp.mit.edu --recv-keys 59F29997
Ok, for testing I have reduced my otherwise well working multi-accounts setting to the very basics like described by jterk above. I also use authinfo and I sit in front of my local machine with emacs run as an app or in terminal --- no deference in result:
When setting message-send-mail-function to 'smtpmail-send-it the posts are:
Sending via mail...
Opening TLS connection to `mail.admin4linux.de'...
Opening TLS connection with `gnutls-cli --insecure -p 465 mail.admin4linux.de'...done
Opening TLS connection to `mail.admin4linux.de'...done
Decrypting /Users/admin2/Dropbox/_emacs/auth_sources/authinfo.gpg...done
Sending email
Sending email done
Mark set
When setting message-send-mail-function to 'async-smtpmail-send-it decryption seems just not to happen and the mail is not sent. See the postings:
Sending via mail...
Delivering message to ...
Mark set
Saving file /Users/...
Wrote /Users/...
Sending...done
[mu4e] Message sent
error in process sentinel: async-handle-result: Sending failed: 503 AUTH first (#5.5.1)
error in process sentinel: Sending failed: 503 AUTH first (#5.5.1)
If I change back by only setting the var message-send-mail-function to 'smtpmail-send-it again, sending works just fine again.
So it's very strange that decryption of the auth credentials seems to work for you both, but not for me.
What could I do next to hunt down that thing?
Update! After updating to async-20140307.2333 just right now, the error message change to:
Sending via mail...
Delivering message to ...
async--transmit-sexp: process emacs no longer connected to pipe; closed it
Btw, for my smtp server, I have to set:
(setq smtpmail-stream-type 'ssl)
to make the transmission work.
emelin notifications@github.com writes:
Ok, for testing I have reduced my otherwise well working multi-accounts setting to the very basics like described by jterk above. I also use authinfo and I sit in front of my local machine with emacs run as an app or in terminal --- no deference in result:
When setting message-send-mail-function to 'smtpmail-send-it the posts are:
Sending via mail... Opening TLS connection to
mail.admin4linux.de'... Opening TLS connection with
gnutls-cli --insecure -p 465 mail.admin4linux.de'...done Opening TLS connection to `mail.admin4linux.de'...done Decrypting /Users/admin2/Dropbox/_emacs/auth_sources/authinfo.gpg...done Sending email Sending email done Mark setWhen setting message-send-mail-function to 'async-smtpmail-send-it decryption seems just not to happen and the mail is not sent. See the postings:
Sending via mail... Delivering message to ... Mark set Saving file /Users/... Wrote /Users/... Sending...done [mu4e] Message sent error in process sentinel: async-handle-result: Sending failed: 503 AUTH first (#5.5.1) error in process sentinel: Sending failed: 503 AUTH first (#5.5.1)
If I change back by only setting the var message-send-mail-function to 'smtpmail-send-it again, sending works just fine again.
So it's very strange that decryption of the auth credentials seems to work for you both, but not for me.
I think that with your settings, smtpmail-via-smtp is called then exited (throw) to be called again, this time asking for password, unfortunately our child emacs exit immediately when the 'throw happen and give you no chance to enter your password and finish the process.
BTW are you using a gpg agent with a pinentry or your password is entered from an emacs prompt ?
Thierry Get my Gnupg key: gpg --keyserver pgp.mit.edu --recv-keys 59F29997
Thank you very much for comming back to my -- hopefully not all to ideosycratic -- problem!
In fact I use the gpg-agent and I use it while setting the env var GPG_AGENT_INFO in a adaptive way: a) If emacs runs as an app with graphic display, I set GPG_AGENT_INFO from the currently running gpa-agent that is configured to write its information to ~/.gpg-agent-info. The gpg-agent in this case is the one delivered by GPGTools and will run a graphical prompt for pinentry (if the pinentry is not set to take the passphrase from osx keychain -- but I guess this 'fine-tuning' doesn't matter here). b) If emacs runs in terminal on a remote machine, bash login takes care that there is a gpg-agent running and sets the env GPG_AGENT_INFO accoringly. The gpg-agent run in this case is the typical gnu one compiled via homebrew and pinenty is done by pinenty-curses.
Here is the relevant code branching the two cases:
(if (or (display-graphic-p)
(eq (getenv "SSH_CONNECTION") nil) ;; if terminal on machine with graphic capabilities,
) ;; use grphic pinentry AND re-read the GPG_AGENT_INFO for
;; older ttys that were created (like iterm at login) before the pgp-agent was started !!!
(setenv "GPG_AGENT_INFO"
(shell-command-to-string "source $HOME/.gpg-agent-info && printf $GPG_AGENT_INFO"))
)
As said, both cases work well, but simply not with asyc-smtpmail-send-it.
After updating from async-20140307.2333 to async-20140308.2217 the results in both cases are:
Sending via mail...
Delivering message to ...
async--transmit-sexp: Writing to process: bad file descriptor, emacs
Unfortunately I do not understand enough about child procces of emacs and what "(throw)" means, whether the child process is loading my entire .emacs or not, etc.
If necessary, however, I am happy to dig into that to finally sort out this issue here.
Thanx once more for your help.
Intresing update, perhaps: after sending a mail successfully in case a) and than switching to asyc-smtp-send-it the error is:
Sending via mail...
Delivering message to ...
async--transmit-sexp: process emacs no longer connected to pipe; closed it
This, though, is not the case in case b) where the above error persists, even after sending a mail sucessfully first.
emelin notifications@github.com writes:
Thank you very much for comming back to my -- hopefully not all to ideosycratic -- problem!
In fact I use the gpg-agent and I use it while setting the env var GPG_AGENT_INFO in a adaptive way: a) If emacs runs as an app with graphic display, I set GPG_AGENT_INFO from the currently running gpa-agent that is configured to write its information to ~ /.gpg-agent-info. The gpg-agent in this case is the one delivered by GPGTools and will run a graphical prompt for pinentry (if the pinentry is not set to take the passphrase from osx keychain -- but I guess this 'fine-tuning' doesn't matter here). b) If emacs runs in terminal on a remote machine, bash login takes care that there is a gpg-agent running and sets the env GPG_AGENT_INFO accoringly. The gpg-agent run in this case is the typical gnu one compiled via homebrew and pinenty is done by pinenty-curses.
Here is the relevant code branching the two cases:
(if (or (display-graphic-p) (eq (getenv "SSH_CONNECTION") nil) ;; if terminal on machine with graphic capabilities, ) ;; use grphic pinentry AND re-read the GPG_AGENT_INFO for ;; older ttys that were created (like iterm at login) before the pgp-agent was started !!! (setenv "GPG_AGENT_INFO" (shell-command-to-string "source $HOME/.gpg-agent-info && printf $GPG_AGENT_INFO")) )
Hmm, maybe this is the problem, the child emacs is not aware of this, so it doesn't find a way to authentificate and fail. i.e the GPG_AGENT_INFO env var is only known by the main emacs.
Thierry Get my Gnupg key: gpg --keyserver pgp.mit.edu --recv-keys 59F29997
Well that sounds like the right suspicion. The follow-up question then would be how to set/transmit the information normally extracted by smtpmail-send-it to the asyc child process?
There seems to be some of the relevant auth information accessible to other people, or is it generally impossible to use a gpg-agent with async-smtpmail-send-it?
emelin notifications@github.com writes:
Well that sounds like the right suspicion. The follow-up question then would be how to set/transmit the information normally extracted by smtpmail-send-it to the asyc child process?
There seems to be some of the relevant auth information accessible to other people, or is it generally impossible to use a gpg-agent with async-smtpmail-send-it?
You should have global settings at the (x)system level to allow you accessing gpg-agent info ?
What happen if you try to decrypt your .authinfo.gpg for example from a terminal or from an emacs -Q ?
To use `async-smtpmail-send-it' you should be prompted with a graphical pinentry or if you have already be prompted within the delay allowed by the agent (don't remember how much it is) the file should be decrypted immediately.
Thierry Get my Gnupg key: gpg --keyserver pgp.mit.edu --recv-keys 59F29997
On my (osx)system level everthing just works as expected:
I.)
gpg -d authinfo.gpg
always asks for my passphrase.
II.)
gpg2 -d authinfo.gpg
only asks once, then the gpg-agent delivers the passphrase for some time.
Starting up emacs -Q just behaves case II. So, I guess, emacs is executing gpg2 internally or is somehow calling the gpg-agent right away.
Either way, this works well and just as expected. There is no difference, if I do this on the local or the remote machine.
Checking the envir var -- also within emacs -Q by
(getenv "GPG_AGENT_INFO")
returns the right information about the gpg-agent, locally and remotely.
The question popping up to me now is, within what shell environment does the child process of `async-smtpmail-send-it' actually run?
Could it be that this environment simply misses the correct var(s) to be set?
I guess, for the gpg-agent this could be checked rather easily by advising a suitable function of `async-smtpmail-send-it' that would post the results of (getenv "GPG_AGENT_INFO") to the Message buffer, no?
Than we could decide about the current gpg suspect, right? Which function should we advice/modify to get this posting?
Thanx for holding on here!
emelin notifications@github.com writes:
On my (osx)system level everthing just works as expected:
I.)
gpg -d authinfo.gpg
always asks for my passphrase.
II.)
gpg2 -d authinfo.gpg
only asks once, then the gpg-agent delivers the passphrase for some time.
Starting up emacs -Q just behaves case II. So, I guess, emacs is executing gpg2 internally or is somehow calling the gpg-agent right away.
How are you decrypting your .authinfo.gpg from emacs -Q ? What prompt do you have in I. and II ? Graphical pinentry or emacs prompt ?
I am not sure of this but I think all emacs internals are assuming the gpg executable is "gpg" and not "gpg2", there was a discussion about this some time ago on emacs-dev.
https://lists.gnu.org/archive/html/emacs-devel/2013-09/msg00590.html
So I don't know really what is happening, but the problem is your configuration of gpg that is confusing emacs (gpg or gpg2).
Thierry Get my Gnupg key: gpg --keyserver pgp.mit.edu --recv-keys 59F29997
emelin notifications@github.com writes:
Than we could decide about the current gpg suspect, right? Which function should we advice/modify to get this posting?
Check out and install the issue22 branch and add:
(add-hook 'async-smtpmail-before-send-hook
(insert (getenv "GPG_AGENT_INFO")))))
Then try to send email, after failure, you should have infos in "/tmp/testasync" file.
Thierry Get my Gnupg key: gpg --keyserver pgp.mit.edu --recv-keys 59F29997
I decrypted authinfo.gpg from emacs -Q simply by visiting the file in a buffer, that is, I just opend the file by C-x C-f.
The prompt in case I. is right at the terminal; in case II. it is a graphical pinentry window.
-- next mail --
Thank you for following my suggestions for testing and providing that nice hook!!!
Now, the finding is that async process always has the same envir vars as the emacs main process.
I tested two cases:
1.) Setup with GPG_AGENT_INFO pointing to the running gpg-agent.
There is only one graphical prompt poping up before sending first email -- no further prompts.
2.) Setup with GPG_AGENT_INFO set to nil
There is only one prompt in the emeacs minibuffer before sending first email -- no further prompts.
When using async-smtpmail-send-it in either of the two cases, there is never a prompt for any passphrase entry.
So, to me at least, this all behaves just as it should -- no emacs confusion at all!
Btw: In all cases emacs seems to use gpg, since the var 'epg-gpg-program' has the value "/usr/local/bin/gpg".
Aerggggo, I found the culprit, finally !!!
Async process does not account for storing authinfo.gpg at another place, as I do by setting:
(setq auth-sources '((:source "~/Dropbox/_emacs/auth_sources/authinfo.gpg")))
So, what I needed to do was to provide a symlink to this other location at ~/.authinfo.gpg.
Couldn't `async-smtpmail-send-it' also look at auth-souces to find the right place for authinfo.gpg?
Cheers and thanx a lot for all the help! emelin
emelin notifications@github.com writes:
Aerggggo, I found the culprit, finally !!!
Great!
Async process does not account for storing authinfo.gpg at another place, as I do by setting:
(setq auth-sources '((:source "~/Dropbox/_emacs/auth_sources/authinfo.gpg")))
So, what I needed to do was to provide a symlink to this other location at ~ /.authinfo.gpg.
Couldn't `async-smtpmail-send-it' also look at auth-souces to find the right place for authinfo.gpg?
Yes I will add this.
Thanks.
Thierry Get my Gnupg key: gpg --keyserver pgp.mit.edu --recv-keys 59F29997
emelin notifications@github.com writes:
Couldn't `async-smtpmail-send-it' also look at auth-souces to find the right place for authinfo.gpg?
Done in issue22 branch, please try (remove your symlink), if working fine for you I will merge this in master.
Thanks.
Thierry Get my Gnupg key: gpg --keyserver pgp.mit.edu --recv-keys 59F29997
Yes, confirmed. It works great without the symlink now! Hurray!!!
i saw there was a discussion of errors comparable to this one below but i couldn't follow what the resolution was; anyway i simply tried to send a mail and got this error:
Debugger entered--Lisp error: (invalid-read-syntax "#") signal(invalid-read-syntax ("#")) (if (and (listp result) (eq (quote async-signal) (nth 0 result))) (signal (car (nth 1 result)) (cdr (nth 1 result))) (funcall func result)) (unwind-protect (if (and (listp result) (eq (quote async-signal) (nth 0 result))) (signal (car (nth 1 result)) (cdr (nth 1 result))) (funcall func result)) (unless async-debug (kill-buffer buf))) (if (null func) (progn (set (make-local-variable (quote async-callback-value)) result) (set (make-local-variable (quote async-callback-value-set)) t)) (unwind-protect (if (and (listp result) (eq (quote async-signal) (nth 0 result))) (signal (car (nth 1 result)) (cdr (nth 1 result))) (funcall func result)) (unless async-debug (kill-buffer buf)))) async-handle-result((lambda (&optional ignore) (message "Delivering message to %s...done" "neuro014@gmail.com")) (async-signal (invalid-read-syntax "#")) #<buffer emacs<4>>) (if async-callback-for-process (if async-callback (prog1 (funcall async-callback proc) (unless async-debug (kill-buffer (current-buffer)))) (set (make-local-variable (quote async-callback-value)) proc) (set (make-local-variable (quote async-callback-value-set)) t)) (goto-char (point-max)) (backward-sexp) (async-handle-result async-callback (read (current-buffer)) (current-buffer))) (if (= 0 (process-exit-status proc)) (if async-callback-for-process (if async-callback (prog1 (funcall async-callback proc) (unless async-debug (kill-buffer (current-buffer)))) (set (make-local-variable (quote async-callback-value)) proc) (set (make-local-variable (quote async-callback-value-set)) t)) (goto-char (point-max)) (backward-sexp) (async-handle-result async-callback (read (current-buffer)) (current-buffer))) (set (make-local-variable (quote async-callback-value)) (list (quote error) (format "Async process '%s' failed with exit code %d" (process-name proc) (process-exit-status proc)))) (set (make-local-variable (quote async-callback-value-set)) t)) (let ((async-current-process proc)) (if (= 0 (process-exit-status proc)) (if async-callback-for-process (if async-callback (prog1 (funcall async-callback proc) (unless async-debug (kill-buffer (current-buffer)))) (set (make-local-variable (quote async-callback-value)) proc) (set (make-local-variable (quote async-callback-value-set)) t)) (goto-char (point-max)) (backward-sexp) (async-handle-result async-callback (read (current-buffer)) (current-buffer))) (set (make-local-variable (quote async-callback-value)) (list (quote error) (format "Async process '%s' failed with exit code %d" (process-name proc) (process-exit-status proc)))) (set (make-local-variable (quote async-callback-value-set)) t))) (save-current-buffer (set-buffer (process-buffer proc)) (let ((async-current-process proc)) (if (= 0 (process-exit-status proc)) (if async-callback-for-process (if async-callback (prog1 (funcall async-callback proc) (unless async-debug (kill-buffer ...))) (set (make-local-variable (quote async-callback-value)) proc) (set (make-local-variable (quote async-callback-value-set)) t)) (goto-char (point-max)) (backward-sexp) (async-handle-result async-callback (read (current-buffer)) (current-buffer))) (set (make-local-variable (quote async-callback-value)) (list (quote error) (format "Async process '%s' failed with exit code %d" (process-name proc) (process-exit-status proc)))) (set (make-local-variable (quote async-callback-value-set)) t)))) (with-current-buffer (process-buffer proc) (let ((async-current-process proc)) (if (= 0 (process-exit-status proc)) (if async-callback-for-process (if async-callback (prog1 (funcall async-callback proc) (unless async-debug (kill-buffer ...))) (set (make-local-variable (quote async-callback-value)) proc) (set (make-local-variable (quote async-callback-value-set)) t)) (goto-char (point-max)) (backward-sexp) (async-handle-result async-callback (read (current-buffer)) (current-buffer))) (set (make-local-variable (quote async-callback-value)) (list (quote error) (format "Async process '%s' failed with exit code %d" (process-name proc) (process-exit-status proc)))) (set (make-local-variable (quote async-callback-value-set)) t)))) (progn (with-current-buffer (process-buffer proc) (let ((async-current-process proc)) (if (= 0 (process-exit-status proc)) (if async-callback-for-process (if async-callback (prog1 (funcall async-callback proc) (unless async-debug ...)) (set (make-local-variable ...) proc) (set (make-local-variable ...) t)) (goto-char (point-max)) (backward-sexp) (async-handle-result async-callback (read (current-buffer)) (current-buffer))) (set (make-local-variable (quote async-callback-value)) (list (quote error) (format "Async process '%s' failed with exit code %d" (process-name proc) (process-exit-status proc)))) (set (make-local-variable (quote async-callback-value-set)) t))))) (if (eq (quote exit) (process-status proc)) (progn (with-current-buffer (process-buffer proc) (let ((async-current-process proc)) (if (= 0 (process-exit-status proc)) (if async-callback-for-process (if async-callback (prog1 ... ...) (set ... proc) (set ... t)) (goto-char (point-max)) (backward-sexp) (async-handle-result async-callback (read ...) (current-buffer))) (set (make-local-variable (quote async-callback-value)) (list (quote error) (format "Async process '%s' failed with exit code %d" ... ...))) (set (make-local-variable (quote async-callback-value-set)) t)))))) (when (eq (quote exit) (process-status proc)) (with-current-buffer (process-buffer proc) (let ((async-current-process proc)) (if (= 0 (process-exit-status proc)) (if async-callback-for-process (if async-callback (prog1 (funcall async-callback proc) (unless async-debug ...)) (set (make-local-variable ...) proc) (set (make-local-variable ...) t)) (goto-char (point-max)) (backward-sexp) (async-handle-result async-callback (read (current-buffer)) (current-buffer))) (set (make-local-variable (quote async-callback-value)) (list (quote error) (format "Async process '%s' failed with exit code %d" (process-name proc) (process-exit-status proc)))) (set (make-local-variable (quote async-callback-value-set)) t))))) async-when-done(#<process emacs<3>> "finished\n")