diff options
Diffstat (limited to 'early-init.el')
-rw-r--r-- | early-init.el | 297 |
1 files changed, 216 insertions, 81 deletions
diff --git a/early-init.el b/early-init.el index ef72beb..36bacbe 100644 --- a/early-init.el +++ b/early-init.el | |||
@@ -1,21 +1,180 @@ | |||
1 | ;;; early-init.el -*- no-byte-compile: t; coding: utf-8 -*- | 1 | ;;; early-init.el -*- lexical-binding: t; coding: utf-8 -*- |
2 | ;; Copyright (C) 2020 Case Duckworth | 2 | ;; Copyright (C) 2020-2021 Case Duckworth |
3 | 3 | ;; | |
4 | ;; Author: Case Duckworth <acdw@acdw.net> | 4 | ;; Author: Case Duckworth <acdw@acdw.net> |
5 | ;; Created: Sometime during the Covid-19 lockdown, 2019 | 5 | ;; Created: Sometime during Covid-19, 2020 |
6 | ;; Keywords: configuration | 6 | ;; Keywords: configuration |
7 | ;; URL: https://tildegit.org/acdw/emacs | 7 | ;; URL https://tildegit.org/acdw/emacs |
8 | ;; | ||
9 | ;; This file is NOT part of GNU Emacs. | ||
10 | ;; | ||
11 | ;;; License: | ||
12 | ;; | ||
13 | ;; Everyone is permitted to do whatever with this software, without | ||
14 | ;; limitation. This software comes without any warranty whatsoever, | ||
15 | ;; but with two pieces of advice: | ||
16 | ;; - Don't hurt yourself. | ||
17 | ;; - Make good choices. | ||
18 | ;; | ||
19 | ;;; Comentary: | ||
20 | ;; | ||
21 | ;; Starting with Emacs 27.1, `early-init' is sourced before `package' | ||
22 | ;; or any frames. So those are the settings I run in this file. | ||
23 | ;; | ||
24 | ;;; Code: | ||
8 | 25 | ||
9 | ;; This file is not part of GNU Emacs. | 26 | ;; Speed up init |
27 | (setq gc-cons-threshold most-positive-fixnum | ||
28 | gc-cons-percentage 0.6 | ||
29 | comp-deferred-compilation nil) | ||
10 | 30 | ||
11 | ;;; Commentary: | 31 | (defconst gc-cons-basis (* 800 1024) |
12 | ;; This file is automatically tangled from config.org. | 32 | "The basis value to which to return after a max jump. |
13 | ;; Hand edits will be overwritten! | 33 | 800,000 (800 KB) is Emacs' default.") |
14 | 34 | ||
15 | ;;; Code: | 35 | (add-hook 'after-init-hook #'(lambda () |
36 | (setq gc-cons-threshold gc-cons-basis | ||
37 | gc-cons-percentage 0.1))) | ||
38 | |||
39 | (defun hook--gc-cons-maximize () | ||
40 | "Set `gc-cons-threshold' to the highest possible. | ||
41 | For memory-intensive features." | ||
42 | (setq gc-cons-threshold most-positive-fixnum)) | ||
43 | |||
44 | (defun hook--gc-cons-baseline () | ||
45 | "Return `gc-cons-threshold' to `gc-cons-basis'. | ||
46 | For after memory intensive operations." | ||
47 | (setq gc-cons-threshold gc-cons-basis)) | ||
48 | |||
49 | (add-hook 'minibuffer-setup-hook #'hook--gc-cons-maximize) | ||
50 | (add-hook 'minibuffer-exit-hook #'hook--gc-cons-baseline) | ||
51 | |||
52 | ;; From doom-emacs | ||
53 | (unless (daemonp) | ||
54 | (defvar doom--initial-file-name-handler-alist file-name-handler-alist) | ||
55 | (setq file-name-handler-alist nil) | ||
56 | (defun doom-reset-file-handler-alist-h () | ||
57 | (dolist (handler file-name-handler-alist) | ||
58 | (add-to-list 'doom--initial-file-name-handler-alist handler)) | ||
59 | (setq file-name-handler-alist doom--initial-file-name-handler-alist)) | ||
60 | (add-hook 'emacs-startup-hook #'doom-reset-file-handler-alist-h)) | ||
61 | |||
62 | ;; Where are we? | ||
63 | (defconst acdw/system (pcase system-type | ||
64 | ('gnu/linux :home) | ||
65 | ((or 'msdos 'windows-nt) :work) | ||
66 | (_ :other))) | ||
67 | |||
68 | ;; Frame initiation | ||
69 | |||
70 | ;; Initialize frames with as little UI as possible. | ||
71 | (setq-default | ||
72 | default-frame-alist ; The default look of frames | ||
73 | `((tool-bar-lines . 0) ; Remove tool bar | ||
74 | (menu-bar-lines . 0) ; Remove menu bar | ||
75 | (vertical-scroll-bars) ; Remove vertical scroll bars | ||
76 | (horizontal-scroll-bars) ; Remove horizontal scroll bars | ||
77 | (width . 84) ; A /little/ wider than `fill-column' | ||
78 | (height . 30) ; Text characters | ||
79 | (left-fringe . 8) ; Width of fringes | ||
80 | (right-fringe . 8) ; (8 is the default) | ||
81 | (font . ,(pcase acdw/system ; Default font | ||
82 | (:home "Terminus 12") | ||
83 | (:work "Consolas 11"))) | ||
84 | ) | ||
85 | |||
86 | x-underline-at-descent-line t ; underline at the descent line | ||
87 | |||
88 | scroll-margin 0 ; how many lines to show at window edge | ||
89 | scroll-conservatively 101 ; just enough to bring text into view | ||
90 | scroll-preserve-screen-position 1 ; always keep screen position | ||
91 | |||
92 | frame-title-format ; Titles for frames | ||
93 | '((:eval (if (buffer-file-name) ; (cf. `mode-line-format') | ||
94 | (abbreviate-file-name (buffer-file-name)) | ||
95 | "%b")) | ||
96 | " " | ||
97 | mode-line-client | ||
98 | mode-line-modified | ||
99 | " - GNU Emacs") | ||
100 | ) | ||
101 | |||
102 | ;; Set the rest of the fonts after initiation | ||
103 | (defun hook--setup-fonts () | ||
104 | (pcase acdw/system | ||
105 | (:home (set-face-attribute 'default nil | ||
106 | :family "Terminus" | ||
107 | :height 120) | ||
108 | (set-face-attribute 'fixed-pitch nil | ||
109 | :family "Terminus" | ||
110 | :height 1.0) | ||
111 | (set-face-attribute 'variable-pitch nil | ||
112 | :family "DejaVu Sans" | ||
113 | :height 1.0)) | ||
114 | (:work (set-face-attribute 'default nil | ||
115 | :familiy "Consolas" | ||
116 | :height 110) | ||
117 | (set-face-attribute 'fixed-pitch nil | ||
118 | :family "Consolas" | ||
119 | :height 1.0) | ||
120 | (set-face-attribute 'variable-pitch nil | ||
121 | :family "Cambria" | ||
122 | :height 1.0)))) | ||
123 | |||
124 | (add-hook 'after-init-hook #'hook--setup-fonts) | ||
125 | |||
126 | ;; In case I do want the UI elements later, I also disable the modes | ||
127 | ;; -- otherwise I'd have to run the mode twice to actually show the | ||
128 | ;; thing. | ||
129 | |||
130 | (defun hook--disable-ui-modes () | ||
131 | (dolist (mode '(tool-bar-mode | ||
132 | menu-bar-mode | ||
133 | scroll-bar-mode | ||
134 | horizontal-scroll-bar-mode)) | ||
135 | (funcall mode -1))) | ||
136 | |||
137 | ;; I run it on the `after-init-hook' so it doesn't slow down init so much. | ||
138 | (add-hook 'after-init-hook #'hook--disable-ui-modes) | ||
139 | |||
140 | ;; Customize the fringe | ||
141 | (setq-default | ||
142 | indicate-empty-lines t ; show an indicator at the end of the buffer | ||
143 | indicate-buffer-boundaries 'right ; show buffer boundaries on the right | ||
144 | visual-line-fringe-indicators ; show continuation indicators on the left | ||
145 | '(left-curly-arrow nil)) | ||
146 | |||
147 | (defun hook--setup-fringe-bitmaps () | ||
148 | (define-fringe-bitmap 'left-curly-arrow | ||
149 | [#b11000000 | ||
150 | #b01100000 | ||
151 | #b00110000 | ||
152 | #b00011000]) | ||
153 | (define-fringe-bitmap 'right-curly-arrow | ||
154 | [#b00011000 | ||
155 | #b00110000 | ||
156 | #b01100000 | ||
157 | #b11000000]) | ||
158 | (define-fringe-bitmap 'left-arrow | ||
159 | [#b00000000 | ||
160 | #b01010100 | ||
161 | #b01010100 | ||
162 | #b00000000]) | ||
163 | (define-fringe-bitmap 'right-arrow | ||
164 | [#b00000000 | ||
165 | #b00101010 | ||
166 | #b00101010 | ||
167 | #b00000000])) | ||
168 | (add-hook 'after-init-hook #'hook--setup-fringe-bitmaps) | ||
169 | |||
170 | ;; Resize like it's 2021 | ||
171 | (setq-default frame-inhibit-implied-resize t | ||
172 | frame-resize-pixelwise t) | ||
173 | |||
174 | ;; Bootstrap package manager (`straight') | ||
175 | |||
176 | ;; First, I need to make sure it's in the `exec-path'. | ||
16 | 177 | ||
17 | (message "%s..." "Loading early-init.el") | ||
18 | ;; BOOTSTRAP PACKAGE MANAGEMENT | ||
19 | (let ((win-app-dir "~/Applications")) | 178 | (let ((win-app-dir "~/Applications")) |
20 | (dolist (path (list | 179 | (dolist (path (list |
21 | ;; Windows | 180 | ;; Windows |
@@ -31,21 +190,44 @@ | |||
31 | (expand-file-name "bin" user-emacs-directory) | 190 | (expand-file-name "bin" user-emacs-directory) |
32 | (expand-file-name "~/bin") | 191 | (expand-file-name "~/bin") |
33 | (expand-file-name "~/.local/bin") | 192 | (expand-file-name "~/.local/bin") |
34 | (expand-file-name "~/Scripts") | 193 | (expand-file-name "~/usr/bin") |
35 | )) | 194 | )) |
36 | (when (file-exists-p path) | 195 | (when (file-exists-p path) |
37 | (add-to-list 'exec-path path :append)))) | 196 | (add-to-list 'exec-path path :append)))) |
38 | 197 | ||
39 | ;; Set $PATH | 198 | ;; Set $PATH back to `exec-path', for symmetry's sake. |
40 | (setenv "PATH" (mapconcat #'identity exec-path path-separator)) | 199 | (setenv "PATH" (mapconcat #'identity exec-path path-separator)) |
41 | (setq package-enable-at-startup nil) | 200 | |
42 | (defun acdw/bootstrap-straight () | 201 | ;; Set some variables |
43 | "Bootstrap straight.el." | 202 | (defvar acdw/etc-dir |
203 | (expand-file-name "etc/" user-emacs-directory) | ||
204 | "Where to put other configurations.") | ||
205 | (defvar acdw/var-dir | ||
206 | (expand-file-name "var/" user-emacs-directory) | ||
207 | "Where to put variable stuff.") | ||
208 | |||
209 | (setq-default package-enable-at-startup nil | ||
210 | package-quickstart nil | ||
211 | straight-use-package-by-default t | ||
212 | straight-host-usernames '((github . "duckwork") | ||
213 | (gitlab . "acdw")) | ||
214 | straight-base-dir acdw/var-dir) | ||
215 | |||
216 | ;; Run `straight''s bootstrap code, after gitting the code directly. | ||
217 | (if (not (executable-find "git")) | ||
218 | (error "No 'git' in $PATH!") | ||
219 | (call-process "git" nil | ||
220 | (get-buffer-create "*bootstrap-straight-messages*") | ||
221 | nil | ||
222 | "clone" | ||
223 | "https://github.com/raxod502/straight.el" | ||
224 | (expand-file-name "repos/straight.el" | ||
225 | straight-base-dir)) | ||
44 | (defvar bootstrap-version) | 226 | (defvar bootstrap-version) |
45 | (let ((bootstrap-file | 227 | (let ((bootstrap-file |
46 | (expand-file-name | 228 | (expand-file-name |
47 | "straight/repos/straight.el/bootstrap.el" | 229 | "repos/straight.el/bootstrap.el" |
48 | user-emacs-directory)) | 230 | straight-base-dir)) |
49 | (bootstrap-version 5)) | 231 | (bootstrap-version 5)) |
50 | (unless (file-exists-p bootstrap-file) | 232 | (unless (file-exists-p bootstrap-file) |
51 | (with-current-buffer | 233 | (with-current-buffer |
@@ -57,67 +239,20 @@ | |||
57 | (goto-char (point-max)) | 239 | (goto-char (point-max)) |
58 | (eval-print-last-sexp))) | 240 | (eval-print-last-sexp))) |
59 | (load bootstrap-file nil 'nomessage))) | 241 | (load bootstrap-file nil 'nomessage))) |
60 | (when (executable-find "git") | ||
61 | (unless (ignore-errors (acdw/bootstrap-straight)) | ||
62 | (let ((msg "Straight.el didn't bootstrap correctly. Cloning directly")) | ||
63 | (message "%s..." msg) | ||
64 | (call-process "git" nil | ||
65 | (get-buffer-create "*bootstrap-straight-messages*") nil | ||
66 | "clone" | ||
67 | "https://github.com/raxod502/straight.el" | ||
68 | (expand-file-name "straight/repos/straight.el" | ||
69 | user-emacs-directory)) | ||
70 | (message "%s...Done." msg) | ||
71 | (acdw/bootstrap-straight)))) | ||
72 | ;; SETUP FRAME | ||
73 | (add-to-list 'default-frame-alist | ||
74 | '(tool-bar-lines . 0)) | ||
75 | |||
76 | (tool-bar-mode -1) | ||
77 | (add-to-list 'default-frame-alist | ||
78 | '(menu-bar-lines . 0)) | ||
79 | |||
80 | (menu-bar-mode -1) | ||
81 | (add-to-list 'default-frame-alist | ||
82 | '(vertical-scroll-bars . nil) | ||
83 | '(horizontal-scroll-bars . nil)) | ||
84 | |||
85 | (scroll-bar-mode -1) | ||
86 | (horizontal-scroll-bar-mode -1) | ||
87 | (setq-default frame-inhibit-implied-resize t | ||
88 | frame-resize-pixelwise t) | ||
89 | (setq-default indicate-empty-lines t) | ||
90 | (setq-default indicate-buffer-boundaries 'right) | ||
91 | (setq-default visual-line-fringe-indicators '(left-curly-arrow nil)) | ||
92 | (defun hook--setup-fringes-curly-arrows () | ||
93 | "Set up curly-arrow fringes." | ||
94 | (define-fringe-bitmap 'left-curly-arrow | ||
95 | [#b11000000 | ||
96 | #b01100000 | ||
97 | #b00110000 | ||
98 | #b00011000]) | ||
99 | 242 | ||
100 | (define-fringe-bitmap 'right-curly-arrow | ||
101 | [#b00011000 | ||
102 | #b00110000 | ||
103 | #b01100000 | ||
104 | #b11000000])) | ||
105 | |||
106 | (add-hook 'after-init-hook #'hook--setup-fringes-curly-arrows) | ||
107 | (defun hook--setup-fringes-arrows () | ||
108 | "Setup arrow fringe bitmaps." | ||
109 | (define-fringe-bitmap 'left-arrow | ||
110 | [#b00000000 | ||
111 | #b01010100 | ||
112 | #b01010100 | ||
113 | #b00000000]) | ||
114 | 243 | ||
115 | (define-fringe-bitmap 'right-arrow | 244 | ;; `use-package' |
116 | [#b00000000 | 245 | |
117 | #b00101010 | 246 | (straight-use-package 'use-package) |
118 | #b00101010 | 247 | (require 'use-package) |
119 | #b00000000])) | 248 | |
120 | 249 | ;; Message startup time | |
121 | (add-hook 'after-init-hook #'hook--setup-fringes-arrows) | 250 | (defun hook--message-startup-time () |
122 | (message "%s... Done." "Loading early-init.el") | 251 | "Message Emacs' startup time." |
123 | ;;; early-init.el ends here | 252 | (message "Emacs ready in %s with %d garbage collections." |
253 | (format "%.2f seconds" | ||
254 | (float-time (time-subtract after-init-time | ||
255 | before-init-time))) | ||
256 | gcs-done)) | ||
257 | |||
258 | (add-hook 'emacs-startup-hook #'hook--message-startup-time) | ||