Rewrite :defer semantics

:defer now supports a hook, a cons cell with (SYMBOL . INTEGER) where
SYMBOL is a hook and INTEGER is a number of idle seconds before the
package is autoloaded, or just the integer (as per the default behavior
of :defer).

Also fixes an issue where switch-buffer-deffered packages (like
smartparens) wouldn't load.
This commit is contained in:
Henrik Lissner 2018-05-15 10:46:41 +02:00
parent 9a2c4f297c
commit 94f9e43f25
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
9 changed files with 22 additions and 28 deletions

View file

@ -70,14 +70,14 @@ fundamental-mode) for performance sake."
;; revert buffers for changed files ;; revert buffers for changed files
(def-package! autorevert (def-package! autorevert
:defer buffer :defer doom-after-switch-buffer-hook
:config :config
(setq auto-revert-verbose nil) (setq auto-revert-verbose nil)
(global-auto-revert-mode +1)) (global-auto-revert-mode +1))
;; persist variables across sessions ;; persist variables across sessions
(def-package! savehist (def-package! savehist
:defer (input . 1) :defer (pre-command-hook . 1)
:config :config
(setq savehist-file (concat doom-cache-dir "savehist") (setq savehist-file (concat doom-cache-dir "savehist")
savehist-save-minibuffer-history t savehist-save-minibuffer-history t
@ -87,7 +87,7 @@ fundamental-mode) for performance sake."
;; persistent point location in buffers ;; persistent point location in buffers
(def-package! saveplace (def-package! saveplace
:defer buffer :defer doom-after-switch-buffer-hook
:config :config
(setq save-place-file (concat doom-cache-dir "saveplace")) (setq save-place-file (concat doom-cache-dir "saveplace"))
(defun doom*recenter-on-load-saveplace (&rest _) (defun doom*recenter-on-load-saveplace (&rest _)
@ -99,7 +99,7 @@ fundamental-mode) for performance sake."
;; Keep track of recently opened files ;; Keep track of recently opened files
(def-package! recentf (def-package! recentf
:defer (input . 1) :defer (pre-command-hook . 1)
:commands recentf-open-files :commands recentf-open-files
:config :config
(setq recentf-save-file (concat doom-cache-dir "recentf") (setq recentf-save-file (concat doom-cache-dir "recentf")
@ -131,7 +131,7 @@ fundamental-mode) for performance sake."
;; Auto-close delimiters and blocks as you type ;; Auto-close delimiters and blocks as you type
(def-package! smartparens (def-package! smartparens
:defer (buffer . 2) :defer doom-after-switch-buffer-hook
:config :config
(require 'smartparens-config) (require 'smartparens-config)
(setq sp-highlight-pair-overlay nil (setq sp-highlight-pair-overlay nil
@ -150,7 +150,7 @@ fundamental-mode) for performance sake."
;; Branching undo ;; Branching undo
(def-package! undo-tree (def-package! undo-tree
:defer input :defer pre-command-hook
:config :config
(global-undo-tree-mode +1) (global-undo-tree-mode +1)
;; persistent undo history is known to cause undo history corruption, which ;; persistent undo history is known to cause undo history corruption, which

View file

@ -247,7 +247,8 @@ FORCE-P is non-nil, do it anyway.
(cl-pushnew doom-core-dir load-path :test #'string=) (cl-pushnew doom-core-dir load-path :test #'string=)
(add-hook 'doom-internal-init-hook #'doom|refresh-cache)) (add-hook 'doom-internal-init-hook #'doom|refresh-cache))
(when doom-debug-mode (when doom-debug-mode
(message "Doom initialized"))) (message "Doom initialized"))
(setq doom-init-p t))
;; initialize Doom core ;; initialize Doom core
(require 'core-lib) (require 'core-lib)
(require 'core-os) (require 'core-os)
@ -255,13 +256,7 @@ FORCE-P is non-nil, do it anyway.
(require 'core-ui) (require 'core-ui)
(require 'core-editor) (require 'core-editor)
(require 'core-projects) (require 'core-projects)
(require 'core-keybinds)) (require 'core-keybinds)))
;; load input-deferred packages on first `pre-command-hook'
(add-transient-hook! 'pre-command-hook
(mapc #'require (cdr (assq 'input doom-deferred-packages))))
(add-transient-hook! 'doom-after-switch-buffer-hook
(when (get-buffer-window)
(mapc #'require (cdr (assq 'buffer doom-deferred-packages))))))
(defun doom-initialize-autoloads () (defun doom-initialize-autoloads ()
"Ensures that `doom-autoload-file' exists and is loaded. Otherwise run "Ensures that `doom-autoload-file' exists and is loaded. Otherwise run
@ -475,11 +470,11 @@ MODULES is an malformed plist of modules to load."
(and (plist-member plist :unless) (eval (plist-get plist :unless) t)))) (and (plist-member plist :unless) (eval (plist-get plist :unless) t))))
`(progn `(progn
,(when-let* ((defer (plist-get plist :defer)) ,(when-let* ((defer (plist-get plist :defer))
(type (or (car-safe defer) defer))) (value (or (car-safe defer) defer)))
(setq plist (plist-put plist :defer (or (cdr-safe defer) t))) (setq plist (plist-put plist :defer (or (cdr-safe defer) t)))
(when (and (not doom-init-p) (unless (or (memq value '(t nil))
(assq type doom-deferred-packages)) (number-or-marker-p value))
`(push ',name (cdr (assq ',type doom-deferred-packages))))) `(add-transient-hook! ',value (require ',name))))
(use-package ,name ,@plist)))) (use-package ,name ,@plist))))
(defmacro def-package-hook! (package when &rest body) (defmacro def-package-hook! (package when &rest body)

View file

@ -281,13 +281,13 @@ DEFAULT is non-nil, set the default mode-line for all buffers."
;; undo/redo changes to Emacs' window layout ;; undo/redo changes to Emacs' window layout
(def-package! winner (def-package! winner
:defer buffer :defer doom-after-switch-buffer-hook
:preface (defvar winner-dont-bind-my-keys t) ; I'll bind keys myself :preface (defvar winner-dont-bind-my-keys t) ; I'll bind keys myself
:config (winner-mode +1)) :config (winner-mode +1))
;; highlight matching delimiters ;; highlight matching delimiters
(def-package! paren (def-package! paren
:defer input :defer pre-command-hook
:config :config
(setq show-paren-delay 0.1 (setq show-paren-delay 0.1
show-paren-highlight-openparen t show-paren-highlight-openparen t

View file

@ -173,8 +173,7 @@ this, you'll get stuttering and random freezes) and resets
`file-name-handler-alist'." `file-name-handler-alist'."
(unless noninteractive (unless noninteractive
(run-hooks 'doom-init-hook)) (run-hooks 'doom-init-hook))
(setq doom-init-p t (setq file-name-handler-alist doom--file-name-handler-alist
file-name-handler-alist doom--file-name-handler-alist
gc-cons-threshold 16777216 gc-cons-threshold 16777216
gc-cons-percentage 0.15)) gc-cons-percentage 0.15))

View file

@ -48,7 +48,7 @@ MODES should be one major-mode symbol or a list of them."
(def-package! company (def-package! company
:when (featurep! +auto) :when (featurep! +auto)
:defer input :defer pre-command-hook
:config (setq company-idle-delay 0.2)) :config (setq company-idle-delay 0.2))

View file

@ -11,7 +11,7 @@
;; ;;
(def-package! helm-mode (def-package! helm-mode
:defer (input . 1) :defer (pre-command-hook . 1)
:config :config
(helm-mode +1) (helm-mode +1)
;; helm is too heavy for find-file-at-point ;; helm is too heavy for find-file-at-point

View file

@ -24,7 +24,7 @@ immediately runs it on the current candidate (ending the ivy session)."
;; ;;
(def-package! ivy (def-package! ivy
:defer input :defer (pre-command-hook . 1)
:config :config
(setq ivy-height 12 (setq ivy-height 12
ivy-do-completion-in-region nil ivy-do-completion-in-region nil

View file

@ -23,7 +23,7 @@
(def-package! evil-collection (def-package! evil-collection
:when (featurep! +everywhere) :when (featurep! +everywhere)
:defer input :defer pre-command-hook
:preface :preface
;; must be set before evil/evil-collcetion is loaded ;; must be set before evil/evil-collcetion is loaded
(setq evil-want-integration nil (setq evil-want-integration nil
@ -325,7 +325,7 @@ the new algorithm is confusing, like in python or ruby."
(def-package! evil-snipe (def-package! evil-snipe
:commands (evil-snipe-mode evil-snipe-override-mode :commands (evil-snipe-mode evil-snipe-override-mode
evil-snipe-local-mode evil-snipe-override-local-mode) evil-snipe-local-mode evil-snipe-override-local-mode)
:defer input :defer pre-command-hook
:init :init
(setq evil-snipe-smart-case t (setq evil-snipe-smart-case t
evil-snipe-scope 'line evil-snipe-scope 'line

View file

@ -2,7 +2,7 @@
(def-package! evil-goggles (def-package! evil-goggles
:when (featurep! :feature evil) :when (featurep! :feature evil)
:defer input :defer pre-command-hook
:init :init
(setq evil-goggles-duration 0.05 (setq evil-goggles-duration 0.05
evil-goggles-pulse nil ; too slow evil-goggles-pulse nil ; too slow