;;; 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: ;;; Define personal-use constants (defconst acdw/system (pcase system-type ('gnu/linux :home) ((or 'msdos 'windows-nt) :work) (_ :other)) "Which system is currently being used.") (defvar acdw/dir (expand-file-name (convert-standard-filename "var/") user-emacs-directory) "A directory to hold extra configuration and emacs data.") ;;; Speed up init ;; see doom-emacs, et al. (defconst gc-cons-threshold-basis (* 800 1000) "The basis value for `gc-cons-threshold' to return to after a jump. 800 KB is Emacs's default `gc-cons-threshold'.") (defconst gc-cons-percentage-basis 0.1 "The basis value for `gc-cons-percentage' to return to after init. 0.1 is Emacs's default `gc-cons-percentage'.") (defvar orig-file-name-handler-alist file-name-handler-alist "The original value of `file-name-handler-alist' will be restored after init.") (setq gc-cons-threshold most-positive-fixnum gc-cons-percentage 0.6 file-name-handler-alist nil) (defun hook--post-init-reset () "Reset `gc-cons-threshold', `gc-cons-percentage', and `file-name-handler-alist' to their defaults after init." (setq gc-cons-threshold gc-cons-threshold-basis gc-cons-percentage gc-cons-percentage-basis) (dolist (handler file-name-handler-alist) (add-to-list 'orig-file-name-handler-alist handler)) (setq file-name-handler-alist orig-file-name-handler-alist)) (add-hook 'after-init-hook #'hook--post-init-reset) ;;; 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 . ,(pcase acdw/system (:home "DejaVu Sans Mono 10") (:work "Consolas 10")))) frame-inhibit-implied-resize t ; Don't resize randomly frame-resize-pixelwise t ; Resize by pixels, not chars ) (defun hook--disable-ui-modes () "Disable frame UI using modes, for toggling later." (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) (= 0 setting)) (funcall (car mode) -1))))) (add-hook 'after-init-hook #'hook--disable-ui-modes) ;;; Bootstrap package manager (`straight.el') ;; 1. Update `exec-path'. (let ((win-app-dir "~/Applications")) (dolist (path (list ;; Windows (expand-file-name "exe" win-app-dir) (expand-file-name "exe/bin" win-app-dir) (expand-file-name "Git/bin" win-app-dir) (expand-file-name "Git/usr/bin" win-app-dir) (expand-file-name "Git/mingw64/bin" win-app-dir) (expand-file-name "Everything" win-app-dir) (expand-file-name "Win-builds/bin" win-app-dir) (expand-file-name "Z/bin" win-app-dir) ;; Linux (expand-file-name "bin" user-emacs-directory) (expand-file-name "~/bin") (expand-file-name "~/.local/bin") (expand-file-name "~/usr/bin") )) (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 ; not sure if strictly ; necessary package-quickstart nil ; ditto straight-host-usernames '((github . "duckwork") (gitlab . "acdw")) straight-base-dir acdw/dir ; don't clutter ~/.emacs.d ) ;; 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)) ;;; Message startup time for profiling (defun hook--message-startup-time () "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)) (add-hook 'emacs-startup-hook #'hook--message-startup-time) ;;; Install `no-littering', pointing both directories at `acdw/dir'. This will ;;; take care of the packages I don't care about configuring. (straight-use-package 'no-littering) (setq no-littering-etc-directory acdw/dir no-littering-var-directory acdw/dir) (require 'no-littering)