From 60b595321eaf4f698ae129a7f138b7545f7127be Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 5 Jun 2021 12:49:40 -0400 Subject: [PATCH] Lazy-load yasnippet harder for faster first-file load time + Rather than waiting for the first "interactive" major mode to be visited to activate yas-minor-mode, we wait until the first time the user invokes a snippet command to activate yas-global-mode. + yas-reload-all is one of the bottlenecks when loading a file for the first time. Deferring it further should help with this. + yas-global-mode reaches more major modes than our former list of hooks (fixes #5140). Closes #5140 --- modules/config/default/+evil-bindings.el | 3 +-- modules/editor/snippets/config.el | 18 +++++------------- modules/lang/org/autoload/org.el | 3 ++- modules/lang/web/autoload/html.el | 3 ++- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index a98b7f1a6dc..3d1368bd5ba 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -39,13 +39,12 @@ ;; Smart tab, these will only work in GUI Emacs (map! :i [tab] (cmds! (and (featurep! :editor snippets) - (bound-and-true-p yas-minor-mode) (yas-maybe-expand-abbrev-key-filter 'yas-expand)) #'yas-expand (and (bound-and-true-p company-mode) (featurep! :completion company +tng)) #'company-indent-or-complete-common) - :m [tab] (cmds! (and (bound-and-true-p yas-minor-mode) + :m [tab] (cmds! (and (featurep! :editor snippets) (evil-visual-state-p) (or (eq evil-visual-selection 'line) (not (memq (char-after) (list ?\( ?\[ ?\{ ?\} ?\] ?\)))))) diff --git a/modules/editor/snippets/config.el b/modules/editor/snippets/config.el index 37070e84c84..07d100940c7 100644 --- a/modules/editor/snippets/config.el +++ b/modules/editor/snippets/config.el @@ -17,22 +17,14 @@ yas-new-snippet yas-visit-snippet-file yas-activate-extra-mode - yas-deactivate-extra-mode) + yas-deactivate-extra-mode + yas-maybe-expand-abbrev-key-filter) :init ;; Remove default ~/.emacs.d/snippets (defvar yas-snippet-dirs nil) - (unless (daemonp) - ;; Ensure `yas-reload-all' is called as late as possible. Other modules - ;; could have additional configuration for yasnippet. For example, - ;; file-templates. - (add-transient-hook! 'yas-minor-mode-hook (yas-reload-all))) - - (add-hook! '(text-mode-hook - prog-mode-hook - conf-mode-hook - snippet-mode-hook) - #'yas-minor-mode-on) + ;; Lazy load yasnippet until it is needed + (add-transient-hook! #'company-yasnippet (require 'yasnippet)) :config (add-to-list 'doom-debug-variables '(yas-verbosity . 3)) @@ -125,7 +117,7 @@ (smartparens-mode 1))))) ;; If in a daemon session, front-load this expensive work: - (if (daemonp) (yas-reload-all))) + (yas-global-mode +1)) (use-package! auto-yasnippet diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 91178436deb..c8bd2d0218c 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -417,7 +417,8 @@ Made for `org-tab-first-hook' in evil-mode." (defun +org-yas-expand-maybe-h () "Expand a yasnippet snippet, if trigger exists at point or region is active. Made for `org-tab-first-hook'." - (when (bound-and-true-p yas-minor-mode) + (when (featurep! :editor snippets) + (require 'yasnippet) (and (let ((major-mode (if (org-in-src-block-p t) (org-src-get-lang-mode (org-eldoc-get-src-lang)) major-mode)) diff --git a/modules/lang/web/autoload/html.el b/modules/lang/web/autoload/html.el index e605255de2d..572d30bac0e 100644 --- a/modules/lang/web/autoload/html.el +++ b/modules/lang/web/autoload/html.el @@ -127,7 +127,8 @@ snippet, or `emmet-expand-yas'/`emmet-expand-line', depending on whether (not (or (memq (char-after) (list ?\n ?\s ?\t)) (eobp)))) #'indent-for-tab-command) - ((bound-and-true-p yas-minor-mode) + ((featurep! :editor snippets) + (require 'yasnippet) (if (yas--templates-for-key-at-point) #'yas-expand #'emmet-expand-yas))