;;; early-init.el -*- lexical-binding: t; coding: utf-8-unix -*- ;; Author: Case Duckworth ;; Created: Sometime during Covid-19, 2020 ;; Keywords: configuration ;; URL: https://tildegit.org/acdw/emacs ;;; License: ;; Everyone is permitted to do whatever they like with this software ;; without limitation. This software comes without any warranty ;; whatsoever, but with two pieces of advice: ;; - Be kind to yourself. ;; - Make good choices. ;;; Commentary: ;; Starting with Emacs 27.1, early-init.el is sourced before ;; package.el and any graphical frames. In this file, I set up frame ;; parameters and packaging infrastructure. ;;; Code: ;;(setq debug-on-error t) (message "Loading early-init.el...") (define-advice load (:before (feature &rest _)) "Message the user when loading a library." (with-temp-message (format "Now loading: '%s'" feature))) ;;; Speed up init (setq gc-cons-threshold most-positive-fixnum) (add-hook 'emacs-startup-hook (defun emacs-startup@restore-values () "Restore values set during early-init for speed." (setq gc-cons-threshold 134217728 ; 128mb ;; I don't do the common `file-name-handler-alist' thing here ;; because of a weirdness where my Emacs doesn't know how to ;; load bookmark.el.gz when initializing. ))) ;;; Set up extra load paths and functionality (push (locate-user-emacs-file "lisp") load-path) (require 'acdw) (+define-dir .etc (locate-user-emacs-file ".etc") "Directory for all of Emacs's various files. See `no-littering' for examples.") (+define-dir sync/ (expand-file-name "~/Sync") "My Syncthing directory.") ;; Load system-specific changes. (progn (require 'system) (setq system-default-font "DejaVu Sans Mono" system-variable-pitch-font "DejaVu Sans") (system-settings-load)) ;;; Default frame settings (setq default-frame-alist '((tool-bar-lines . 0) (menu-bar-lines . 0) (vertical-scroll-bars) (horizontal-scroll-bars)) frame-inhibit-implied-resize t frame-resize-pixelwise t window-resize-pixelwise t inhibit-x-resources t indicate-empty-lines nil indicate-buffer-boundaries '((top . right) (bottom . right))) ;;; Fonts (+with-ensure-after-init ;; Set default faces (+with-message "Setting default faces" (let ((font-name system-default-font) (font-size system-default-height) (variable-font-name system-variable-pitch-font) (variable-font-size system-variable-pitch-height)) (set-face-attribute 'default nil :family system-default-font :height font-size :weight 'book) (set-face-attribute 'italic nil :family font-name :height font-size :slant 'italic) (set-face-attribute 'variable-pitch nil :family variable-font-name :height variable-font-size))) ;; Emoji fonts (+with-message "Adding emoji fonts" (let ((ffl (font-family-list))) (dolist (font '("Noto Color Emoji" "Noto Emoji" "Segoe UI Emoji" "Apple Color Emoji" "FreeSans" "FreeMono" "FreeSerif" "Unifont" "Symbola")) (when (member font ffl) (message "Found font: %s" font) (set-fontset-font t 'symbol (font-spec :family font) nil :append)))))) ;;; Packages (setq package-enable-at-startup nil package-quickstart nil straight-host-usernames '((github . "duckwork") (gitlab . "acdw")) straight-check-for-modifications '(check-on-save find-when-checking)) (setq no-littering-etc-directory .etc no-littering-var-directory .etc straight-base-dir .etc) ;; Bootstrap straight.el ;; https://github.com/raxod502/straight.el (+with-message "Bootstrapping straight" (defvar bootstrap-version) (let ((bootstrap-file (expand-file-name "straight/repos/straight.el/bootstrap.el" straight-base-dir)) (bootstrap-version 5)) (unless (file-exists-p bootstrap-file) (with-current-buffer (url-retrieve-synchronously (concat "https://raw.githubusercontent.com/" "raxod502/straight.el/develop/install.el") 'silent 'inhibit-cookies) (goto-char (point-max)) (eval-print-last-sexp))) (load bootstrap-file nil 'nomessage))) ;; Early-loaded packages -- those that, for some reason or another, ;; need to be ensured to be loaded first. (require 'straight-x) (dolist (pkg '(el-patch no-littering setup straight)) ; already installed, but what the hell (straight-use-package pkg) (require pkg) (require (intern (format "+%s" pkg)) nil :noerror)) ;; Setup `setup' (add-to-list 'setup-modifier-list 'setup-wrap-to-demote-errors) ;; (advice-add 'setup :before (defun +setup-before (&rest args) ;; (message "Setup: %S" args))) ;; (advice-add 'setup :after (defun +setup-after (&rest args) ;; (message "Setup: %S...Done." args))) ;;; Appendix ;; Get rid of a dumb alias. straight-ಠ_ಠ-mode really slows down all ;; minibuffer completion functions. Since it's a (rarely-used, even) ;; alias anyway, I just define it back to nil. By the way, the alias ;; is `straight-package-neutering-mode'. (defalias 'straight-ಠ_ಠ-mode nil) (message "Loading early-init.el...Done.") (provide 'early-init) ;;; early-init.el ends here