Split core-packages into two (packages & modules)
+ Move doom-initialize et co into core.el + Lazy load core-packages + load! has been moved into core-lib + Added FILE! and DIR! macros + Fix package! not returning correct value when package is disabled + Remove :disabled support for def-package-hook! officially
This commit is contained in:
parent
f70c9ebb71
commit
0741c8851a
5 changed files with 681 additions and 654 deletions
241
core/core.el
241
core/core.el
|
@ -63,7 +63,39 @@ Use this for files that change often, like cache files.")
|
|||
"Where your private customizations are placed. Must end in a slash. Respects
|
||||
XDG directory conventions if ~/.config/doom exists.")
|
||||
|
||||
(defconst doom-autoload-file (concat doom-local-dir "autoloads.el")
|
||||
"Where `doom//reload-doom-autoloads' will generate its core autoloads file.")
|
||||
|
||||
(defconst doom-package-autoload-file (concat doom-local-dir "autoloads.pkg.el")
|
||||
"Where `doom//reload-package-autoloads' will generate its package.el autoloads
|
||||
file.")
|
||||
|
||||
|
||||
;;
|
||||
;; State variables
|
||||
;;
|
||||
|
||||
(defvar doom-init-p nil
|
||||
"Non-nil if `doom-initialize' has run.")
|
||||
|
||||
(defvar doom-init-time nil
|
||||
"The time it took, in seconds, for DOOM Emacs to initialize.")
|
||||
|
||||
(defvar doom-emacs-changed-p nil
|
||||
"If non-nil, the running version of Emacs is different from the first time
|
||||
Doom was setup, which can cause problems.")
|
||||
|
||||
(defvar doom-site-load-path load-path
|
||||
"The starting load-path, before it is altered by `doom-initialize'.")
|
||||
|
||||
(defvar doom--refreshed-p nil)
|
||||
(defvar doom--stage 'init)
|
||||
|
||||
|
||||
;;
|
||||
;; Doom hooks
|
||||
;;
|
||||
|
||||
(defvar doom-init-hook nil
|
||||
"Hooks run after all init.el files are loaded, including your private and all
|
||||
module init.el files, but before their config.el files are loaded.")
|
||||
|
@ -73,8 +105,40 @@ module init.el files, but before their config.el files are loaded.")
|
|||
`emacs-startup-hook', as late as possible. Guaranteed to run after everything
|
||||
else (except for `window-setup-hook').")
|
||||
|
||||
(defvar doom-reload-hook nil
|
||||
"A list of hooks to run when `doom//reload-load-path' is called.")
|
||||
|
||||
|
||||
;;
|
||||
;; Optimize startup
|
||||
;;
|
||||
|
||||
(defvar doom--file-name-handler-alist file-name-handler-alist)
|
||||
(unless (or after-init-time noninteractive)
|
||||
;; A big contributor to long startup times is the garbage collector, so we up
|
||||
;; its memory threshold, temporarily and reset it later in `doom|finalize'.
|
||||
(setq gc-cons-threshold 402653184
|
||||
gc-cons-percentage 1.0
|
||||
;; consulted on every `require', `load' and various file reading
|
||||
;; functions. You get a minor speed up by nooping this.
|
||||
file-name-handler-alist nil))
|
||||
|
||||
(defun doom|finalize ()
|
||||
"Resets garbage collection settings to reasonable defaults (if you don't do
|
||||
this, you'll get stuttering and random freezes) and resets
|
||||
`file-name-handler-alist'."
|
||||
(setq file-name-handler-alist doom--file-name-handler-alist
|
||||
gc-cons-threshold 16777216
|
||||
gc-cons-percentage 0.2))
|
||||
|
||||
(add-hook 'emacs-startup-hook #'doom|finalize)
|
||||
(add-hook 'doom-reload-hook #'doom|finalize)
|
||||
|
||||
|
||||
;;
|
||||
;; Emacs core configuration
|
||||
;;
|
||||
|
||||
;;;
|
||||
;; UTF-8 as the default coding system
|
||||
(when (fboundp 'set-charset-priority)
|
||||
(set-charset-priority 'unicode)) ; pretty
|
||||
|
@ -88,11 +152,12 @@ else (except for `window-setup-hook').")
|
|||
(setq-default
|
||||
ad-redefinition-action 'accept ; silence advised function warnings
|
||||
apropos-do-all t ; make `apropos' more useful
|
||||
auto-mode-case-fold nil
|
||||
autoload-compute-prefixes nil
|
||||
debug-on-error doom-debug-mode
|
||||
ffap-machine-p-known 'reject ; don't ping things that look like domain names
|
||||
idle-update-delay 2 ; update ui less often
|
||||
auto-mode-case-fold nil
|
||||
;; be quiet at startup; don't load or display anything unnecessary
|
||||
;; be quiet at startup; don't load or display anything unnecessary
|
||||
inhibit-startup-message t
|
||||
inhibit-startup-echo-area-message user-login-name
|
||||
inhibit-default-init t
|
||||
|
@ -105,6 +170,19 @@ else (except for `window-setup-hook').")
|
|||
create-lockfiles nil
|
||||
history-length 500
|
||||
make-backup-files nil ; don't create backup~ files
|
||||
;; `use-package'
|
||||
use-package-verbose doom-debug-mode
|
||||
use-package-minimum-reported-time (if doom-debug-mode 0 0.1)
|
||||
;; byte compilation
|
||||
byte-compile-verbose doom-debug-mode
|
||||
byte-compile-warnings '(not free-vars unresolved noruntime lexical make-local)
|
||||
;; security
|
||||
gnutls-verify-error (not (getenv "INSECURE")) ; you shouldn't use this
|
||||
tls-checktrust gnutls-verify-error
|
||||
tls-program (list "gnutls-cli --x509cafile %t -p %p %h"
|
||||
;; compatibility fallbacks
|
||||
"gnutls-cli -p %p %h"
|
||||
"openssl s_client -connect %h:%p -no_ssl2 -no_ssl3 -ign_eof")
|
||||
;; files
|
||||
abbrev-file-name (concat doom-local-dir "abbrev.el")
|
||||
auto-save-list-file-name (concat doom-cache-dir "autosave")
|
||||
|
@ -121,11 +199,6 @@ else (except for `window-setup-hook').")
|
|||
url-cache-directory (concat doom-cache-dir "url/")
|
||||
url-configuration-directory (concat doom-etc-dir "url/"))
|
||||
|
||||
|
||||
;;
|
||||
;; Emacs fixes/hacks
|
||||
;;
|
||||
|
||||
(defvar doom-auto-minor-mode-alist '()
|
||||
"Alist mapping filename patterns to corresponding minor mode functions, like
|
||||
`auto-mode-alist'. All elements of this alist are checked, meaning you can
|
||||
|
@ -167,29 +240,129 @@ with functions that require it (like modeline segments)."
|
|||
|
||||
|
||||
;;
|
||||
;; Optimize startup
|
||||
;; Bootstrap helpers
|
||||
;;
|
||||
|
||||
(defvar doom--file-name-handler-alist file-name-handler-alist)
|
||||
(unless (or after-init-time noninteractive)
|
||||
;; A big contributor to long startup times is the garbage collector, so we up
|
||||
;; its memory threshold, temporarily and reset it later in `doom|finalize'.
|
||||
(setq gc-cons-threshold 402653184
|
||||
gc-cons-percentage 1.0
|
||||
;; consulted on every `require', `load' and various file reading
|
||||
;; functions. You get a minor speed up by nooping this.
|
||||
file-name-handler-alist nil))
|
||||
(defvar doom--last-emacs-file (concat doom-local-dir "emacs-version.el"))
|
||||
(defvar doom--last-emacs-version nil)
|
||||
|
||||
(defun doom|finalize ()
|
||||
"Resets garbage collection settings to reasonable defaults (if you don't do
|
||||
this, you'll get stuttering and random freezes) and resets
|
||||
`file-name-handler-alist'."
|
||||
(setq file-name-handler-alist doom--file-name-handler-alist
|
||||
gc-cons-threshold 16777216
|
||||
gc-cons-percentage 0.2))
|
||||
(defun doom-ensure-same-emacs-version-p ()
|
||||
"Do an Emacs version check and set `doom-emacs-changed-p' if it has changed."
|
||||
(if (load doom--last-emacs-file 'noerror 'nomessage 'nosuffix)
|
||||
(setq doom-emacs-changed-p
|
||||
(not (equal emacs-version doom--last-emacs-version)))
|
||||
(with-temp-file doom--last-emacs-file
|
||||
(princ `(setq doom--last-emacs-version ,(prin1-to-string emacs-version))
|
||||
(current-buffer))))
|
||||
(cond ((not doom-emacs-changed-p))
|
||||
((y-or-n-p
|
||||
(format
|
||||
(concat "Your version of Emacs has changed from %s to %s, which may cause incompatibility\n"
|
||||
"issues. Please run `bin/doom compile :plugins` afterwards to resolve any problems.\n\n"
|
||||
"Continue?")
|
||||
doom--last-emacs-version
|
||||
emacs-version))
|
||||
(delete-file doom--last-emacs-file))
|
||||
(noninteractive (error "Aborting"))
|
||||
((kill-emacs))))
|
||||
|
||||
(add-hook 'emacs-startup-hook #'doom|finalize)
|
||||
(add-hook 'doom-reload-hook #'doom|finalize)
|
||||
(defun doom-ensure-core-directories ()
|
||||
"Make sure all Doom's essential local directories (in and including
|
||||
`doom-local-dir') exist."
|
||||
(dolist (dir (list doom-local-dir doom-etc-dir doom-cache-dir doom-packages-dir))
|
||||
(unless (file-directory-p dir)
|
||||
(make-directory dir t))))
|
||||
|
||||
(defun doom|display-benchmark (&optional return-p)
|
||||
"Display a benchmark, showing number of packages and modules, and how quickly
|
||||
they were loaded at startup.
|
||||
|
||||
If RETURN-P, return the message as a string instead of displaying it."
|
||||
(funcall (if return-p #'format #'message)
|
||||
"Doom loaded %s packages across %d modules in %.03fs"
|
||||
(length package-activated-list)
|
||||
(if doom-modules (hash-table-count doom-modules) 0)
|
||||
(or doom-init-time
|
||||
(setq doom-init-time (float-time (time-subtract (current-time) before-init-time))))))
|
||||
|
||||
(defun doom|post-init ()
|
||||
"Run `doom-post-init-hook'. That's all."
|
||||
(run-hooks 'doom-post-init-hook))
|
||||
|
||||
(defun doom|run-all-startup-hooks ()
|
||||
"Run all startup Emacs hooks. Meant to be executed after starting Emacs with
|
||||
-q or -Q, for example:
|
||||
|
||||
emacs -Q -l init.el -f doom|run-all-startup-hooks"
|
||||
(run-hooks 'after-init-hook 'delayed-warnings-hook
|
||||
'emacs-startup-hook 'term-setup-hook
|
||||
'window-setup-hook))
|
||||
|
||||
|
||||
;;
|
||||
;; Bootstrap functions
|
||||
;;
|
||||
|
||||
(defun doom-initialize (&optional force-p)
|
||||
"Bootstrap Doom, if it hasn't already (or if FORCE-P is non-nil).
|
||||
|
||||
The bootstrap process involves making sure 1) the essential directories exist,
|
||||
2) the core packages are installed, 3) `doom-autoload-file' and
|
||||
`doom-package-autoload-file' exist and have been loaded, and 4) Doom's core
|
||||
files are loaded.
|
||||
|
||||
If the cache exists, much of this function isn't run, which substantially
|
||||
reduces startup time.
|
||||
|
||||
The overall load order of Doom is as follows:
|
||||
|
||||
~/.emacs.d/init.el
|
||||
~/.emacs.d/core/core.el
|
||||
~/.doom.d/init.el
|
||||
Module init.el files
|
||||
`doom-init-hook'
|
||||
Module config.el files
|
||||
~/.doom.d/config.el
|
||||
`after-init-hook'
|
||||
`emacs-startup-hook'
|
||||
`doom-post-init-hook' (at end of `emacs-startup-hook')
|
||||
|
||||
Module load order is determined by your `doom!' block. See `doom-modules-dirs'
|
||||
for a list of all recognized module trees. Order defines precedence (from most
|
||||
to least)."
|
||||
(when (or force-p (not doom-init-p))
|
||||
;; Set this to prevent infinite recursive calls to `doom-initialize'
|
||||
(setq doom-init-p t)
|
||||
;; `doom-autoload-file' tells Emacs where to load all its autoloaded
|
||||
;; functions from. This includes everything in core/autoload/*.el and all
|
||||
;; the autoload files in your enabled modules.
|
||||
(when (or force-p (not (doom-initialize-autoloads doom-autoload-file)))
|
||||
(doom-ensure-core-directories)
|
||||
(doom-ensure-same-emacs-version-p)
|
||||
;; Ensure packages are set up and initialized
|
||||
(require 'core-packages)
|
||||
(doom-ensure-packages-initialized force-p)
|
||||
(doom-ensure-core-packages)
|
||||
;; Regenerate `doom-autoload-file', which tells Doom where to find all its
|
||||
;; module autoloaded functions.
|
||||
(unless (or force-p noninteractive)
|
||||
(user-error "Your doom autoloads are missing! Run `bin/doom refresh' to regenerate them")))
|
||||
;; Loads `doom-package-autoload-file', which caches `load-path',
|
||||
;; `auto-mode-alist', `Info-directory-list', `doom-disabled-packages' and
|
||||
;; `package-activated-list'. A big reduction in startup time.
|
||||
(unless (or force-p
|
||||
(doom-initialize-autoloads doom-package-autoload-file)
|
||||
noninteractive)
|
||||
(user-error "Your package autoloads are missing! Run `bin/doom refresh' to regenerate them")))
|
||||
;; Initialize Doom core
|
||||
(unless noninteractive
|
||||
(add-hook! 'emacs-startup-hook
|
||||
#'(doom|post-init doom|display-benchmark))
|
||||
(require 'core-os)
|
||||
(require 'core-ui)
|
||||
(require 'core-editor)
|
||||
(require 'core-projects)
|
||||
(require 'core-keybinds)))
|
||||
|
||||
|
||||
;;
|
||||
|
@ -198,14 +371,18 @@ this, you'll get stuttering and random freezes) and resets
|
|||
|
||||
(add-to-list 'load-path doom-core-dir)
|
||||
|
||||
(require 'core-lib)
|
||||
(require 'core-packages)
|
||||
|
||||
(load custom-file t t t)
|
||||
(require 'core-lib)
|
||||
(require 'core-modules)
|
||||
(when noninteractive
|
||||
(require 'core-dispatcher))
|
||||
|
||||
(doom-initialize noninteractive)
|
||||
(if noninteractive
|
||||
(require 'core-dispatcher)
|
||||
(unless noninteractive
|
||||
(doom-initialize-modules))
|
||||
|
||||
(after! package
|
||||
(require 'core-packages))
|
||||
|
||||
(provide 'core)
|
||||
;;; core.el ends here
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue