X-Git-Url: https://code.delx.au/gnu-emacs-elpa/blobdiff_plain/3290d462da4a7b1362e4c57a9a1623bc4bd289b3..f10533854f4c7bb54247a11981191bf37b70cb36:/packages/async/async.el diff --git a/packages/async/async.el b/packages/async/async.el index 20a2f1701..6619fffee 100644 --- a/packages/async/async.el +++ b/packages/async/async.el @@ -1,10 +1,10 @@ -;;; async.el --- Asynchronous processing in Emacs +;;; async.el --- Asynchronous processing in Emacs -*- lexical-binding: t -*- ;; Copyright (C) 2012-2016 Free Software Foundation, Inc. ;; Author: John Wiegley ;; Created: 18 Jun 2012 -;; Version: 1.6 +;; Version: 1.9 ;; Keywords: async ;; X-URL: https://github.com/jwiegley/emacs-async @@ -54,14 +54,14 @@ matching EXCLUDE-REGEXP (if present). It is intended to be used as follows: (async-start - `(lambda () - (require 'smtpmail) + \\=`(lambda () + (require \\='smtpmail) (with-temp-buffer (insert ,(buffer-substring-no-properties (point-min) (point-max))) ;; Pass in the variable environment for smtpmail - ,(async-inject-variables \"\\`\\(smtpmail\\|\\(user-\\)?mail\\)-\") + ,(async-inject-variables \"\\\\=`\\(smtpmail\\|\\(user-\\)?mail\\)-\") (smtpmail-send-it))) - 'ignore)" + \\='ignore)" `(setq ,@(let (bindings) (mapatoms @@ -95,8 +95,8 @@ as follows: (unless async-debug (kill-buffer buf))))) -(defun async-when-done (proc &optional change) - "Process sentinal used to retrieve the value from the child process." +(defun async-when-done (proc &optional _change) + "Process sentinel used to retrieve the value from the child process." (when (eq 'exit (process-status proc)) (with-current-buffer (process-buffer proc) (let ((async-current-process proc)) @@ -121,7 +121,9 @@ as follows: (defun async--receive-sexp (&optional stream) (let ((sexp (decode-coding-string (base64-decode-string - (read stream)) 'utf-8-unix))) + (read stream)) 'utf-8-unix)) + ;; Parent expects UTF-8 encoded text. + (coding-system-for-write 'utf-8-unix)) (if async-debug (message "Received sexp {{{%s}}}" (pp-to-string sexp))) (setq sexp (read sexp)) @@ -130,7 +132,10 @@ as follows: (eval sexp))) (defun async--insert-sexp (sexp) - (let (print-level print-length) + (let (print-level + print-length + (print-escape-nonascii t) + (print-circle t)) (prin1 sexp (current-buffer)) ;; Just in case the string we're sending might contain EOF (encode-coding-region (point-min) (point-max) 'utf-8-unix) @@ -147,18 +152,21 @@ as follows: (defun async-batch-invoke () "Called from the child Emacs process' command-line." - (setq async-in-child-emacs t - debug-on-error async-debug) - (if debug-on-error - (prin1 (funcall - (async--receive-sexp (unless async-send-over-pipe - command-line-args-left)))) - (condition-case err - (prin1 (funcall - (async--receive-sexp (unless async-send-over-pipe - command-line-args-left)))) - (error - (prin1 (list 'async-signal err)))))) + ;; Make sure 'message' and 'prin1' encode stuff in UTF-8, as parent + ;; process expects. + (let ((coding-system-for-write 'utf-8-unix)) + (setq async-in-child-emacs t + debug-on-error async-debug) + (if debug-on-error + (prin1 (funcall + (async--receive-sexp (unless async-send-over-pipe + command-line-args-left)))) + (condition-case err + (prin1 (funcall + (async--receive-sexp (unless async-send-over-pipe + command-line-args-left)))) + (error + (prin1 (list 'async-signal err))))))) (defun async-ready (future) "Query a FUTURE to see if the ready is ready -- i.e., if no blocking @@ -193,7 +201,7 @@ its FINISH-FUNC is nil." (funcall async-callback args)) (async--transmit-sexp (car args) (list 'quote (cdr args)))))) -(defun async-receive (&rest args) +(defun async-receive () "Send the given messages to the asychronous Emacs PROCESS." (async--receive-sexp)) @@ -249,21 +257,23 @@ ready. Example: (async-get proc))) If you don't want to use a callback, and you don't care about any -return value form the child process, pass the `ignore' symbol as +return value from the child process, pass the `ignore' symbol as the second argument (if you don't, and never call `async-get', it will leave *emacs* process buffers hanging around): (async-start (lambda () (delete-file \"a remote file on a slow link\" nil)) - 'ignore) + \\='ignore) Note: Even when FINISH-FUNC is present, a future is still returned except that it yields no value (since the value is passed to FINISH-FUNC). Call `async-get' on such a future always returns nil. It can still be useful, however, as an argument to `async-ready' or `async-wait'." - (let ((sexp start-func)) + (let ((sexp start-func) + ;; Subordinate Emacs will send text encoded in UTF-8. + (coding-system-for-read 'utf-8-unix)) (setq async--procvar (async-start-process "emacs" (file-truename