]> code.delx.au - gnu-emacs-elpa/blob - packages/async/README.md
Update packages/yasnippet by subtree-merging from its github-based upstream
[gnu-emacs-elpa] / packages / async / README.md
1 <p><a href="http://www.gnu.org/licenses/gpl-3.0.txt"><img src="https://img.shields.io/badge/license-GPL_3-green.svg" alt="License GPL 3" /></a>
2 <a href="http://melpa.org/#/async"><img src="http://melpa.org/packages/async-badge.svg" alt="MELPA" title="" /></a>
3 <a href="http://stable.melpa.org/#/async"><img src="http://stable.melpa.org/packages/async-badge.svg" alt="MELPA Stable" title="" /></a></p>
4
5
6 # emacs-async
7
8 `async.el` is a module for doing asynchronous processing in Emacs.
9
10 # Install
11
12 ## Install dired-async
13
14 Add to your `.emacs.el`:
15
16 (autoload 'dired-async-mode "dired-async.el" nil t)
17 (dired-async-mode 1)
18
19 This will allow you to run asynchronously
20 the dired commands for copying, renaming and symlinking.
21 If you are a [helm](https://github.com/emacs-helm/helm) user, this will allow you
22 to copy, rename etc... asynchronously from [helm](https://github.com/emacs-helm/helm).
23 Note that with [helm](https://github.com/emacs-helm/helm)
24 you can disable this by running the copy, rename etc... commands with a prefix argument.
25
26 If you don't want to make dired/helm asynchronous disable it with `dired-async-mode`.
27
28 ## Enable asynchronous compilation of your (M)elpa packages
29
30 By default emacs package.el compile packages in its running emacs session.
31 This is not a problem when installing a new package (which is not actually loaded in current emacs)
32 but it may create errors and bad compilation when upgrading a package (old version of package is already loaded
33 and running in current emacs).
34 You can remedy to this by allowing async to compile your packages asynchronously,
35 (helm and magit actually do this by default,
36 so if you are using these packages they will compile asynchronously)
37 to do this, add to your init file:
38
39 (async-bytecomp-package-mode 1)
40
41
42 You can control which packages will compile async with `async-bytecomp-allowed-packages`.
43 Set it to `'(all)` to be sure you will compile all packages asynchronously.
44
45 # Usage
46
47 The interface is intended to be very easy to use:
48
49 ## async-start
50
51 async-start START-FUNC FINISH-FUNC
52
53 Execute START-FUNC (often a lambda) in a subordinate Emacs process. When
54 done, the return value is passed to FINISH-FUNC. Example:
55
56 (async-start
57 ;; What to do in the child process
58 (lambda ()
59 (message "This is a test")
60 (sleep-for 3)
61 222)
62
63 ;; What to do when it finishes
64 (lambda (result)
65 (message "Async process done, result should be 222: %s" result)))
66
67 If FINISH-FUNC is `nil` or missing, a future is returned that can be inspected
68 using `async-get`, blocking until the value is ready. Example:
69
70 (let ((proc (async-start
71 ;; What to do in the child process
72 (lambda ()
73 (message "This is a test")
74 (sleep-for 3)
75 222))))
76
77 (message "I'm going to do some work here") ;; ....
78
79 (message "Waiting on async process, result should be 222: %s"
80 (async-get proc)))
81
82 If you don't want to use a callback, and you don't care about any return value
83 from the child process, pass the `'ignore` symbol as the second argument (if
84 you don't, and never call `async-get`, it will leave ``*emacs*`` process buffers
85 hanging around):
86
87 (async-start
88 (lambda ()
89 (delete-file "a remote file on a slow link" nil))
90 'ignore)
91
92 Note: Even when FINISH-FUNC is present, a future is still returned except that
93 it yields no value (since the value is passed to FINISH-FUNC). Calling
94 `async-get` on such a future always returns `nil`. It can still be useful,
95 however, as an argument to `async-ready` or `async-wait`.
96
97 ## async-start-process
98
99 async-start-process NAME PROGRAM FINISH-FUNC &rest PROGRAM-ARGS
100
101 Start the executable PROGRAM asynchronously. See `async-start`. PROGRAM is
102 passed PROGRAM-ARGS, calling FINISH-FUNC with the process object when done.
103 If FINISH-FUNC is `nil`, the future object will return the process object when
104 the program is finished. Set DEFAULT-DIRECTORY to change PROGRAM's current
105 working directory.
106
107 ## async-get
108
109 async-get FUTURE
110
111 Get the value from an asynchronously called function when it is ready. FUTURE is
112 returned by `async-start` or `async-start-process` when its FINISH-FUNC is
113 `nil`.
114
115 ## async-ready
116
117 async-ready FUTURE
118
119 Query a FUTURE to see if its function's value is ready -- i.e., if no blocking
120 would result from a call to `async-get` on that FUTURE.
121
122 ## async-wait
123
124 async-wait FUTURE
125
126 Wait for FUTURE to become ready.
127
128 ## async-inject-variables
129
130 async-inject-variables INCLUDE-REGEXP &optional PREDICATE EXCLUDE-REGEXP
131
132 Return a `setq` form that replicates part of the calling environment. It sets
133 the value for every variable matching INCLUDE-REGEXP and also PREDICATE. It
134 will not perform injection for any variable matching EXCLUDE-REGEXP (if
135 present). It is intended to be used as follows:
136
137 (async-start
138 `(lambda ()
139 (require 'smtpmail)
140 (with-temp-buffer
141 (insert ,(buffer-substring-no-properties (point-min) (point-max)))
142 ;; Pass in the variable environment for smtpmail
143 ,(async-inject-variables "\\`\\(smtpmail\\|\\(user-\\)?mail\\)-")
144 (smtpmail-send-it)))
145 'ignore)