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)))

View file

@ -22,12 +22,14 @@ these properties:
:ignore BOOL
If non-nil, don't expand any template for this file and don't test any other
file template rule against this buffer."
`(push (list ,pred ,@plist) +file-templates-alist))
(after! (:when (boundp '+file-templates-alist))
(push `(,pred ,@plist) +file-templates-alist)))
;;;###autodef
(defun set-file-templates! (&rest templates)
"Like `doom--set:file-template', but register many file templates at once."
`(setq +file-templates-alist (append (list ,@templates) +file-templates-alist)))
(after! (:when (boundp '+file-templates-alist))
(setq +file-templates-alist (append (list templates) +file-templates-alist))))
;; FIXME obsolete :file-template
;;;###autoload