diff --git a/core/core-editor.el b/core/core-editor.el index 1ba77ff3a..bba32d48a 100644 --- a/core/core-editor.el +++ b/core/core-editor.el @@ -78,15 +78,15 @@ fundamental-mode) for performance sake." (electric-indent-mode -1) ; enabled by default in Emacs 25+. No thanks. -;; revert buffers for changed files (def-package! autorevert + ;; revert buffers for changed files :after-call after-find-file :config (setq auto-revert-verbose nil) (global-auto-revert-mode +1)) -;; persist variables across sessions (def-package! savehist + ;; persist variables across sessions :defer 1 :after-call post-command-hook :config @@ -105,8 +105,8 @@ savehist file." else if item collect it))) (add-hook 'kill-emacs-hook #'doom|unpropertize-kill-ring)) -;; persistent point location in buffers (def-package! saveplace + ;; persistent point location in buffers :after-call (after-find-file dired-initial-position-hook) :config (setq save-place-file (concat doom-cache-dir "saveplace")) @@ -117,8 +117,8 @@ savehist file." :after-while #'doom*recenter-on-load-saveplace) (save-place-mode +1)) -;; Keep track of recently opened files (def-package! recentf + ;; Keep track of recently opened files :defer 1 :after-call after-find-file :commands recentf-open-files @@ -152,9 +152,9 @@ savehist file." ;; ;; Packages -;; Auto-close delimiters and blocks as you type. It's more powerful than that, -;; but that is all Doom uses it for. (def-package! smartparens + ;; Auto-close delimiters and blocks as you type. It's more powerful than that, + ;; but that is all Doom uses it for. :after-call (doom-exit-buffer-hook after-find-file) :commands (sp-pair sp-local-pair sp-with-modes) :config @@ -192,8 +192,9 @@ savehist file." (smartparens-global-mode +1)) -;; Automatic detection of indent settings + (def-package! dtrt-indent + ;; Automatic detection of indent settings :unless noninteractive :defer t :init @@ -207,8 +208,10 @@ savehist file." #'doom|detect-indentation) :config (setq dtrt-indent-verbosity (if doom-debug-mode 2 0)) - (add-to-list 'dtrt-indent-hook-generic-mapping-list '(t tab-width)) - + ;; always keep tab-width up-to-date + (push '(t tab-width) dtrt-indent-hook-generic-mapping-list) + + (defvar dtrt-indent-run-after-smie) (defun doom*fix-broken-smie-modes (orig-fn arg) "Some smie modes throw errors when trying to guess their indentation, like `nim-mode'. This prevents them from leaving Emacs in a broken state." @@ -224,8 +227,9 @@ savehist file." (funcall orig-fn arg)))) (advice-add #'dtrt-indent-mode :around #'doom*fix-broken-smie-modes)) -;; Branching undo + (def-package! undo-tree + ;; Branching & persistent undo :after-call (doom-exit-buffer-hook after-find-file) :config (setq undo-tree-auto-save-history t @@ -264,16 +268,12 @@ savehist file." (advice-add #'undo-tree-save-history :around #'doom*compress-undo-tree-history)) -;; -;; Autoloaded Plugins -;; - ;; `command-log-mode' (setq command-log-mode-auto-show t command-log-mode-open-log-turns-on-mode t command-log-mode-is-global t) -;; `expand-region' + (def-package! expand-region :commands (er/contract-region er/mark-symbol er/mark-word) :config @@ -284,6 +284,7 @@ savehist file." (advice-add #'evil-escape :before #'doom*quit-expand-region) (advice-add #'doom/escape :before #'doom*quit-expand-region)) + ;; `helpful' --- a better *help* buffer (define-key! 'global [remap describe-function] #'helpful-callable @@ -291,8 +292,9 @@ savehist file." [remap describe-variable] #'helpful-variable [remap describe-key] #'helpful-key) -;; `ws-butler' --- a better `delete-trailing-whitespaces' + (def-package! ws-butler + ;; a less intrusive `delete-trailing-whitespaces' on save :after-call (after-find-file) :config (setq ws-butler-global-exempt-modes diff --git a/core/core-keybinds.el b/core/core-keybinds.el index eff1ab08e..e63c780f0 100644 --- a/core/core-keybinds.el +++ b/core/core-keybinds.el @@ -56,10 +56,15 @@ If any hook returns non-nil, all hooks after it are ignored.") which-key-min-display-lines 6 which-key-side-window-slot -10) :config - ;; embolden local bindings + ;; general improvements to which-key readability (set-face-attribute 'which-key-local-map-description-face nil :weight 'bold) (which-key-setup-side-window-bottom) (setq-hook! 'which-key-init-buffer-hook line-spacing 3) + (defun doom*no-fringes-in-which-key-buffer (&rest _) + (doom|no-fringes-in-minibuffer) + (set-window-fringes (get-buffer-window which-key--buffer) 0 0 nil)) + (advice-add 'which-key--show-buffer-side-window :after #'doom*no-fringes-in-which-key-buffer) + (which-key-mode +1)) diff --git a/core/core-modules.el b/core/core-modules.el index f2813bf3a..e5cde27e1 100644 --- a/core/core-modules.el +++ b/core/core-modules.el @@ -304,8 +304,8 @@ to least)." (defmacro def-package! (name &rest plist) "This is a thin wrapper around `use-package'." `(use-package ,name - ,@(append (if (memq name doom-disabled-packages) `(:disabled t)) - plist))) + ,@(if (memq name doom-disabled-packages) `(:disabled t)) + ,@plist)) (defmacro def-package-hook! (package when &rest body) "Reconfigures a package's `def-package!' block. diff --git a/core/core-projects.el b/core/core-projects.el index d24811088..8ecf1bccd 100644 --- a/core/core-projects.el +++ b/core/core-projects.el @@ -47,18 +47,18 @@ ;; Projectile root-searching functions can cause an infinite loop on TRAMP ;; connections, so disable them. - (defun doom*projectile-locate-dominating-file (orig-fn &rest args) + (defun doom*projectile-locate-dominating-file (orig-fn file name) "Don't traverse the file system if on a remote connection." (unless (file-remote-p default-directory) - (apply orig-fn args))) + (funcall orig-fn file name))) (advice-add #'projectile-locate-dominating-file :around #'doom*projectile-locate-dominating-file) - (defun doom*projectile-cache-current-file (orig-fun &rest args) + (defun doom*projectile-cache-current-file (orig-fn) "Don't cache ignored files." (unless (cl-loop for path in (projectile-ignored-directories) if (string-prefix-p (or buffer-file-name "") (expand-file-name path)) return t) - (apply orig-fun args))) + (funcall orig-fn))) (advice-add #'projectile-cache-current-file :around #'doom*projectile-cache-current-file)) diff --git a/core/core-ui.el b/core/core-ui.el index b9972e780..72a9ca02e 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -71,7 +71,11 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") window-resize-pixelwise t frame-resize-pixelwise t) -(fset #'yes-or-no-p #'y-or-n-p) ; y/n instead of yes/no +;; y/n instead of yes/no +(fset #'yes-or-no-p #'y-or-n-p) + +;; Truly silence startup message +(fset #'display-startup-echo-area-message #'ignore) ;; @@ -100,7 +104,7 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (add-hook 'completion-list-mode-hook #'hide-mode-line-mode) (add-hook 'Man-mode-hook #'hide-mode-line-mode) -;; `highlight-numbers' -- better number literal fontification in code +;; `highlight-numbers' --- better number literal fontification in code (def-package! highlight-numbers :hook (prog-mode . highlight-numbers-mode) :config (setq highlight-numbers-generic-regexp "\\_<[[:digit:]]+\\(?:\\.[0-9]*\\)?\\_>")) @@ -113,10 +117,11 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") ;; Especially in parentheses-drunk languages like Lisp. (setq rainbow-delimiters-max-face-count 3) -;; `restart-emacs' +;; `restart-emacs' --- provides a simple mechanism for restarting Emacs and +;; daemons interactively. (setq restart-emacs--args (list "--restore")) -;; `visual-fill-column' For a distractions-free-like UI, that dynamically +;; `visual-fill-column' --- for a distractions-free-like UI, that dynamically ;; resizes margins and can center a buffer. (setq visual-fill-column-center-text t visual-fill-column-width @@ -143,8 +148,9 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (add-hook 'isearch-mode-hook #'doom|disable-ui-keystrokes) (add-hook 'isearch-mode-end-hook #'doom|enable-ui-keystrokes) -;; Highlights the current line + (def-package! hl-line ; built-in + ;; Highlights the current line :hook ((prog-mode text-mode conf-mode) . hl-line-mode) :config ;; I don't need hl-line showing in other windows. This also offers a small @@ -180,14 +186,16 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") (add-hook 'evil-visual-state-entry-hook #'doom|disable-hl-line) (add-hook 'evil-visual-state-exit-hook #'doom|enable-hl-line-maybe))) -;; undo/redo changes to Emacs' window layout + (def-package! winner + ;; undo/redo changes to Emacs' window layout :after-call doom-exit-window-hook :preface (defvar winner-dont-bind-my-keys t) ; I'll bind keys myself :config (winner-mode +1)) -;; highlight matching delimiters + (def-package! paren + ;; highlight matching delimiters :after-call (after-find-file doom-exit-buffer-hook) :init (defun doom|disable-show-paren-mode () @@ -199,6 +207,7 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") show-paren-when-point-inside-paren t) (show-paren-mode +1)) + ;; The native border "consumes" a pixel of the fringe on righter-most splits, ;; `window-divider' does not. Available since Emacs 25.1. (setq-default window-divider-default-places t @@ -206,12 +215,8 @@ shorter major mode name in the mode-line. See `doom|set-mode-name'.") window-divider-default-right-width 1) (add-hook 'doom-init-ui-hook #'window-divider-mode) -;; remove prompt if the file is opened in other clients -(defun server-remove-kill-buffer-hook () - (remove-hook 'kill-buffer-query-functions #'server-kill-buffer-query-function)) -(add-hook 'server-visit-hook #'server-remove-kill-buffer-hook) -;; `whitespace-mode' (built-in) +;; `whitespace-mode' (setq whitespace-line-column nil whitespace-style '(face indentation tabs tab-mark spaces space-mark newline newline-mark @@ -384,7 +389,8 @@ frame's window-system, the theme will be reloaded.") ;; fonts (add-hook 'doom-init-ui-hook #'doom|init-fonts) ;; themes -(add-hook 'doom-init-ui-hook #'doom|init-theme) +(unless (daemonp) + (add-hook 'doom-init-ui-hook #'doom|init-theme)) (add-hook 'after-make-frame-functions #'doom|reload-theme-in-frame-maybe) (add-hook 'after-delete-frame-functions #'doom|reload-theme-maybe) @@ -394,20 +400,16 @@ frame's window-system, the theme will be reloaded.") ;; simple name in frame title (setq frame-title-format '("%b – Doom Emacs")) - -;; draw me like one of your French editors -(tooltip-mode -1) ; relegate tooltips to echo area only - +;; relegate tooltips to echo area only +(tooltip-mode -1) ;; a good indicator that Emacs isn't frozen (add-hook 'doom-init-ui-hook #'blink-cursor-mode) ;; Make `next-buffer', `other-buffer', etc. ignore unreal buffers. -(add-to-list 'default-frame-alist (cons 'buffer-predicate #'doom-buffer-frame-predicate)) - +(add-to-list 'default-frame-alist '(buffer-predicate . doom-buffer-frame-predicate)) ;; Prevent the glimpse of un-styled Emacs by setting these early. (add-to-list 'default-frame-alist '(tool-bar-lines 0)) (add-to-list 'default-frame-alist '(menu-bar-lines 0)) (add-to-list 'default-frame-alist '(vertical-scroll-bars)) - ;; prompts the user for confirmation when deleting a non-empty frame (global-set-key [remap delete-frame] #'doom/delete-frame) @@ -442,13 +444,13 @@ instead). Meant for `kill-buffer-query-functions'." (add-hook 'after-change-major-mode-hook #'doom|set-mode-name) (add-hook 'after-change-major-mode-hook #'doom|highlight-non-default-indentation) (add-hook 'compilation-filter-hook #'doom|apply-ansi-color-to-compilation-buffer) - ;; (run-hook-wrapped 'doom-init-ui-hook #'doom-try-run-hook)) + (add-hook 'emacs-startup-hook #'doom|init-ui) -;; Fixes/hacks ;; +;; Fixes/hacks ;; doesn't exist in terminal Emacs; we define it to prevent errors (unless (fboundp 'define-fringe-bitmap) @@ -481,11 +483,6 @@ instead). Meant for `kill-buffer-query-functions'." (advice-add #'delete-backward-char :around #'doom*silence-motion-errors) (advice-add #'backward-kill-sentence :around #'doom*silence-motion-errors) -(defun doom*no-fringes-in-which-key-buffer (&rest _) - (doom|no-fringes-in-minibuffer) - (set-window-fringes (get-buffer-window which-key--buffer) 0 0 nil)) -(advice-add 'which-key--show-buffer-side-window :after #'doom*no-fringes-in-which-key-buffer) - ;; Switch to `doom-fallback-buffer' if on last real buffer (advice-add #'kill-this-buffer :around #'doom*switch-to-fallback-buffer-maybe) diff --git a/core/core.el b/core/core.el index c8aa7ae11..91531e739 100644 --- a/core/core.el +++ b/core/core.el @@ -16,10 +16,8 @@ line or use --debug-init to enable this.") (defconst doom-version "2.0.9" "Current version of DOOM emacs.") -(defconst EMACS26+ - (eval-when-compile (not (version< emacs-version "26")))) -(defconst EMACS27+ - (eval-when-compile (not (version< emacs-version "27")))) +(defconst EMACS26+ (> emacs-major-version 25)) +(defconst EMACS27+ (> emacs-major-version 26)) (defconst IS-MAC (eq system-type 'darwin)) (defconst IS-LINUX (eq system-type 'gnu/linux)) @@ -27,15 +25,14 @@ line or use --debug-init to enable this.") ;; -(defvar doom-emacs-dir - (eval-when-compile (file-truename user-emacs-directory)) +(defvar doom-emacs-dir user-emacs-directory "The path to this emacs.d directory. Must end in a slash.") (defvar doom-core-dir (concat doom-emacs-dir "core/") - "Where essential files are stored.") + "The root directory of core Doom files.") (defvar doom-modules-dir (concat doom-emacs-dir "modules/") - "The main directory where Doom modules are stored.") + "The root directory for Doom's modules.") (defvar doom-local-dir (concat doom-emacs-dir ".local/") "Root directory for local Emacs files. Use this as permanent storage for files @@ -125,19 +122,21 @@ module init.el files, but before their config.el files are loaded.") else (except for `window-setup-hook').") (defvar doom-reload-hook nil - "A list of hooks to run when `doom//reload-load-path' is called.") + "A list of hooks to run when `doom/reload' is called.") (defvar doom-load-theme-hook nil - "Hook run when the theme (and font) is initialized (or reloaded -with `doom/reload-theme').") + "Hook run after the theme is loaded with `load-theme' or reloaded with +`doom/reload-theme'.") (defvar doom-exit-window-hook nil - "Hook run before `switch-window' or `switch-frame' are called. See -`doom-enter-window-hook'.") + "Hook run before `switch-window' or `switch-frame' are called. + +Also see `doom-enter-window-hook'.") (defvar doom-enter-window-hook nil - "Hook run after `switch-window' or `switch-frame' are called. See -`doom-exit-window-hook'.") + "Hook run after `switch-window' or `switch-frame' are called. + +Also see `doom-exit-window-hook'.") (defvar doom-exit-buffer-hook nil "Hook run after `switch-to-buffer', `pop-to-buffer' or `display-buffer' are @@ -152,9 +151,11 @@ called. The buffer to be switched to is current when these hooks run. Also see `doom-exit-buffer-hook'.") (defvar doom-inhibit-switch-buffer-hooks nil - "Letvar for inhibiting `doom-enter-buffer-hook' and `doom-exit-buffer-hook'.") + "Letvar for inhibiting `doom-enter-buffer-hook' and `doom-exit-buffer-hook'. +Do not set this directly.") (defvar doom-inhibit-switch-window-hooks nil - "Letvar for inhibiting `doom-enter-window-hook' and `doom-exit-window-hook'.") + "Letvar for inhibiting `doom-enter-window-hook' and `doom-exit-window-hook'. +Do not set this directly.") (defun doom*switch-window-hooks (orig-fn window &optional norecord) (if (or doom-inhibit-switch-window-hooks @@ -290,9 +291,6 @@ original value of `symbol-file'." (funcall orig-fn symbol type))) (advice-add #'symbol-file :around #'doom*symbol-file) -;; Truly silence startup message -(fset #'display-startup-echo-area-message #'ignore) - ;; Don't garbage collect to speed up minibuffer commands (defun doom|defer-garbage-collection () (setq gc-cons-threshold doom-gc-cons-upper-limit)) @@ -306,13 +304,13 @@ original value of `symbol-file'." ;; Bootstrap helpers (defun doom-try-run-hook (hook) - "Run HOOK (a hook function), but marks thrown errors to make it a little -easier to tell where the came from. + "Run HOOK (a hook function), but handle errors better, to make debugging +issues easier. Meant to be used with `run-hook-wrapped'." - (when doom-debug-mode - (message "Running doom hook: %s" hook)) (let ((gc-cons-threshold doom-gc-cons-upper-limit)) + (when doom-debug-mode + (message "Running doom hook: %s" hook)) (condition-case e (funcall hook) ((debug error) @@ -400,9 +398,9 @@ The overall load order of Doom is as follows: `doom-init-hook' Module config.el files ~/.doom.d/config.el + `doom-post-init-hook' `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 diff --git a/init.el b/init.el index 6db64b2ae..95567e45a 100644 --- a/init.el +++ b/init.el @@ -41,17 +41,17 @@ decrease this. If you experience stuttering, increase this.") "Resets garbage collection settings to reasonable defaults (a large `gc-cons-threshold' can cause random freezes otherwise) and resets `file-name-handler-alist'." - (setq-default file-name-handler-alist doom--file-name-handler-alist) - ;; Do it on an idle timer to defer the possible GC pause, and to give deferred - ;; packages the opportunity to take advantage of these optimizations. + (setq file-name-handler-alist doom--file-name-handler-alist) + ;; Do this on idle timer to defer a possible GC pause that could result; also + ;; allows deferred packages to take advantage of these optimizations. (run-with-idle-timer 3 nil (lambda () (setq-default gc-cons-threshold doom-gc-cons-threshold)))) (if (or after-init-time noninteractive) (setq gc-cons-threshold doom-gc-cons-threshold) - ;; A big contributor to long startup times is the garbage collector, so we up - ;; its memory threshold, temporarily and reset it later in + ;; A big contributor to startup times is garbage collection. We up the gc + ;; threshold to temporarily prevent it from running, then reset it later in ;; `doom|disable-startup-optimizations'. (setq gc-cons-threshold doom-gc-cons-upper-limit) ;; This is consulted on every `require', `load' and various file reading @@ -61,11 +61,11 @@ decrease this. If you experience stuttering, increase this.") (add-hook 'emacs-startup-hook #'doom|restore-startup-optimizations)) -;; Ensure Doom is always running out of this file's directory +;; Ensure Doom is running out of this file's directory (setq user-emacs-directory (file-name-directory load-file-name)) -;; In noninteractive sessions, we hope that non-byte-compiled files will take -;; precedence over byte-compiled ones, however, if you're getting odd recursive -;; load errors, it may help to set this to nil. +;; In noninteractive sessions, prioritize non-byte-compiled source files to +;; prevent stale, byte-compiled code from running. However, if you're getting +;; recursive load errors, it may help to set this to nil. (setq load-prefer-newer noninteractive)