summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Mendler <mail@daniel-mendler.de>2021-11-28 23:38:02 +0100
committerDaniel Mendler <mail@daniel-mendler.de>2021-11-28 23:38:29 +0100
commitb3e2850fcfe63d06f8e00ba985d964a4ba6e3935 (patch)
treed589d5d342d6f726215d841e6a98892bc93d6ef0
parentb8776afc9fe7897f732f0e9d54268060364481e4 (diff)
Add unwind-protect
-rw-r--r--cape.el30
1 files changed, 16 insertions, 14 deletions
diff --git a/cape.el b/cape.el
index 6251e11..d653593 100644
--- a/cape.el
+++ b/cape.el
@@ -744,20 +744,22 @@ If INTERACTIVE is nil the function acts like a capf."
(`(:async . ,future)
(let ((res 'cape--waiting)
(start (time-to-seconds)))
- (funcall future (lambda (arg)
- (when (eq res 'cape--waiting)
- (push 'cape--event unread-command-events))
- (setq res arg)))
- ;; Force synchronization.
- (while (eq res 'cape--waiting)
- ;; When we've got input, interrupt the computation.
- (when (and unread-command-events toi)
- (throw toi nil))
- (when (> (- (time-to-seconds) start) cape-company-timeout)
- (error "Cape company backend async timeout"))
- (sit-for 0.1 'noredisplay))
- ;; Remove cape--events introduced by future callback
- (setq unread-command-events (delq 'cape--event unread-command-events))
+ (unwind-protect
+ (progn
+ (funcall future (lambda (arg)
+ (when (eq res 'cape--waiting)
+ (push 'cape--event unread-command-events))
+ (setq res arg)))
+ ;; Force synchronization.
+ (while (eq res 'cape--waiting)
+ ;; When we've got input, interrupt the computation.
+ (when (and unread-command-events toi)
+ (throw toi nil))
+ (when (> (- (time-to-seconds) start) cape-company-timeout)
+ (error "Cape company backend async timeout"))
+ (sit-for 0.1 'noredisplay)))
+ ;; Remove cape--events introduced by future callback
+ (setq unread-command-events (delq 'cape--event unread-command-events)))
res))
(res res))))