Major refactor & optimization of how modules load their packages

Now that we are loading package autoloads files (as part of the
generated doom-package-autoload-file when running make autoloads), many
:commands properties are redundant. In fact, many def-package! blocks
are redundant.

In some cases, we can do without a config.el file entirely, and can move
into the autoloads file or rely entirely on package autoloads.

Also, many settings have been moved in their module's autoloads files,
which makes them available ASAP; their use no longer depends on module
load order.

This gained me a modest ~10% boost in startup speed.
This commit is contained in:
Henrik Lissner 2018-05-25 00:46:11 +02:00
parent 6a140209b8
commit 09cb4f6716
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
93 changed files with 644 additions and 846 deletions

View file

@ -3,7 +3,8 @@
;; Handles whitespace (tabs/spaces) settings externally. This way projects can
;; specify their own formatting rules.
(def-package! editorconfig
:hook (doom-init . editorconfig-mode)
:defer 2
:after-call doom-before-switch-buffer
:config
;; Register missing indent variables
(setq editorconfig-indentation-alist
@ -49,9 +50,7 @@ extension, try to guess one."
;; editorconfig to ignore indentation there. I prefer dynamic indentation
;; support built into Emacs.
(dolist (mode '(emacs-lisp-mode lisp-mode))
(map-delete editorconfig-indentation-alist mode)))
(def-package! editorconfig-conf-mode
:mode "\\.?editorconfig$")
(map-delete editorconfig-indentation-alist mode))
;;
(editorconfig-mode +1))

View file

