2022-07-30 21:49:00 +02:00
|
|
|
;;; doom.el --- the heart of the beast -*- lexical-binding: t; -*-
|
2022-06-18 15:04:12 +02:00
|
|
|
;;
|
|
|
|
;; Author: Henrik Lissner <contact@henrik.io>
|
|
|
|
;; URL: https://github.com/doomemacs/doomemacs
|
|
|
|
;;
|
|
|
|
;; ================= =============== =============== ======== ========
|
|
|
|
;; \\ . . . . . . .\\ //. . . . . . .\\ //. . . . . . .\\ \\. . .\\// . . //
|
|
|
|
;; ||. . ._____. . .|| ||. . ._____. . .|| ||. . ._____. . .|| || . . .\/ . . .||
|
|
|
|
;; || . .|| ||. . || || . .|| ||. . || || . .|| ||. . || ||. . . . . . . ||
|
|
|
|
;; ||. . || || . .|| ||. . || || . .|| ||. . || || . .|| || . | . . . . .||
|
|
|
|
;; || . .|| ||. _-|| ||-_ .|| ||. . || || . .|| ||. _-|| ||-_.|\ . . . . ||
|
|
|
|
;; ||. . || ||-' || || `-|| || . .|| ||. . || ||-' || || `|\_ . .|. .||
|
|
|
|
;; || . _|| || || || || ||_ . || || . _|| || || || |\ `-_/| . ||
|
|
|
|
;; ||_-' || .|/ || || \|. || `-_|| ||_-' || .|/ || || | \ / |-_.||
|
|
|
|
;; || ||_-' || || `-_|| || || ||_-' || || | \ / | `||
|
|
|
|
;; || `' || || `' || || `' || || | \ / | ||
|
|
|
|
;; || .===' `===. .==='.`===. .===' /==. | \/ | ||
|
|
|
|
;; || .==' \_|-_ `===. .===' _|_ `===. .===' _-|/ `== \/ | ||
|
|
|
|
;; || .==' _-' `-_ `=' _-' `-_ `=' _-' `-_ /| \/ | ||
|
|
|
|
;; || .==' _-' '-__\._-' '-_./__-' `' |. /| | ||
|
|
|
|
;; ||.==' _-' `' | /==.||
|
|
|
|
;; ==' _-' \/ `==
|
|
|
|
;; \ _-' `-_ /
|
|
|
|
;; `'' ``'
|
|
|
|
;;
|
|
|
|
;; These demons are not part of GNU Emacs.
|
|
|
|
;;
|
|
|
|
;;; Commentary:
|
|
|
|
;;
|
|
|
|
;; This is Doom's heart, where I define all its major constants and variables,
|
|
|
|
;; set its saner global defaults, then prepare Emacs to bootstrap Doom.
|
|
|
|
;;
|
|
|
|
;; The overall load order of Doom is as follows:
|
|
|
|
;;
|
|
|
|
;; $EMACSDIR/early-init.el
|
2022-07-30 21:49:00 +02:00
|
|
|
;; $EMACSDIR/lisp/doom.el
|
|
|
|
;; $EMACSDIR/lisp/doom-start.el
|
2022-06-18 15:04:12 +02:00
|
|
|
;; $DOOMDIR/init.el
|
|
|
|
;; {$DOOMDIR,~/.emacs.d}/modules/*/*/init.el
|
|
|
|
;; `doom-before-init-modules-hook'
|
|
|
|
;; {$DOOMDIR,~/.emacs.d}/modules/*/*/config.el
|
|
|
|
;; `doom-init-modules-hook'
|
|
|
|
;; $DOOMDIR/config.el
|
|
|
|
;; `doom-after-init-modules-hook'
|
|
|
|
;; `after-init-hook'
|
|
|
|
;; `emacs-startup-hook'
|
|
|
|
;; `doom-init-ui-hook'
|
|
|
|
;; `window-setup-hook'
|
|
|
|
;;
|
|
|
|
;;; Code:
|
2017-01-16 23:15:48 -05:00
|
|
|
|
2022-09-12 18:05:14 +02:00
|
|
|
;; Doom's minimum supported version of Emacs is 27.1. Its my goal to support one
|
|
|
|
;; major version below the stable release, for about a year or until stable is
|
|
|
|
;; ubiquitous (or at least easily accessible) across Linux distros.
|
2021-10-09 19:31:21 +02:00
|
|
|
(when (< emacs-major-version 27)
|
2022-09-06 22:28:52 +02:00
|
|
|
(user-error
|
|
|
|
(concat
|
|
|
|
"Detected Emacs " emacs-version ", but Doom requires 27.1 or newer.\n\n"
|
|
|
|
"The version of Emacs in use is located at:\n\n " (car command-line-args) "\n\n"
|
|
|
|
"A guide for installing a newer version of Emacs can be found at:\n\n "
|
|
|
|
(format "https://docs.doomemacs.org/-/install/%s"
|
|
|
|
(cond ((eq system-type 'darwin) "on-macos")
|
|
|
|
((memq system-type '(cygwin windows-nt ms-dos)) "on-windows")
|
|
|
|
("on-linux")))
|
|
|
|
"\n\n"
|
|
|
|
(if (not noninteractive)
|
|
|
|
(concat "If you believe this error is a mistake, run 'doom doctor' on the command line\n"
|
|
|
|
"to diagnose common issues with your config and system.")
|
|
|
|
(concat "Alternatively, either update your $PATH environment variable to include the\n"
|
|
|
|
"path of the desired Emacs executable OR alter the $EMACS environment variable\n"
|
|
|
|
"to specify the exact path or command needed to invoke Emacs. For example:\n\n"
|
|
|
|
(let ((command (ignore-errors (file-name-nondirectory (cadr (member "--load" command-line-args))))))
|
|
|
|
(concat " $ EMACS=/path/to/valid/emacs " command " ...\n"
|
|
|
|
" $ EMACS=\"/Applications/Emacs.app/Contents/MacOS/Emacs\" " command " ...\n"
|
|
|
|
" $ EMACS=\"snap run emacs\" " command " ...\n"))
|
|
|
|
"\nAborting...")))))
|
|
|
|
|
|
|
|
;; Doom needs to be synced/rebuilt if either Doom or Emacs has been
|
|
|
|
;; up/downgraded. This is because byte-code isn't backwards compatible, and many
|
|
|
|
;; packages (including Doom), make in absolute paths into their caches that need
|
|
|
|
;; to be refreshed.
|
|
|
|
(let ((old-version (eval-when-compile emacs-version)))
|
|
|
|
(unless (equal emacs-version old-version)
|
|
|
|
(user-error (concat "Doom was compiled with Emacs %s, but was loaded with %s. Run 'doom sync' to"
|
|
|
|
"recompile it.")
|
|
|
|
emacs-version old-version)))
|
2021-10-09 19:31:21 +02:00
|
|
|
|
|
|
|
;; Remember these variables' initial values, so we can safely reset them at a
|
|
|
|
;; later time, or consult them without fear of contamination.
|
|
|
|
(dolist (var '(exec-path load-path process-environment))
|
|
|
|
(unless (get var 'initial-value)
|
|
|
|
(put var 'initial-value (default-value var))))
|
|
|
|
|
2022-09-06 22:30:07 +02:00
|
|
|
;; Ensure Doom's core libraries are visible for loading
|
|
|
|
(add-to-list 'load-path (file-name-directory load-file-name))
|
|
|
|
|
2022-06-18 15:04:12 +02:00
|
|
|
;; Since Emacs 27, package initialization occurs before `user-init-file' is
|
|
|
|
;; loaded, but after `early-init-file'. Doom handles package initialization, so
|
|
|
|
;; we must prevent Emacs from doing it again.
|
|
|
|
(setq package-enable-at-startup nil)
|
|
|
|
|
2022-09-06 22:30:07 +02:00
|
|
|
;; Custom error types
|
|
|
|
(define-error 'doom-error "An unexpected Doom error")
|
|
|
|
(define-error 'doom-core-error "Unexpected error in Doom's core" 'doom-error)
|
|
|
|
(define-error 'doom-hook-error "Error in a Doom startup hook" 'doom-error)
|
|
|
|
(define-error 'doom-autoload-error "Error in Doom's autoloads file" 'doom-error)
|
|
|
|
(define-error 'doom-user-error "Error caused by user's config or system" 'doom-error)
|
|
|
|
(define-error 'doom-module-error "Error in a Doom module" 'doom-error)
|
|
|
|
(define-error 'doom-package-error "Error with packages" 'doom-error)
|
|
|
|
(define-error 'doom-profile-error "Error while processing profiles" 'doom-error)
|
|
|
|
|
|
|
|
;; Load just the... bear necessities~
|
2022-06-18 15:04:12 +02:00
|
|
|
(require 'cl-lib)
|
|
|
|
(require 'subr-x)
|
2022-09-06 22:30:07 +02:00
|
|
|
;; ...then load *the* one
|
|
|
|
(require 'doom-lib)
|
2022-06-18 15:04:12 +02:00
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
;;; Global constants
|
|
|
|
|
2022-08-12 20:07:08 +02:00
|
|
|
;; DEPRECATED
|
2022-06-18 15:04:12 +02:00
|
|
|
(defconst IS-MAC (eq system-type 'darwin))
|
|
|
|
(defconst IS-LINUX (eq system-type 'gnu/linux))
|
|
|
|
(defconst IS-WINDOWS (memq system-type '(cygwin windows-nt ms-dos)))
|
2022-08-12 20:07:08 +02:00
|
|
|
(defconst IS-BSD (memq system-type '(darwin berkeley-unix gnu/kfreebsd)))
|
|
|
|
|
|
|
|
(unless (featurep 'doom)
|
|
|
|
;; Since `system-configuration-features's docs state not to rely on it to test
|
|
|
|
;; for features, let's give users an easier way to detect them.
|
|
|
|
(if (bound-and-true-p module-file-suffix)
|
|
|
|
(push 'dynamic-modules features))
|
|
|
|
(if (fboundp #'json-parse-string)
|
|
|
|
(push 'jansson features))
|
|
|
|
;; `native-compile' exists whether or not it is functional (e.g. libgcc is
|
|
|
|
;; available or not). This seems silly, so pretend it doesn't exist if it
|
|
|
|
;; isn't available.
|
|
|
|
(if (featurep 'native-compile)
|
|
|
|
(if (not (native-comp-available-p))
|
|
|
|
(delq 'native-compile features)))
|
|
|
|
|
|
|
|
;; DEPRECATED remove in v3
|
|
|
|
(defconst EMACS28+ (> emacs-major-version 27))
|
|
|
|
(defconst EMACS29+ (> emacs-major-version 28))
|
|
|
|
;; DEPRECATED remove in v3
|
|
|
|
(defconst MODULES (featurep 'dynamic-modules))
|
2022-08-13 21:27:11 +02:00
|
|
|
(defconst NATIVECOMP (featurep 'native-compile)))
|
2022-06-18 15:04:12 +02:00
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
;;; Cross-platform fixes
|
|
|
|
|
2022-09-12 18:05:14 +02:00
|
|
|
;; Fix $HOME on Windows, where it's not normally defined, because many unix
|
|
|
|
;; tools expect it.
|
2022-06-18 15:04:12 +02:00
|
|
|
(when IS-WINDOWS
|
|
|
|
(when-let (realhome
|
|
|
|
(and (null (getenv-internal "HOME"))
|
|
|
|
(getenv "USERPROFILE")))
|
|
|
|
(setenv "HOME" realhome)
|
|
|
|
(setq abbreviated-home-dir nil)))
|
2021-10-09 19:31:21 +02:00
|
|
|
|
|
|
|
|
2020-05-25 02:20:26 -04:00
|
|
|
;;
|
2022-06-18 15:04:12 +02:00
|
|
|
;;; Core variables
|
2020-05-25 02:20:26 -04:00
|
|
|
|
2021-10-09 19:31:21 +02:00
|
|
|
(defgroup doom nil
|
|
|
|
"An Emacs framework for the stubborn martian hacker."
|
|
|
|
:link '(url-link "https://doomemacs.org"))
|
2019-09-03 00:42:36 -04:00
|
|
|
|
2022-03-20 23:56:06 +01:00
|
|
|
(defconst doom-version "3.0.0-dev"
|
2021-10-09 19:31:21 +02:00
|
|
|
"Current version of Doom Emacs core.")
|
2020-12-01 19:33:55 -05:00
|
|
|
|
2022-09-07 01:47:02 +02:00
|
|
|
(defconst doom-modules-version "22.09.0-dev"
|
2022-03-20 23:56:06 +01:00
|
|
|
"Current version of Doom Emacs.")
|
|
|
|
|
2019-10-30 00:02:04 -04:00
|
|
|
|
2019-09-03 00:42:36 -04:00
|
|
|
;;
|
2020-12-01 19:33:55 -05:00
|
|
|
;;; Directory variables
|
2019-05-01 19:12:52 -04:00
|
|
|
|
2020-12-01 19:33:55 -05:00
|
|
|
(defconst doom-emacs-dir user-emacs-directory
|
2019-05-01 19:12:52 -04:00
|
|
|
"The path to the currently loaded .emacs.d directory. Must end with a slash.")
|
2016-10-02 23:25:08 +02:00
|
|
|
|
2022-08-02 20:19:03 +02:00
|
|
|
(defconst doom-core-dir (file-name-directory load-file-name)
|
2019-05-01 19:12:52 -04:00
|
|
|
"The root directory of Doom's core files. Must end with a slash.")
|
2016-10-02 23:25:08 +02:00
|
|
|
|
2022-07-29 12:23:42 +02:00
|
|
|
(defconst doom-modules-dir (expand-file-name "modules/" doom-emacs-dir)
|
2019-05-01 19:12:52 -04:00
|
|
|
"The root directory for Doom's modules. Must end with a slash.")
|
2018-02-16 02:02:58 -05:00
|
|
|
|
2022-08-13 21:27:11 +02:00
|
|
|
(defconst doom-user-dir
|
2022-07-27 22:25:08 +02:00
|
|
|
(if-let (doomdir (getenv-internal "DOOMDIR"))
|
|
|
|
(expand-file-name (file-name-as-directory doomdir))
|
|
|
|
(or (let ((xdgdir
|
|
|
|
(expand-file-name "doom/"
|
|
|
|
(or (getenv-internal "XDG_CONFIG_HOME")
|
|
|
|
"~/.config"))))
|
|
|
|
(if (file-directory-p xdgdir) xdgdir))
|
|
|
|
"~/.doom.d/"))
|
|
|
|
"Where your private configuration is placed.
|
|
|
|
|
|
|
|
Defaults to ~/.config/doom, ~/.doom.d or the value of the DOOMDIR envvar;
|
|
|
|
whichever is found first. Must end in a slash.")
|
|
|
|
|
|
|
|
(defconst doom-profile
|
|
|
|
(if-let (profile (getenv-internal "DOOMPROFILE"))
|
|
|
|
;; DEPRECATED Use `string-search' once 27 support is dropped
|
|
|
|
(if (string-match-p "@" profile)
|
|
|
|
profile
|
|
|
|
(concat profile "@latest"))
|
|
|
|
;; TODO Restore this when profile system is complete
|
|
|
|
;; "default@latest"
|
|
|
|
)
|
|
|
|
"The name of the active profile.")
|
|
|
|
|
|
|
|
;; TODO Use me
|
|
|
|
(defconst doom-profiles-file
|
|
|
|
(expand-file-name "profiles.el" user-emacs-directory)
|
|
|
|
"TODO")
|
|
|
|
|
|
|
|
(defconst doom-profiles-dir
|
|
|
|
(if-let (profilesdir (getenv-internal "DOOMPROFILESDIR"))
|
|
|
|
(expand-file-name "./" profilesdir)
|
|
|
|
(expand-file-name "profiles/" doom-emacs-dir))
|
|
|
|
"Where Doom stores its profiles.
|
|
|
|
|
|
|
|
Profiles are essentially snapshots of Doom Emacs environments. Every time you
|
|
|
|
update or sync, you create a new generation of a profile (which can be easily
|
|
|
|
rolled back or switched between with the DOOMPROFILE envvar). Must end in a
|
|
|
|
slash.")
|
|
|
|
|
|
|
|
(defconst doom-profile-dir
|
|
|
|
(expand-file-name (concat (or doom-profile "default@latest") "/")
|
|
|
|
doom-profiles-dir)
|
|
|
|
"The path to the current, active profile.
|
|
|
|
|
|
|
|
Must end in a slash.")
|
|
|
|
|
|
|
|
(defconst doom-profile-data-dir
|
|
|
|
(expand-file-name "data/" doom-profile-dir)
|
|
|
|
"Where file storage/servers for the current, active profile is kept.
|
|
|
|
|
|
|
|
Use this for long-living files that contain shared data that the user would
|
|
|
|
reasonably want to keep, and/or are required for Emacs to function correctly.
|
|
|
|
Must end in a slash.")
|
|
|
|
|
|
|
|
(defconst doom-profile-cache-dir
|
|
|
|
(expand-file-name "cache/" doom-profile-dir)
|
|
|
|
"Where file caches for the current, active profile is kept.
|
|
|
|
|
|
|
|
Use this for non-essential data files that, when deleted, won't cause breakage
|
|
|
|
or misbehavior, and can be restored. This includes server binaries or programs
|
|
|
|
downloaded/installed by packages. Must end in a slash.")
|
|
|
|
|
|
|
|
(defconst doom-profile-init-file
|
|
|
|
(expand-file-name "init.el" doom-profile-dir)
|
|
|
|
"TODO")
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
;;; DEPRECATED file/directory vars
|
|
|
|
|
2019-11-01 15:12:12 -04:00
|
|
|
(defconst doom-local-dir
|
2021-10-09 19:31:21 +02:00
|
|
|
(if-let (localdir (getenv-internal "DOOMLOCALDIR"))
|
|
|
|
(expand-file-name (file-name-as-directory localdir))
|
2022-07-27 22:25:08 +02:00
|
|
|
(if doom-profile
|
2022-07-28 12:39:09 +02:00
|
|
|
doom-profile-dir
|
|
|
|
(expand-file-name ".local/" doom-emacs-dir)))
|
2019-05-01 19:12:52 -04:00
|
|
|
"Root directory for local storage.
|
|
|
|
|
|
|
|
Use this as a storage location for this system's installation of Doom Emacs.
|
2020-10-11 16:22:57 -04:00
|
|
|
|
2019-05-01 19:12:52 -04:00
|
|
|
These files should not be shared across systems. By default, it is used by
|
2022-08-14 18:10:01 +02:00
|
|
|
`doom-data-dir' and `doom-cache-dir'. Must end with a slash.")
|
2017-03-16 23:38:22 -04:00
|
|
|
|
2022-08-14 18:10:01 +02:00
|
|
|
(defconst doom-data-dir
|
2022-07-27 22:25:08 +02:00
|
|
|
(if doom-profile
|
|
|
|
doom-profile-data-dir
|
|
|
|
(concat doom-local-dir "etc/"))
|
2019-05-01 19:12:52 -04:00
|
|
|
"Directory for non-volatile local storage.
|
2017-12-22 14:48:07 -05:00
|
|
|
|
2019-05-01 19:12:52 -04:00
|
|
|
Use this for files that don't change much, like server binaries, external
|
|
|
|
dependencies or long-term shared data. Must end with a slash.")
|
2017-06-11 23:50:50 +02:00
|
|
|
|
2022-07-27 22:25:08 +02:00
|
|
|
(defconst doom-cache-dir
|
|
|
|
(if doom-profile
|
|
|
|
doom-profile-cache-dir
|
|
|
|
(concat doom-local-dir "cache/"))
|
2019-05-01 19:12:52 -04:00
|
|
|
"Directory for volatile local storage.
|
2017-01-16 23:15:48 -05:00
|
|
|
|
2019-05-01 19:12:52 -04:00
|
|
|
Use this for files that change often, like cache files. Must end with a slash.")
|
2017-04-16 20:36:15 -04:00
|
|
|
|
2020-10-28 05:17:02 -04:00
|
|
|
(defconst doom-autoloads-file
|
2022-07-27 22:25:08 +02:00
|
|
|
(if doom-profile
|
|
|
|
doom-profile-init-file
|
|
|
|
(concat doom-local-dir "autoloads." emacs-version ".el"))
|
2019-07-21 15:39:45 +02:00
|
|
|
"Where `doom-reload-core-autoloads' stores its core autoloads.
|
2019-05-01 19:12:52 -04:00
|
|
|
|
|
|
|
This file is responsible for informing Emacs where to find all of Doom's
|
2022-07-30 21:49:00 +02:00
|
|
|
autoloaded core functions (in lisp/lib/*.el).")
|
2018-06-11 23:18:15 +02:00
|
|
|
|
2022-07-27 22:25:08 +02:00
|
|
|
(defconst doom-env-file
|
|
|
|
(if doom-profile
|
|
|
|
(expand-file-name "env" doom-profile-dir)
|
|
|
|
(concat doom-local-dir "env"))
|
2020-02-19 23:34:16 -05:00
|
|
|
"The location of your envvar file, generated by `doom env`.
|
:boom: Replace exec-path-from-shell w/ 'bin/doom env'
IMPORTANT: This is a breaking update for Mac users, as your shell
environment will no longer be inherited correctly (with the removal of
exec-path-from-shell). The quick fix is: 'bin/doom env refresh'. Also,
the set-env! autodef now does nothing (and is deprecated), be sure to
remove calls to it in your config.
Smaller changes:
+ This update also adds --no-* switches to doom quickstart
+ Includes general improvements to the documentation of several bin/doom
commands.
+ Moves doom/reload* commands to core/autoload/config.el
+ doom/reload-project has been removed (it didn't actually do anything)
The breaking change:
This update adds an "envvar file" to Doom Emacs. This file is generated
by `doom env refresh`, populated with variables scraped from your shell
environment (from both non-interactive and interactive sessions). This
file is then (inexpensively) loaded at startup, if it exists.
+ The file is manually generated with `doom env refresh`.
+ It can be regenerated automatically whenever `doom refresh` is run by
running `doom env enable` (`doom env clear` will reverse this and
delete the env file).
+ `doom quickstart` will ask if you want to auto-generate this envvar
file. You won't need it if you're confident Emacs will always be
started from the correct environment, however.
+ Your env file can be reloaded from a running Emacs session with `M-x
doom/reload-env`. Note: this won't work if the Emacs session you're
running it in doesn't have a correct SHELL set. i.e. don't use this to
create your first env file!
The idea isn't mine -- it's borrowed from Spacemacs -- and was
introduced to me in #1053 by @yurimx. I was impressed with it. Prior to
this, I was unhappy with exec-path-from-shell (no hate to the dev, I
understand its necessity), and 'doom patch-macos' wasn't ideal for mac
users (needed to be reapplied every time you update Emacs). What's more,
many users (even Linux users) had to install exec-path-from-shell
anyway.
This solution suffers from none of their shortcomings. More reliable
than patch-macos, more performant and complete than
exec-path-from-shell, and easily handled by bin/doom.
2019-03-28 00:06:10 -04:00
|
|
|
|
2019-05-01 19:12:52 -04:00
|
|
|
This file contains environment variables scraped from your shell environment,
|
|
|
|
which is loaded at startup (if it exists). This is helpful if Emacs can't
|
2019-05-02 21:54:47 -04:00
|
|
|
\(easily) be launched from the correct shell session (particularly for MacOS
|
2019-05-01 19:12:52 -04:00
|
|
|
users).")
|
:boom: Replace exec-path-from-shell w/ 'bin/doom env'
IMPORTANT: This is a breaking update for Mac users, as your shell
environment will no longer be inherited correctly (with the removal of
exec-path-from-shell). The quick fix is: 'bin/doom env refresh'. Also,
the set-env! autodef now does nothing (and is deprecated), be sure to
remove calls to it in your config.
Smaller changes:
+ This update also adds --no-* switches to doom quickstart
+ Includes general improvements to the documentation of several bin/doom
commands.
+ Moves doom/reload* commands to core/autoload/config.el
+ doom/reload-project has been removed (it didn't actually do anything)
The breaking change:
This update adds an "envvar file" to Doom Emacs. This file is generated
by `doom env refresh`, populated with variables scraped from your shell
environment (from both non-interactive and interactive sessions). This
file is then (inexpensively) loaded at startup, if it exists.
+ The file is manually generated with `doom env refresh`.
+ It can be regenerated automatically whenever `doom refresh` is run by
running `doom env enable` (`doom env clear` will reverse this and
delete the env file).
+ `doom quickstart` will ask if you want to auto-generate this envvar
file. You won't need it if you're confident Emacs will always be
started from the correct environment, however.
+ Your env file can be reloaded from a running Emacs session with `M-x
doom/reload-env`. Note: this won't work if the Emacs session you're
running it in doesn't have a correct SHELL set. i.e. don't use this to
create your first env file!
The idea isn't mine -- it's borrowed from Spacemacs -- and was
introduced to me in #1053 by @yurimx. I was impressed with it. Prior to
this, I was unhappy with exec-path-from-shell (no hate to the dev, I
understand its necessity), and 'doom patch-macos' wasn't ideal for mac
users (needed to be reapplied every time you update Emacs). What's more,
many users (even Linux users) had to install exec-path-from-shell
anyway.
This solution suffers from none of their shortcomings. More reliable
than patch-macos, more performant and complete than
exec-path-from-shell, and easily handled by bin/doom.
2019-03-28 00:06:10 -04:00
|
|
|
|
2020-12-01 19:33:55 -05:00
|
|
|
|
2022-08-13 21:27:11 +02:00
|
|
|
;;
|
|
|
|
;;; Legacy support
|
|
|
|
|
|
|
|
(define-obsolete-variable-alias 'doom-private-dir 'doom-user-dir "3.0.0")
|
2022-08-14 18:10:01 +02:00
|
|
|
(define-obsolete-variable-alias 'doom-etc-dir 'doom-data-dir "3.0.0")
|
2022-08-13 21:27:11 +02:00
|
|
|
|
|
|
|
(make-obsolete-variable 'EMACS28+ "Use (>= emacs-major-version 28) instead" "3.0.0")
|
|
|
|
(make-obsolete-variable 'EMACS29+ "Use (>= emacs-major-version 29) instead" "3.0.0")
|
|
|
|
(make-obsolete-variable 'MODULES "Use (featurep 'dynamic-modules) instead" "3.0.0")
|
|
|
|
(make-obsolete-variable 'NATIVECOMP "Use (featurep 'native-compile) instead" "3.0.0")
|
|
|
|
|
|
|
|
|
2018-06-11 23:18:15 +02:00
|
|
|
;;
|
2020-12-01 19:33:55 -05:00
|
|
|
;;; Native Compilation support (http://akrl.sdf.org/gccemacs.html)
|
2016-05-26 18:51:39 -04:00
|
|
|
|
fix: memory leak & freezes on native-comp+pgtk builds
b7f84bd introduced a nasty regression that caused an infinite loop and
runaway memory usage on some pgtk+native-comp builds of Emacs when it
attempted to perform deferred native compilation of your packages. This
would make Emacs unusable and, if left alone, could even crash your
system.
The only Emacs builds I'm certain are affected are derived from
flatwhatson/emacs (like emacs-pgtk-native-comp on Guix and Arch Linux in
particular). 28.1 stable and master (on emacs-mirror/emacs@e13509468b7c)
are unaffected.
It appears that some, earlier pgtk builds stack idle timers differently.
I'm not entirely sure how, because it doesn't manifest in more recent
builds of Emacs, and I'm already burnt out on debugging this, but here's
how Doom encountered it:
Doom has an incremental package loader; it loads packages, piecemeal,
after Emacs has been idle for 2s, then again every 0.75s until it
finishes or the user sends input (then it waits another 2s before
starting again). However, if at any time the iloader detected that
native-compilation is in progress, it waits 2s before trying
again (repeat, until native-comp is done). But here's the catch, given
the following:
(run-with-idle-timer
2 nil (lambda ()
(run-with-idle-timer 1 nil (lambda () (message "hi")))))
I had assumed "hi" would be emitted after 3 seconds (once idle), but
instead it is emitted after 2. Like this, Doom's iloader would elapse
one idle timer directly into another, ad infinitum, until Emacs was
forcibly killed.
By switching to run-at-time and employing my own rudimentary idle timer,
I avoid this issue. Also, the iloader no longer needs to be considerate
of native-comp, because the latter does its own rate-limiting controlled
by native-comp-async-jobs-number.
Amend: b7f84bdd0105
2022-09-10 01:01:28 +02:00
|
|
|
(when (boundp 'native-comp-eln-load-path)
|
2022-06-18 15:04:12 +02:00
|
|
|
;; Don't store eln files in ~/.emacs.d/eln-cache (where they can easily be
|
|
|
|
;; deleted by 'doom upgrade').
|
2022-08-14 00:45:03 +02:00
|
|
|
;; REVIEW Use `startup-redirect-eln-cache' when 28 support is dropped
|
fix: memory leak & freezes on native-comp+pgtk builds
b7f84bd introduced a nasty regression that caused an infinite loop and
runaway memory usage on some pgtk+native-comp builds of Emacs when it
attempted to perform deferred native compilation of your packages. This
would make Emacs unusable and, if left alone, could even crash your
system.
The only Emacs builds I'm certain are affected are derived from
flatwhatson/emacs (like emacs-pgtk-native-comp on Guix and Arch Linux in
particular). 28.1 stable and master (on emacs-mirror/emacs@e13509468b7c)
are unaffected.
It appears that some, earlier pgtk builds stack idle timers differently.
I'm not entirely sure how, because it doesn't manifest in more recent
builds of Emacs, and I'm already burnt out on debugging this, but here's
how Doom encountered it:
Doom has an incremental package loader; it loads packages, piecemeal,
after Emacs has been idle for 2s, then again every 0.75s until it
finishes or the user sends input (then it waits another 2s before
starting again). However, if at any time the iloader detected that
native-compilation is in progress, it waits 2s before trying
again (repeat, until native-comp is done). But here's the catch, given
the following:
(run-with-idle-timer
2 nil (lambda ()
(run-with-idle-timer 1 nil (lambda () (message "hi")))))
I had assumed "hi" would be emitted after 3 seconds (once idle), but
instead it is emitted after 2. Like this, Doom's iloader would elapse
one idle timer directly into another, ad infinitum, until Emacs was
forcibly killed.
By switching to run-at-time and employing my own rudimentary idle timer,
I avoid this issue. Also, the iloader no longer needs to be considerate
of native-comp, because the latter does its own rate-limiting controlled
by native-comp-async-jobs-number.
Amend: b7f84bdd0105
2022-09-10 01:01:28 +02:00
|
|
|
(add-to-list 'native-comp-eln-load-path (expand-file-name "eln/" doom-cache-dir))
|
|
|
|
|
|
|
|
;; UX: Suppress compiler warnings and don't inundate users with their popups.
|
|
|
|
;; They are rarely more than warnings, so are safe to ignore.
|
|
|
|
(setq native-comp-async-report-warnings-errors init-file-debug
|
|
|
|
native-comp-warning-on-missing-source init-file-debug))
|
2020-12-01 19:33:55 -05:00
|
|
|
|
|
|
|
|
2020-12-01 13:43:51 -05:00
|
|
|
;;
|
2022-07-29 12:22:33 +02:00
|
|
|
;;; Don't litter `doom-emacs-dir'/$HOME
|
2020-12-01 13:43:51 -05:00
|
|
|
|
2022-09-12 18:05:14 +02:00
|
|
|
;; HACK: I change `user-emacs-directory' because many packages (even built-in
|
|
|
|
;; ones) abuse it to build paths for storage/cache files (instead of correctly
|
|
|
|
;; using `locate-user-emacs-file'). This change ensures that said data files
|
|
|
|
;; are never saved to the root of your emacs directory *and* saves us the
|
|
|
|
;; trouble setting a million directory/file variables.
|
2022-06-18 00:37:46 +02:00
|
|
|
(setq user-emacs-directory doom-cache-dir)
|
|
|
|
|
|
|
|
;; ...However, this may surprise packages (and users) that read
|
|
|
|
;; `user-emacs-directory' expecting to find the location of your Emacs config,
|
|
|
|
;; such as server.el!
|
|
|
|
(setq server-auth-dir (expand-file-name "server/" doom-emacs-dir))
|
|
|
|
|
|
|
|
;; Packages with file/dir settings that don't use `user-emacs-directory' or
|
|
|
|
;; `locate-user-emacs-file' to initialize will need to set explicitly, to stop
|
|
|
|
;; them from littering in ~/.emacs.d/.
|
|
|
|
(setq desktop-dirname (expand-file-name "desktop" doom-cache-dir)
|
|
|
|
pcache-directory (expand-file-name "pcache/" doom-cache-dir))
|
|
|
|
|
|
|
|
;; Allow the user to store custom.el-saved settings and themes in their Doom
|
|
|
|
;; config (e.g. ~/.doom.d/).
|
2022-08-13 21:27:11 +02:00
|
|
|
(setq custom-file (expand-file-name "custom.el" doom-user-dir))
|
2022-06-18 00:37:46 +02:00
|
|
|
|
2022-07-29 12:22:33 +02:00
|
|
|
;; By default, Emacs stores `authinfo' in $HOME and in plain-text. Let's not do
|
|
|
|
;; that, mkay? This file stores usernames, passwords, and other treasures for
|
|
|
|
;; the aspiring malicious third party. You'll need a GPG setup though.
|
2022-08-14 18:10:01 +02:00
|
|
|
(setq auth-sources (list (concat doom-data-dir "authinfo.gpg")
|
2022-07-29 12:22:33 +02:00
|
|
|
"~/.authinfo.gpg"))
|
|
|
|
|
2022-06-18 00:37:46 +02:00
|
|
|
(define-advice en/disable-command (:around (fn &rest args) write-to-data-dir)
|
2022-09-12 18:05:14 +02:00
|
|
|
"Save safe-local-variables to `custom-file' instead of `user-init-file'.
|
2022-06-18 00:37:46 +02:00
|
|
|
|
|
|
|
Otherwise, `en/disable-command' (in novice.el.gz) is hardcoded to write them to
|
|
|
|
`user-init-file')."
|
|
|
|
(let ((user-init-file custom-file))
|
2021-08-04 01:18:06 -04:00
|
|
|
(apply fn args)))
|
2020-06-13 16:09:26 -04:00
|
|
|
|
2020-08-17 21:46:54 -04:00
|
|
|
|
2020-12-01 19:33:55 -05:00
|
|
|
;;
|
2022-06-18 15:04:12 +02:00
|
|
|
;;; Reasonable, global defaults
|
|
|
|
|
|
|
|
;; Disable warnings from the legacy advice API. They aren't actionable or
|
|
|
|
;; useful, and often come from third party packages.
|
2021-10-09 19:31:21 +02:00
|
|
|
(setq ad-redefinition-action 'accept)
|
2018-06-15 14:58:31 +02:00
|
|
|
|
2022-08-08 17:51:29 +02:00
|
|
|
;; Ignore warnings about "existing variables being aliased". Otherwise the user
|
|
|
|
;; gets very intrusive popup warnings about our (intentional) uses of
|
2022-09-12 00:42:15 +02:00
|
|
|
;; defvaralias, which are done because ensuring aliases are created before
|
|
|
|
;; packages are loaded is an unneeded and unhelpful maintenance burden. Emacs
|
|
|
|
;; still aliases them fine regardless.
|
|
|
|
(with-eval-after-load 'warnings
|
2022-08-08 17:51:29 +02:00
|
|
|
(add-to-list 'warning-suppress-types '(defvaralias)))
|
|
|
|
|
2022-06-18 15:04:12 +02:00
|
|
|
;; Reduce debug output unless we've asked for it.
|
2021-10-09 19:31:21 +02:00
|
|
|
(setq debug-on-error init-file-debug
|
|
|
|
jka-compr-verbose init-file-debug)
|
2020-08-02 16:28:56 -04:00
|
|
|
|
2022-06-18 15:04:12 +02:00
|
|
|
;; Emacs is essentially one huge security vulnerability, what with all the
|
|
|
|
;; dependencies it pulls in from all corners of the globe. Let's try to be a
|
|
|
|
;; *little* more discerning.
|
|
|
|
(setq gnutls-verify-error noninteractive
|
|
|
|
gnutls-algorithm-priority
|
|
|
|
(when (boundp 'libgnutls-version)
|
|
|
|
(concat "SECURE128:+SECURE192:-VERS-ALL"
|
|
|
|
(if (and (not IS-WINDOWS)
|
|
|
|
(>= libgnutls-version 30605))
|
|
|
|
":+VERS-TLS1.3")
|
|
|
|
":+VERS-TLS1.2"))
|
|
|
|
;; `gnutls-min-prime-bits' is set based on recommendations from
|
|
|
|
;; https://www.keylength.com/en/4/
|
|
|
|
gnutls-min-prime-bits 3072
|
|
|
|
tls-checktrust gnutls-verify-error
|
|
|
|
;; Emacs is built with gnutls.el by default, so `tls-program' won't
|
|
|
|
;; typically be used, but in the odd case that it does, we ensure a more
|
|
|
|
;; secure default for it (falling back to `openssl' if absolutely
|
|
|
|
;; necessary). See https://redd.it/8sykl1 for details.
|
|
|
|
tls-program '("openssl s_client -connect %h:%p -CAfile %t -nbio -no_ssl3 -no_tls1 -no_tls1_1 -ign_eof"
|
|
|
|
"gnutls-cli -p %p --dh-bits=3072 --ocsp --x509cafile=%t \
|
|
|
|
--strict-tofu --priority='SECURE192:+SECURE128:-VERS-ALL:+VERS-TLS1.2:+VERS-TLS1.3' %h"
|
|
|
|
;; compatibility fallbacks
|
|
|
|
"gnutls-cli -p %p %h"))
|
2017-06-08 11:47:56 +02:00
|
|
|
|
2022-07-30 21:49:00 +02:00
|
|
|
(provide 'doom)
|
|
|
|
;;; doom.el ends here
|