diff --git a/core/core-editor.el b/core/core-editor.el index 6971f2b67..844052373 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -83,14 +83,15 @@ fundamental-mode) for performance sake." ;; revert buffers for changed files (def-package! autorevert - :defer doom-before-switch-buffer-hook + :after-call doom-before-switch-buffer-hook :config (setq auto-revert-verbose nil) (global-auto-revert-mode +1)) ;; persist variables across sessions (def-package! savehist - :defer (pre-command-hook . 1) + :defer 1 + :after-call post-command-hook :config (setq savehist-file (concat doom-cache-dir "savehist") savehist-save-minibuffer-history t @@ -100,7 +101,7 @@ fundamental-mode) for performance sake." ;; persistent point location in buffers (def-package! saveplace - :defer doom-before-switch-buffer-hook + :after-call doom-before-switch-buffer-hook :config (setq save-place-file (concat doom-cache-dir "saveplace")) (defun doom*recenter-on-load-saveplace (&rest _) @@ -112,7 +113,8 @@ fundamental-mode) for performance sake." ;; Keep track of recently opened files (def-package! recentf - :defer (pre-command-hook . 1) + :defer 1 + :after-call find-file-hook :commands recentf-open-files :config (setq recentf-save-file (concat doom-cache-dir "recentf") @@ -135,7 +137,7 @@ fundamental-mode) for performance sake." ;; Auto-close delimiters and blocks as you type (def-package! smartparens - :defer doom-before-switch-buffer-hook + :after-call doom-before-switch-buffer-hook :commands (sp-pair sp-local-pair sp-with-modes) :config (require 'smartparens-config) @@ -155,7 +157,7 @@ fundamental-mode) for performance sake." ;; Branching undo (def-package! undo-tree - :defer doom-before-switch-buffer-hook + :after-call doom-before-switch-buffer-hook :config ;; persistent undo history is known to cause undo history corruption, which ;; can be very destructive! So disable it! @@ -176,7 +178,7 @@ fundamental-mode) for performance sake." command-log-mode-open-log-turns-on-mode t)) (def-package! dtrt-indent - :defer t + :after-call doom-before-switch-buffer-hook :config (setq dtrt-indent-verbosity (if doom-debug-mode 2 0)) diff --git a/core/core-packages.el b/core/core-packages.el index 3d431f1c7..ece2af661 100644 --- a/core/core-packages.el +++ b/core/core-packages.el @@ -459,11 +459,44 @@ added, if the file exists." ;; Use-package modifications ;; -(autoload 'use-package "use-package" nil nil 'macro) +(autoload 'use-package "use-package-core" nil 'macro) -;; TODO :after-hook HOOK (load packages on first run of HOOK) -;; TODO Make +(after! use-package-core + (add-to-list 'use-package-deferring-keywords :after-call nil #'eq) + (setq use-package-keywords + (use-package-list-insert :after-call use-package-keywords :after)) + + (defalias 'use-package-normalize/:after-call + 'use-package-normalize-symlist) + + (defvar doom--deferred-packages-alist () + "TODO") + + (defun use-package-handler/:after-call (name-symbol _keyword hooks rest state) + (let ((fn (intern (format "doom|transient-hook--load-%s" name-symbol))) + (hooks (delete-dups hooks))) + (if (plist-get state :demand) + (use-package-process-keywords name rest state) + (use-package-concat + `((fset ',fn + (lambda (&rest _) + (require ',name-symbol) + (dolist (hook (cdr (assq ',name-symbol doom--deferred-packages-alist))) + (if (functionp hook) + (advice-remove hook #',fn) + (remove-hook hook #',fn))) + (map-delete doom--deferred-packages-alist ',name-symbol) + (fmakunbound ',fn)))) + (cl-mapcan (lambda (hook) + (if (functionp hook) + `((advice-add #',hook :before #',fn)) + `((add-hook ',hook #',fn)))) + hooks) + `((map-put doom--deferred-packages-alist + ',name-symbol + '(,@hooks ,@(cdr (assq name-symbol doom--deferred-packages-alist))))) + (use-package-process-keywords name rest state)))))) ;; @@ -515,17 +548,7 @@ MODULES is an malformed plist of modules to load." (or (and (plist-member plist :if) (not (eval (plist-get plist :if) t))) (and (plist-member plist :when) (not (eval (plist-get plist :when) t))) (and (plist-member plist :unless) (eval (plist-get plist :unless) t)))) - `(progn - ;; TODO Replace with custom use-package keyword - ,(when-let* ((defer (plist-get plist :defer)) - (value (or (car-safe defer) defer))) - (setq plist (plist-put plist :defer (or (cdr-safe defer) t))) - (unless (or (memq value '(t nil)) - (number-or-marker-p value)) - `(add-transient-hook! ',value - ,(intern (format "load-%s" name)) - (require ',name)))) - (use-package ,name ,@plist)))) + `(use-package ,name ,@plist))) (defmacro def-package-hook! (package when &rest body) "Reconfigures a package's `def-package!' block. diff --git a/core/core-ui.el b/core/core-ui.el index ad948c254..f6f7faa5f 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -290,13 +290,13 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; undo/redo changes to Emacs' window layout (def-package! winner - :defer doom-before-switch-window-hook + :after-call doom-before-switch-window-hook :preface (defvar winner-dont-bind-my-keys t) ; I'll bind keys myself :config (winner-mode +1)) ;; highlight matching delimiters (def-package! paren - :defer doom-before-switch-buffer-hook + :after-call doom-before-switch-buffer-hook :config (setq show-paren-delay 0.1 show-paren-highlight-openparen t