emacs/early-init.el

160 lines
6.2 KiB
EmacsLisp
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;; early-init.el -*- lexical-binding: t; coding: utf-8-unix -*-
;; Author: Case Duckworth <acdw@acdw.net>
;; 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)
;;; Speed up init
;; see doom-emacs, et al.
(setq load-prefer-newer noninteractive
orig-file-name-handler-alist file-name-handler-alist
file-name-handler-alist nil
inhibit-x-resources t)
(acdw/gc-disable)
(hook-defun post-init-reset after-init-hook
(acdw/gc-enable)
(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))
;;; 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")
(: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
)
(hook-defun disable-ui-modes after-init-hook
(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-function :after after-focus-change-function
(defun acdw/first-frame-setup ()
;; fonts
(require 'acdw-fonts)
(setq acdw-fonts/monospace (pcase acdw/system
(:home "DejaVu Sans Mono")
(:work "Consolas")
(:other "monospace"))
acdw-fonts/monospace-size 10
acdw-fonts/variable (pcase acdw/system
(:home "DejaVu Sans")
(:work "Calibri")
(:other "sans-serif"))
acdw-fonts/variable-size 12)
(acdw-fonts/set)
(acdw-fonts/setup-emoji-fonts "Segoe UI Emoji"
"Noto Color Emoji"
"Apple Color Emoji"
"Symbola")
;; fringes
(acdw/setup-fringes)
;; only run this once
(remove-function after-focus-change-function
'acdw/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))
;; 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))