I disabled 'redisplay-skip-fontification-on-input' because it seems to prevent auto-revert from fontifying Dired when Emacs is not focused. Additionally, it causes fontification to be ignored until the user presses at least one key.
258 lines
9.5 KiB
EmacsLisp
258 lines
9.5 KiB
EmacsLisp
;;; early-init.el --- Early Init -*- no-byte-compile: t; lexical-binding: t; -*-
|
|
|
|
;; Author: James Cherti
|
|
;; URL: https://github.com/jamescherti/minimal-emacs.d
|
|
;; Package-Requires: ((emacs "29.1"))
|
|
;; Keywords: maint
|
|
;; Version: 1
|
|
;; SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
;;; Commentary:
|
|
;; This file contains early initialization settings for Emacs. It is designed
|
|
;; to optimize the startup process and configure essential settings before the
|
|
;; main initialization.
|
|
|
|
;;; Code:
|
|
|
|
;;; Variables
|
|
(defvar minimal-emacs-debug nil
|
|
"Non-nil to enable debug.")
|
|
|
|
(defvar minimal-emacs-gc-cons-threshold (* 16 1024 1024)
|
|
"The value of `gc-cons-threshold' after Emacs startup.")
|
|
|
|
(defvar minimal-emacs-native-comp-reserved-cpus 2
|
|
"Number of CPUs to reserve and not use for `native-compile'.")
|
|
|
|
;;; Load pre-early-init.el
|
|
(defvar minimal-emacs--default-user-emacs-directory user-emacs-directory
|
|
"The default value of the `user-emacs-directory' variable.")
|
|
|
|
(defun minimal-emacs-load-user-init (filename)
|
|
"Execute a file of Lisp code named FILENAME."
|
|
(let ((user-init-file
|
|
(expand-file-name filename
|
|
minimal-emacs--default-user-emacs-directory)))
|
|
(when (file-exists-p user-init-file)
|
|
(load user-init-file nil t))))
|
|
|
|
(minimal-emacs-load-user-init "pre-early-init.el")
|
|
|
|
;;; Misc
|
|
|
|
(set-language-environment "UTF-8")
|
|
|
|
;; Set-language-environment sets default-input-method, which is unwanted.
|
|
(setq default-input-method nil)
|
|
|
|
;;; Garbage collection
|
|
;; Garbage collection significantly affects startup times. This setting delays
|
|
;; garbage collection during startup but will be reset later.
|
|
(defvar minimal-emacs-default-gc-cons-threshold gc-cons-threshold
|
|
"The default value of `gc-cons-threshold'.")
|
|
|
|
(setq gc-cons-threshold most-positive-fixnum)
|
|
|
|
(add-hook 'emacs-startup-hook (lambda ()
|
|
(setq gc-cons-threshold (* 16 1024 1024))))
|
|
|
|
;;; Performance
|
|
|
|
;; Prefer loading newer compiled files
|
|
(setq load-prefer-newer t)
|
|
|
|
;; Increase how much is read from processes in a single chunk (default is 4kb).
|
|
(setq read-process-output-max (* 128 1024)) ; 128kb
|
|
|
|
;; Reduce rendering/line scan work by not rendering cursors or regions in
|
|
;; non-focused windows.
|
|
(setq-default cursor-in-non-selected-windows nil)
|
|
(setq highlight-nonselected-windows nil)
|
|
|
|
;; Disable warnings from the legacy advice API. They aren't useful.
|
|
(setq ad-redefinition-action 'accept)
|
|
|
|
;; Ignore warnings about "existing variables being aliased".
|
|
(setq warning-suppress-types '((defvaralias) (lexical-binding)))
|
|
|
|
;; Don't ping things that look like domain names.
|
|
(setq ffap-machine-p-known 'reject)
|
|
|
|
;; By default, Emacs "updates" its ui more often than it needs to
|
|
(setq idle-update-delay 1.0)
|
|
|
|
;; Font compacting can be very resource-intensive, especially when rendering
|
|
;; icon fonts on Windows. This will increase memory usage.
|
|
(setq inhibit-compacting-font-caches t)
|
|
|
|
(unless (daemonp)
|
|
(let ((old-value (default-toplevel-value 'file-name-handler-alist)))
|
|
(set-default-toplevel-value
|
|
'file-name-handler-alist
|
|
;; Determine the state of bundled libraries using calc-loaddefs.el.
|
|
;; If compressed, retain the gzip handler in `file-name-handler-alist`.
|
|
;; If compiled or neither, omit the gzip handler during startup for
|
|
;; improved startup and package load time.
|
|
(if (eval-when-compile
|
|
(locate-file-internal "calc-loaddefs.el" load-path))
|
|
nil
|
|
(list (rassq 'jka-compr-handler old-value))))
|
|
;; Ensure the new value persists through any current let-binding.
|
|
(set-default-toplevel-value 'file-name-handler-alist
|
|
file-name-handler-alist)
|
|
;; Remember the old value to reset it as needed.
|
|
(add-hook 'emacs-startup-hook
|
|
(lambda ()
|
|
(set-default-toplevel-value
|
|
'file-name-handler-alist
|
|
;; Merge instead of overwrite to preserve any changes made
|
|
;; since startup.
|
|
(delete-dups (append file-name-handler-alist old-value))))
|
|
101))
|
|
|
|
(unless noninteractive
|
|
(progn
|
|
;; Disable mode-line-format during init
|
|
(defun minimal-emacs--reset-inhibited-vars-h ()
|
|
(setq-default inhibit-redisplay nil
|
|
;; Inhibiting `message' only prevents redraws and
|
|
inhibit-message nil)
|
|
(redraw-frame))
|
|
|
|
(defvar minimal-emacs--default-mode-line-format mode-line-format
|
|
"Default value of `mode-line-format'.")
|
|
(setq-default mode-line-format nil)
|
|
|
|
(defun my--startup-load-user-init-file (fn &rest args)
|
|
"Around advice for startup--load-user-init-file to reset mode-line-format."
|
|
(let (init)
|
|
(unwind-protect
|
|
(progn
|
|
(apply fn args) ; Start up as normal
|
|
(setq init t))
|
|
(unless init
|
|
;; If we don't undo inhibit-{message, redisplay} and there's an
|
|
;; error, we'll see nothing but a blank Emacs frame.
|
|
(minimal-emacs--reset-inhibited-vars-h))
|
|
(unless (default-toplevel-value 'mode-line-format)
|
|
(setq-default mode-line-format
|
|
minimal-emacs--default-mode-line-format)))))
|
|
|
|
(advice-add 'startup--load-user-init-file :around
|
|
#'my--startup-load-user-init-file))
|
|
|
|
;; Without this, Emacs will try to resize itself to a specific column size
|
|
(setq frame-inhibit-implied-resize t)
|
|
|
|
;; A second, case-insensitive pass over `auto-mode-alist' is time wasted.
|
|
;; No second pass of case-insensitive search over auto-mode-alist.
|
|
(setq auto-mode-case-fold nil)
|
|
|
|
;; Reduce *Message* noise at startup. An empty scratch buffer (or the
|
|
;; dashboard) is more than enough, and faster to display.
|
|
(setq inhibit-startup-screen t
|
|
inhibit-startup-echo-area-message user-login-name)
|
|
(setq initial-buffer-choice nil
|
|
inhibit-startup-buffer-menu t
|
|
inhibit-x-resources t)
|
|
|
|
;; Disable bidirectional text scanning for a modest performance boost.
|
|
(setq-default bidi-display-reordering 'left-to-right
|
|
bidi-paragraph-direction 'left-to-right)
|
|
|
|
;; Give up some bidirectional functionality for slightly faster re-display.
|
|
(setq bidi-inhibit-bpa t)
|
|
|
|
;; Remove "For information about GNU Emacs..." message at startup
|
|
(advice-add #'display-startup-echo-area-message :override #'ignore)
|
|
|
|
;; Suppress the vanilla startup screen completely. We've disabled it with
|
|
;; `inhibit-startup-screen', but it would still initialize anyway.
|
|
(advice-add #'display-startup-screen :override #'ignore)
|
|
|
|
;; Shave seconds off startup time by starting the scratch buffer in
|
|
;; `fundamental-mode'
|
|
(setq initial-major-mode 'fundamental-mode
|
|
initial-scratch-message nil)))
|
|
|
|
;;; Native comp and Byte comp
|
|
(defun minimal-emacs-calculate-native-comp-async-jobs ()
|
|
"Set `native-comp-async-jobs-number' based on the available CPUs."
|
|
;; The `num-processors' function is only available in Emacs >= 28.1
|
|
(max 1 (- (num-processors) minimal-emacs-native-comp-reserved-cpus)))
|
|
|
|
(if (and (featurep 'native-compile)
|
|
(fboundp 'native-comp-available-p)
|
|
(native-comp-available-p))
|
|
;; Activate `native-compile'
|
|
(setq native-comp-async-jobs-number
|
|
(minimal-emacs-calculate-native-comp-async-jobs)
|
|
native-comp-deferred-compilation t
|
|
package-native-compile t)
|
|
;; Deactivate the `native-compile' feature if it is not available
|
|
(setq features (delq 'native-compile features)))
|
|
|
|
;; Suppress compiler warnings and don't inundate users with their popups.
|
|
(setq native-comp-async-report-warnings-errors minimal-emacs-debug
|
|
native-comp-warning-on-missing-source minimal-emacs-debug)
|
|
|
|
(setq debug-on-error minimal-emacs-debug
|
|
jka-compr-verbose minimal-emacs-debug)
|
|
|
|
(setq byte-compile-warnings minimal-emacs-debug)
|
|
(setq byte-compile-verbose minimal-emacs-debug)
|
|
|
|
;;; Disable unneeded UI elements
|
|
|
|
;; Disable startup screens and messages
|
|
(setq inhibit-splash-screen t)
|
|
|
|
;; I intentionally avoid calling `menu-bar-mode', `tool-bar-mode', and
|
|
;; `scroll-bar-mode' because manipulating frame parameters can trigger or queue
|
|
;; a superfluous and potentially expensive frame redraw at startup, depending
|
|
;; on the window system. The variables must also be set to `nil' so users don't
|
|
;; have to call the functions twice to re-enable them.
|
|
(push '(menu-bar-lines . 0) default-frame-alist)
|
|
(push '(tool-bar-lines . 0) default-frame-alist)
|
|
(push '(vertical-scroll-bars) default-frame-alist)
|
|
(push '(horizontal-scroll-bars) default-frame-alist)
|
|
|
|
;; (when (fboundp 'tool-bar-mode)
|
|
;; (tool-bar-mode -1))
|
|
;; (when (fboundp 'scroll-bar-mode)
|
|
;; (scroll-bar-mode -1))
|
|
(setq tool-bar-mode nil
|
|
scroll-bar-mode nil)
|
|
|
|
(when (bound-and-true-p tooltip-mode)
|
|
(tooltip-mode -1))
|
|
|
|
;; Disable GUIs because theyr are inconsistent across systems, desktop
|
|
;; environments, and themes, and they don't match the look of Emacs.
|
|
(setq use-file-dialog nil)
|
|
(setq use-dialog-box nil)
|
|
|
|
(unless (memq window-system '(mac ns))
|
|
;; (menu-bar-mode -1)
|
|
(setq menu-bar-mode nil))
|
|
|
|
(when (fboundp 'horizontal-scroll-bar-mode)
|
|
(horizontal-scroll-bar-mode -1))
|
|
|
|
;;; package.el
|
|
;; Since Emacs 27, package initialization occurs before `user-init-file' is
|
|
;; loaded, but after `early-init-file'.
|
|
(setq package-enable-at-startup t)
|
|
|
|
(setq package-quickstart nil)
|
|
|
|
;; Always ensure packages are installed
|
|
(setq use-package-always-ensure t)
|
|
|
|
;;; Load post-early-init.el
|
|
(minimal-emacs-load-user-init "post-early-init.el")
|
|
|
|
(provide 'early-init)
|
|
|
|
;;; early-init.el ends here
|