@ -1,9 +1,29 @@
;;; tools/ein/autoload.el -*- lexical-binding: t; -*-
;;;###autoload
(def-setting! :ein-notebook-dir (dir)
"Set the default directory from where to open Jupyter notebooks."
`(setq ein:jupyter-default-notebook-directory ,dir))
;;
;; Library
;;
(defun +ein--collect-ein-buffer-links ()
(let ((end (window-end))
points)
(save-excursion
(goto-char (window-start))
(while (re-search-forward "~?/.+\\|\s\\[" end t)
(push (+ (match-beginning 0) 1) points))
(nreverse points))))
;;;###autoload
(defun +ein/ace-link-ein ()
"Ace jump to links in ein notebooklist."
(interactive)
(require 'avy)
(let ((res (avy-with +ein/ace-link-ein
(avy--process
(+ein--collect-ein-buffer-links)
@ -13,14 +33,4 @@
(goto-char (1+ res))
(widget-button-press (point)))))
;;;###autoload
(defun +ein--collect-ein-buffer-links ()
(interactive)
(let ((end (window-end))
points)
(save-excursion
(goto-char (window-start))
(while (re-search-forward "~?/.+\\|\s\\[" end t)
(push (+ (match-beginning 0) 1) points))
(nreverse points))))

View file

@ -3,47 +3,49 @@
(defvar +ein-notebook-dir "~/"
"Default directory from where Jupyter notebooks are to be opened.")
(def-setting! :ein-notebook-dir (dir)
"Set the default directory from where to open Jupyter notebooks."
`(setq +ein-notebook-dir ,dir))
;;
;; Plugins
;;
(def-package! ein
:commands (ein:notebooklist-open ein:notebooklist-login ein:jupyter-server-start)
:defer t
:init
(push (lambda (buf) (string-match-p "^\\*ein: .*" (buffer-name buf)))
doom-real-buffer-functions)
(set! :popup "\\*ein: .*" :ignore)
(set! :popup "\\*ein:tb .*" '((side . bottom) (size . 0.3)) '((quit . t) (transient) (select)))
(set! :popup "\\*ein:notebooklist *" '((side . left) (size . 50)) '((select)))
;; Ace-link on notebook list buffers
(add-hook! 'ein:notebooklist-mode-hook
(map! :map ein:notebooklist-mode-map
"o" #'+ein/ace-link-ein))
;; Ein uses request to store http cookies. Store them in the cache dir.
(setq request-storage-directory (concat doom-cache-dir "/request"))
(set! :popup "\\*ein:tb .*"
'((side . bottom) (size . 0.3))
'((quit . t) (transient) (select)))
(set! :popup "\\*ein:notebooklist *"
'((side . left) (size . 50))
'((select)))
;; Auto complete with company
(when (featurep! :completion company)
(setq ein:completion-backend 'ein:use-company-backend)
(set! :company-backend
'(ein:notebook-multilang-mode
ein:notebook-python-mode
ein:notebook-plain-mode)
(set! :company-backend '(ein:notebook-multilang-mode
ein:notebook-python-mode
ein:notebook-plain-mode)
'ein:company-backend))
:config
;; Manually load the autoloads of EIN. This takes time...
(load "ein-loaddefs.el" nil t t)
(setq
;; Slice images into rows so that we can navigate buffers with images more easily
ein:slice-image t
ein:jupyter-default-notebook-directory +ein-notebook-dir
ein:jupyter-default-server-command "jupyter"
ein:jupyter-server-args '("--no-browser")
ein:notebook-modes
'(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode))
;; Avy is required for showing links in the notebook list with ace-link.
(require 'avy)
(setq ein:jupyter-server-args '("--no-browser")
ein:notebook-modes
'(ein:notebook-multilang-mode ein:notebook-python-mode ein:notebook-plain-mode)
;; Slice images into rows; easier to navigate around images
ein:slice-image t)
(unless ein:jupyter-default-notebook-directory
(setq ein:jupyter-default-notebook-directory "~/"))
(defun +ein-buffer-p (buf)
(string-match-p "^\\*ein: .*" (buffer-name buf)))
(add-to-list 'doom-real-buffer-functions #'+ein-buffer-p nil #'eq)
;; Ace-link on notebook list buffers
(map! :after ein-notebooklist
:map ein:notebooklist-mode-map
"o" #'+ein/ace-link-ein)
;; add hydra
(defhydra +ein/hydra (:hint t :color red)
"

View file

@ -8,16 +8,6 @@
(defvar-local doom-electric-indent-words '()
"TODO")
(setq-default electric-indent-chars '(?\n ?\^?))
(defun +electric-indent|char (_c)
(when (and (eolp) doom-electric-indent-words)
(save-excursion
(backward-word)
(looking-at-p
(concat "\\<" (regexp-opt doom-electric-indent-words))))))
(push #'+electric-indent|char electric-indent-functions)
(def-setting! :electric (modes &rest plist)
"Declare :words (list of strings) or :chars (lists of chars) in MODES that
trigger electric indentation."
@ -34,3 +24,15 @@ trigger electric indentation."
,@(if words `((setq doom-electric-indent-words ',words))))
(add-hook! ,modes #',fn-name))))))
;;
(after! electric
(setq-default electric-indent-chars '(?\n ?\^?))
(defun +electric-indent|char (_c)
(when (and (eolp) doom-electric-indent-words)
(save-excursion
(backward-word)
(looking-at-p
(concat "\\<" (regexp-opt doom-electric-indent-words))))))
(add-to-list 'electric-indent-functions #'+electric-indent|char))

View file

@ -1,7 +1,5 @@
;;; tools/eshell/config.el -*- lexical-binding: t; -*-
;; This is highly experimental. I don't use eshell often, so this may need work.
;; see:
;; + `+eshell/open': open in current buffer
;; + `+eshell/open-popup': open in a popup
@ -9,7 +7,7 @@
;; workspaces)
(def-package! eshell ; built-in
:commands eshell-mode
:defer t
:init
(setq eshell-directory-name
(let ((dir (concat doom-private-dir "eshell")))

View file

@ -4,9 +4,7 @@
;; errors. If that happens, try `+gist/kill-cache'. You may have to restart
;; Emacs.
(def-package! gist
:commands (gist-list gist-region-or-buffer-private gist-region-or-buffer)
:config
(after! gist
(set! :evil-state 'gist-list-mode 'normal)
(defun +gist*list-render (orig-fn &rest args)

View file

@ -1,13 +1,10 @@
;;; tools/imenu/config.el -*- lexical-binding: t; -*-
(def-package! imenu-anywhere
:commands (ido-imenu-anywhere ivy-imenu-anywhere helm-imenu-anywhere)
:config (setq imenu-anywhere-delimiter ": "))
;; `imenu-anywhere'
(setq imenu-anywhere-delimiter ": ")
(def-package! imenu-list
:commands (imenu-list-minor-mode imenu-list-smart-toggle)
:config
(after! imenu-list
(setq imenu-list-idle-update-delay 0.5)
(set! :popup "^\\*Ilist"

View file

@ -2,8 +2,6 @@
(def-package! magit
:defer t
:init
(load "magit-autoloads" nil t)
:config
(setq magit-completing-read-function
(if (featurep! :completion ivy)
@ -18,13 +16,11 @@
(map! :map magit-status-mode-map [remap magit-mode-bury-buffer] #'+magit/quit))
(def-package! magit-blame
:commands magit-blame
:after git-timemachine)
(def-package! magit-blame :after git-timemachine)
(def-package! magithub
:commands (magithub-clone magithub-feature-autoinject)
:commands magithub-feature-autoinject
:after magit
:preface
(setq magithub-dir (concat doom-etc-dir "magithub/"))
@ -32,7 +28,6 @@
(setq magithub-clone-default-directory "~/"
magithub-preferred-remote-method 'clone_url)
:config
(load "magithub-autoloads" nil t)
(magithub-feature-autoinject t))

View file

@ -11,17 +11,18 @@
;; Plugins
;;
(def-package! password-store
;; `password-store'
(setq password-store-password-length 12)
;; `pass'
(def-package! pass
:defer t
:config
(setq password-store-password-length 12))
(def-package! pass
:commands pass
:config
(set! :evil-state 'pass-mode 'emacs)
(set! :popup "^\\*Password-Store" '((side . left) (size . 0.25)) '((quit)))
(set! :popup "^\\*Password-Store"
'((side . left) (size . 0.25))
'((quit)))
(map! :map pass-mode-map
"j" #'pass-next-entry
"k" #'pass-prev-entry
@ -30,12 +31,6 @@
"C-k" #'pass-next-directory))
(def-package! helm-pass
:when (featurep! :completion helm)
:commands helm-pass)
;; Is built into Emacs 26+
(def-package! auth-source-pass
:when (featurep! +auth)
:config (auth-source-pass-enable))
(when (and EMACS26+ (featurep! +auth))
(auth-source-pass-enable))

View file

@ -4,7 +4,7 @@
(package! pass)
(package! password-store)
(when (featurep! +auth)
(when (and EMACS26+ (featurep! +auth))
(package! auth-source-pass))
(when (featurep! :completion helm)

View file

@ -1,8 +1,7 @@
;;; tools/pdf/config.el -*- lexical-binding: t; -*-
(def-package! pdf-tools
:mode ("\\.pdf$" . pdf-view-mode)
:init (load "pdf-tools-autoloads" nil t)
:mode ("\\.pdf\\'" . pdf-view-mode)
:config
(unless noninteractive
(pdf-tools-install))

View file

@ -1,5 +1,11 @@
;;; tools/prodigy/autoload.el -*- lexical-binding: t; -*-
;;;###autoload
(def-setting! :service (&rest plist)
"TODO"
`(after! prodigy
(prodigy-define-service ,@plist)))
;;;###autoload
(defun +prodigy/create ()
"Interactively create a new prodigy service."
@ -32,3 +38,17 @@
(file-directory-p (plist-get service :project)))
collect service into services
finally do (setq prodigy-service services)))
;;;###autoload
(defun +prodigy*services (orig-fn &rest args)
"Adds a new :project property to prodigy services, which hides the service
unless invoked from the relevant project."
(let ((project-root (downcase (doom-project-root)))
(services (apply orig-fn args)))
(if current-prefix-arg
services
(cl-remove-if-not (lambda (service)
(let ((project (plist-get service :project)))
(or (not project)
(file-in-directory-p project-root project))))
services))))

View file

@ -1,38 +1,13 @@
;;; tools/prodigy/config.el -*- lexical-binding: t; -*-
(def-setting! :service (&rest plist)
"TODO"
`(after! prodigy
(prodigy-define-service ,@plist)))
;;
;; Plugins
;;
(def-package! prodigy
:commands (prodigy prodigy-view-mode prodigy-add-filter)
:config
(after! prodigy
(set! :evil-state 'prodigy-mode 'emacs)
;; Make services, etc persistent between Emacs sessions
(doom-cache-persist
:prodigy '(prodigy-services prodigy-tags prodigy-filters))
(defun +prodigy*services (orig-fn &rest args)
"Adds a new :project property to prodigy services, which hides the service
unless invoked from the relevant project."
(let ((project-root (downcase (doom-project-root)))
(services (apply orig-fn args)))
(if current-prefix-arg
services
(cl-remove-if-not (lambda (service)
(let ((project (plist-get service :project)))
(or (not project)
(file-in-directory-p project-root project))))
services))))
(advice-add #'prodigy-services :around #'+prodigy*services)
;; Keybindings
(map! :map prodigy-mode-map "d" #'+prodigy/delete))

View file

@ -4,9 +4,6 @@
;; Plugins
;;
(def-package! rainbow-mode)
(def-package! kurecolor
:after rainbow-mode
:config

View file

@ -0,0 +1,17 @@
;;; tools/rotate-text/autoload.el -*- lexical-binding: t; -*-
;;;###autoload
(def-setting! :rotate (modes &rest plist)
"Declare :symbols, :words or :patterns (all lists of strings) that
`rotate-text' will cycle through."
(declare (indent 1))
(let* ((modes (doom-enlist (doom-unquote modes)))
(fn-name (intern (format "doom--rotate-%s" (mapconcat #'symbol-name modes "-")))))
`(progn
(defun ,fn-name ()
(require 'rotate-text)
(let ((plist (list ,@plist)))
(setq rotate-text-local-symbols (plist-get plist :symbols)
rotate-text-local-words (plist-get plist :words)
rotate-text-local-patterns (plist-get plist :patterns))))
(add-hook! ,modes #',fn-name))))

View file

@ -1,22 +1,4 @@
;;; tools/rotate-text/config.el -*- lexical-binding: t; -*-
(def-package! rotate-text
:commands (rotate-text rotate-text-backward)
:config
(push '("true" "false") rotate-text-words))
(def-setting! :rotate (modes &rest plist)
"Declare :symbols, :words or :patterns (all lists of strings) that
`rotate-text' will cycle through."
(declare (indent 1))
(let* ((modes (doom-enlist (doom-unquote modes)))
(fn-name (intern (format "doom--rotate-%s" (mapconcat #'symbol-name modes "-")))))
`(progn
(defun ,fn-name ()
(let ((plist (list ,@plist)))
(setq rotate-text-local-symbols (plist-get plist :symbols)
rotate-text-local-words (plist-get plist :words)
rotate-text-local-patterns (plist-get plist :patterns))))
(add-hook! ,modes #',fn-name))))
(after! rotate-text
(add-to-list 'rotate-text-words '("true" "false")))

View file

@ -1,8 +1,14 @@
;;; tools/term/config.el -*- lexical-binding: t; -*-
(def-package! multi-term
:commands (multi-term multi-term-next multi-term-prev)
:config
(setq multi-term-program (getenv "SHELL")
multi-term-dedicated-window-height 20
multi-term-switch-after-close 'PREVIOUS))
;; `multi-term'
(setq multi-term-dedicated-window-height 20
multi-term-switch-after-close 'PREVIOUS)
;; `term' (built-in)
(after! term
(set! :env "SHELL")
;; Consider term buffers real
(defun +term-p (buf)
(eq (buffer-local-value 'major-mode buf) 'term-mode))
(add-to-list 'doom-real-buffer-functions #'+eshell-p #'eq))