Add :when support to after!

This lets you delay a body of code until an arbitrary condition is
met (which is checked whenever a file is loaded).

Also refactors set-file-template! to wait until +file-templates-alist is
defined.
This commit is contained in:
Henrik Lissner 2018-06-15 03:03:32 +02:00
parent d8b1e469bc
commit 2496e0348d
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
2 changed files with 18 additions and 3 deletions

View file

@ -226,7 +226,20 @@ compilation. This will no-op on features that have been disabled by the user."
(load next :no-message :no-error))))
#'progn
#'with-no-warnings)
(cond ((symbolp targets)
(cond ((eq (car-safe targets) :when)
`(if ,(cadr targets)
(progn ,@body)
,(let* ((hook 'after-load-functions)
(fun (intern (format "doom|delay-form-in-%s" hook))))
`(progn
(fset ',fun (lambda (&rest args)
(when ,(or (car (cdr-safe targets)) t)
(remove-hook ',hook #',fun)
(ignore args)
,@body)))
(put ',fun 'permanent-local-hook t)
(add-hook ',hook #',fun)))))
((symbolp targets)
`(eval-after-load ',targets '(progn ,@body)))
((and (consp targets)
(memq (car targets) '(:or :any)))