204 lines
8.7 KiB
EmacsLisp
204 lines
8.7 KiB
EmacsLisp
;;; early-init.el -*- lexical-binding: t; coding: utf-8-unix -*-
|
|
;; Author: Case Duckworth <(rot13-string "npqj@npqj.arg")>
|
|
;; 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)
|
|
|
|
;;; 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))))
|
|
'((:font "Fantasque Sans Mono" :height 110)
|
|
(:font "Go Mono" :height 100)
|
|
(:font "DejaVu Sans Mono" :height 110)
|
|
(: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 "Comic Neue" :height 125)
|
|
(:font "Inter" :height 120)
|
|
(:font "Go" :height 120)
|
|
(:font "sans-serif"
|
|
:height 100))))
|
|
(acdw/set-emoji-fonts "Noto Color Emoji"
|
|
"Noto Emoji"
|
|
"Segoe UI Emoji"
|
|
"Apple Color Emoji"
|
|
"FreeSans"
|
|
"FreeMono"
|
|
"FreeSerif"
|
|
"Unifont"
|
|
"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))
|
|
|
|
;;; Early-loaded packages
|
|
;; These packages are here because they need to be loaded /before/
|
|
;; everything else in init.el.
|
|
|
|
(straight-use-package '(setup :host nil :repo "https://git.sr.ht/~pkal/setup"))
|
|
(require 'setup)
|
|
(require 'acdw-setup)
|
|
|
|
(setup (:straight no-littering)
|
|
(:option no-littering-etc-directory (acdw/dir)
|
|
no-littering-var-directory (acdw/dir))
|
|
(require 'no-littering))
|
|
|
|
(setup (:straight el-patch))
|
|
|
|
;;; early-init.el ends here
|