;;; 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 ;; This file is NOT part of GNU Emacs. ;;; License: ;; Everyone is permitted to do whatever with this software, without ;; limitation. This software comes without any warranty whatsoever, ;; but with two pieces of advice: ;; - Don't hurt yourself. ;; - Make good choices. ;;; Comentary: ;; Starting with Emacs 27.1, `early-init' is sourced before `package' ;; or any frames. So those are the settings I run in this file. ;;; Code: ;;; Add `acdw.el' (push (expand-file-name "lisp/" user-emacs-directory) load-path) (require 'acdw) (require 'acdw-frame) ;;; Speed up init ;; see doom-emacs, et al. (setq acdw/orig-file-name-handler-alist file-name-handler-alist file-name-handler-alist nil gc-cons-percentage 0.8 gc-cons-threshold most-positive-fixnum load-prefer-newer noninteractive) (add-hook 'after-init-hook (defun after-init@reset () "Reset `file-name-handler-alist' and garbage collection." (setq gc-cons-percentage 0.1 gc-cons-threshold (* 800 1024 1024)) (dolist (handler file-name-handler-alist) (add-to-list 'acdw/orig-file-name-handler-alist handler)) (setq file-name-handler-alist acdw/orig-file-name-handler-alist))) ;;; Frame settings (setq default-frame-alist ; Remove most UI `((tool-bar-lines . 0) ; No tool bar (menu-bar-lines . 0) ; No menu bar (vertical-scroll-bars) ; No scroll bars (horizontal-scroll-bars) ; ... at all (width . 84) ; A /little/ wider than ; `fill-column' (set later) (height . 30) (left-fringe . 8) ; Width of fringes (right-fringe . 8) ; (8 is default) (font . ,(acdw/system (:home "DejaVu Sans Mono 10") (:work "Consolas 12") (:other "monospace 10")))) frame-inhibit-implied-resize t ; Don't resize randomly frame-resize-pixelwise t ; Resize by pixels, not chars inhibit-x-resources t ; Don't load ~/.Xresources ) (add-hook 'after-init-hook (defun after-init@disable-ui-modes () "Disable UI modes after init. I already disable them from the `default-frame-alist' for speed and anti-flickering reasons, but this function allows running, say, `tool-bar-mode' once to toggle the tool bar back on." (dolist (mode ;; each mode is of the form (MODE . FRAME-ALIST-VAR) '((tool-bar-mode . tool-bar-lines) (menu-bar-mode . menu-bar-lines) (scroll-bar-mode . vertical-scroll-bars) (horizontal-scroll-bar-mode . horizontal-scroll-bars))) (let ((setting (alist-get (cdr mode) default-frame-alist))) (when (or (not setting) (zerop setting)) (funcall (car mode) -1)))))) (add-hook 'after-make-frame-functions (defun after-make-frame@setup (&rest args) (ignore args) (let ((monospace-faces (acdw/system (:work '((:font "Consolas" :height 110) (:font "DejaVu Sans Mono" :height 110) (:font "monospace" :height 110))) (_ '((:font "DejaVu Sans Mono" :height 100) (:font "Consolas" :height 100) (:font "monospace" :height 100)))))) (acdw/set-first-face-attribute 'default monospace-faces) (acdw/set-first-face-attribute 'fixed-pitch monospace-faces) (acdw/set-first-face-attribute 'variable-pitch '((:font "Inter" :height 120) (:font "sans-serif" :height 100)))) (acdw/set-emoji-fonts "Segoe UI Emoji" "Noto Color Emoji" "Apple Color Emoji" "Symbola") (acdw/set-fringes '((left-curly-arrow [#b01100000 #b00110000 #b00011000 #b00001100] 4 8 center) (right-curly-arrow [#b00000011 #b00000110 #b00001100 #b00011000] 4 8 center) (left-arrow [#b01100000 #b01010000] 2 8 (top t)) (right-arrow [#b00000011 #b00000101] 2 8 (top t)))) (setq indicate-empty-lines nil indicate-buffer-boundaries '((top . right) (bottom . right))) (custom-set-faces '(fringe ((t (:foreground "dim gray"))))))) (add-hook 'server-after-make-frame-hook #'after-make-frame@setup) ;; I have this here because ... the first frame doesn't ? run ? the hook ??? (add-function :after after-focus-change-function (defun after-focus-change@first-frame-setup (&rest args) (ignore args) (after-make-frame@setup) (remove-function after-focus-change-function #'after-focus-change@first-frame-setup))) ;;; Bootstrap package manager (`straight.el') ;; 1. Update `exec-path'. (dolist (path (list (expand-file-name "bin" user-emacs-directory) (expand-file-name "~/bin") (expand-file-name "~/.local/bin") (expand-file-name "~/usr/bin") (expand-file-name "~/cmd") (expand-file-name "~/mingw64/bin") (expand-file-name "~/clisp-2.49")) exec-path) (when (file-exists-p path) (add-to-list 'exec-path path :append))) ;; 1.5. Update $PATH to reflect changes. (setenv "PATH" (mapconcat #'identity exec-path path-separator)) ;; 2. Set `package' and `straight' variables. (setq package-enable-at-startup nil package-quickstart nil straight-host-usernames '((github . "duckwork") (gitlab . "acdw")) straight-base-dir (acdw/dir) straight-check-for-modifications '(check-on-save find-when-checking)) ;; 3. Bootstrap `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)) ;; Helper package, good commands here. (require 'straight-x) ;; 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 startup time for profiling ;; This just redefines the Emacs function ;; `display-startup-echo-area-message', so no hooks needed. (defun display-startup-echo-area-message () "Show Emacs's startup time in the message buffer. For profiling." (message "Emacs ready in %s with %d garbage collections." (format "%.2f seconds" (float-time (time-subtract after-init-time before-init-time))) gcs-done)) ;;; `setup' (straight-use-package '(setup :host nil :repo "https://git.sr.ht/~pkal/setup")) (require 'setup) (require 'acdw-setup) ;;; `no-littering' (setup (:straight no-littering) (:option no-littering-etc-directory (acdw/dir) no-littering-var-directory (acdw/dir)) (require 'no-littering)) ;;; early-init.el ends here