summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--early-init.el127
-rw-r--r--init.el1386
2 files changed, 819 insertions, 694 deletions
diff --git a/early-init.el b/early-init.el index e7595a9..c67eadb 100644 --- a/early-init.el +++ b/early-init.el
@@ -1,60 +1,67 @@
1;;; early-init.el ~ acdw 1;;; early-init.el ~ acdw -*- lexical-binding: t; coding: utf-8; fill-column: 85 -*-
2 2
3;;; this needs to happen first -- speed up init 3;;; Commentary:
4(setq gc-cons-threshold most-positive-fixnum) 4;; `early-init.el' is new as of Emacs 27.1. It contains ... /early initiation/.
5(defvar file-name-handler-alist-old file-name-handler-alist) 5;; What does that mean? Who knows. What I /do know/ is that it runs /before/
6(setq file-name-handler-alist nil) 6;; `package.el' is loaded, so I can stop it from loading, since I use `straight.el'.
7(setq message-log-max 16384) 7;; Other than that, there's some other init stuff that needs to happen as early
8(setq byte-compile-warnings 8;; as possible -- think bootstrap-level.
9 '(not free-vars unresolved noruntime lexical make-local)) 9
10 10;;; Speed up startup
11(add-hook 'after-init-hook 11(setq gc-cons-threshold most-positive-fixnum)
12 (lambda () 12
13 (setq file-name-handler-alist file-name-handler-alist-old) 13(defvar file-name-handler-alist-old file-name-handler-alist)
14 (setq gc-cons-threshold (* 32 1024 1024))) 14(setq file-name-handler-alist nil)
15 t) 15
16 16(setq message-log-max 16384)
17;;(setq debug-on-error t) 17(setq byte-compile-warnings
18 18 '(not free-vars unresolved noruntime lexical make-local))
19;;; different platforms 19
20(defconst *acdw/at-work* (eq system-type 'windows-nt)) 20;;; Restore stuff after startup
21(defconst *acdw/at-larry* (string= (system-name) "larry")) 21(add-hook 'after-init-hook
22(defconst *acdw/at-bax* (string= (system-name) "bax")) 22 (lambda ()
23(defconst *acdw/at-home* (or *acdw/at-larry* *acdw/at-bax*)) 23 (setq file-name-handler-alist file-name-handler-alist-old)
24 24 (setq gc-cons-threshold (* 32 1024 1024))
25;; this needs to be before bootstrapping straight.el 25 (garbage-collect))
26(when *acdw/at-work* 26 t)
27 (add-to-list 'exec-path "~/bin") 27
28 (add-to-list 'exec-path "C:/Users/aduckworth/Downloads/PortableGit/bin")) 28;; (setq debug-on-error t)
29 29
30;;; gui 30;;; Define the platforms I work on
31(add-to-list 'default-frame-alist '(tool-bar-lines . 0)) 31(defconst *acdw/at-work* (eq system-type 'windows-nt))
32(add-to-list 'default-frame-alist '(menu-bar-lines . 0)) 32(defconst *acdw/at-larry* (string= (system-name) "larry"))
33 33(defconst *acdw/at-bax* (string= (system-name) "bax"))
34(setq inhibit-startup-buffer-menu t) 34(defconst *acdw/at-home* (or *acdw/at-larry* *acdw/at-bax*))
35(setq inhibit-startup-screen t) 35
36(setq initial-buffer-choice t) 36;;;; When at work, I have to use Portable Git.
37(setq initial-scratch-message nil) 37(when *acdw/at-work*
38 38 (add-to-list 'exec-path "~/bin")
39;;; straight.el ~ github.com/raxod502/straight.el 39 (add-to-list 'exec-path "C:/Users/aduckworth/Downloads/PortableGit/bin"))
40 40
41(setq straight-use-package-by-default t) ; use use-package 41;;; `straight.el' ~ github.com/raxod502/straight.el
42(setq use-package-hook-name-suffix nil) ; don't assume -hook 42
43 43;;;; Bootstrap
44;; bootstrap 44;; NOTE: this doesn't work on Windows (download straight directly)
45(defvar bootstrap-version) 45(defvar bootstrap-version)
46(let ((bootstrap-file 46(let ((bootstrap-file
47 (expand-file-name "straight/repos/straight.el/bootstrap.el" 47 (expand-file-name "straight/repos/straight.el/bootstrap.el"
48 user-emacs-directory)) 48 user-emacs-directory))
49 (bootstrap-version 5)) 49 (bootstrap-version 5))
50 (unless (file-exists-p bootstrap-file) 50 (unless (file-exists-p bootstrap-file)
51 (with-current-buffer 51 (with-current-buffer
52 (url-retrieve-synchronously 52 (url-retrieve-synchronously
53 "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el" 53 "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
54 'silent 'inhibit-cookies) 54 'silent 'inhibit-cookies)
55 (goto-char (point-max)) 55 (goto-char (point-max))
56 (eval-print-last-sexp))) 56 (eval-print-last-sexp)))
57 (load bootstrap-file nil 'nomessage)) 57 (load bootstrap-file nil 'nomessage))
58 58
59;; install use-package with straight 59;;; Bootstrap `use-package'
60(straight-use-package 'use-package) 60(setq-default use-package-verbose nil
61 use-package-expand-minimally t
62 use-package-enable-imenu-support t
63 use-package-hook-name-suffix nil)
64
65(straight-use-package 'use-package)
66
67(setq straight-use-package-by-default t)
diff --git a/init.el b/init.el index 57a2c47..4d5cb48 100644 --- a/init.el +++ b/init.el
@@ -1,634 +1,752 @@
1;;; init.el ~ acdw -*- lexical-binding: t -*- 1;;; init.el -*- lexical-binding: t; coding: utf-8; fill-column: 70 -*-
2 2
3;;; emacs configuration - general 3;;; Commentary:
4 4;; I /was/ going to convert this to org-mode, but then I found this
5(use-package emacs 5;; page: https://yiufung.net/post/pure-emacs-lisp-init-skeleton/,
6 :demand 6;; which pointed out that I could use `outline-mode' (or in my case,
7 :init 7;; `outshine') to fold and navigate a pure-elisp `init.el'. So that's
8 (setq calendar-location-name "Baton Rouge, LA") 8;; what I'm doing.
9 (setq calendar-latitude 30.39) 9
10 (setq calendar-longitude -91.83) 10;;; Basic emacs config & built-in packages
11 11;;;; /Really/ basic emacs config
12 (setq browse-url-browser-function 'browse-url-generic) 12;; I /did/ use `better-defaults', but it turns out that that package
13 (setq browse-url-generic-program "firefox")) 13;; is (a) short and (b) mostly overriden by other settings.
14 14(use-package emacs
15(use-package no-littering 15 :demand ; make sure this stuff loads
16 :config 16 :init
17 (require 'recentf) 17 ;; where I am
18 (add-to-list 'recentf-exclude no-littering-var-directory) 18 (setq calendar-location-name "Baton Rouge, LA")
19 (add-to-list 'recentf-exclude no-littering-etc-directory) 19 (setq calendar-latitude 30.39)
20 20 (setq calendar-longitude -91.83)
21 (setq delete-old-versions t) 21
22 (setq kept-new-versions 6) 22 ;; firefox is love, firefox is life
23 (setq kept-old-versions 2) 23 (setq browse-url-browser-function 'browse-url-firefox
24 (setq version-control t) 24 browse-url-new-window-flag t
25 (setq backup-directory-alist 25 browse-url-firefox-new-window-is-tab t)
26 `((".*" . ,(no-littering-expand-var-file-name "backup/")))) 26
27 27 ;; honestly not sure if this is necessary
28 (setq auto-save-file-name-transforms 28 (autoload 'zap-up-to-char "misc"
29 `((".*" ,(no-littering-expand-var-file-name "auto-save/") t))) 29 "Kill up to, but not including, ARGth occurence of CHAR." t)
30 (auto-save-mode) 30
31 31 ;; show parentheses
32 (setq custom-file (no-littering-expand-etc-file-name "custom.el")) 32 (setq show-paren-style 'mixed)
33 33 (show-paren-mode)
34 (setq create-lockfiles nil)) 34
35 35 ;; always work on visual lines
36(use-package auth-source 36 (global-visual-line-mode)
37 :init 37
38 (setq auth-sources '("~/.authinfo")) ;; TODO: gpg 38 ;; make the mouse avoid where I'm typing
39 (setq user-full-name "Case Duckworth") 39 (mouse-avoidance-mode 'jump)
40 (setq user-mail-address "acdw@acdw.net")) 40
41 41 ;; delete the selection when I start typing, like a normal editor
42(use-package better-defaults 42 (delete-selection-mode)
43 :demand 43
44 :config ; add other "better defaults" of my own 44 ;; ignore case
45 (when *acdw/at-larry* 45 (setq-default completion-ignore-case t
46 (setq visible-bell nil)) 46 read-buffer-completion-ignore-case t
47 47 read-file-name-completion-ignore-case t)
48 (auto-save-mode) 48
49 49 ;; etc defaults
50 (defun full-auto-save () 50 (fset 'yes-or-no-p 'y-or-n-p)
51 (interactive) 51 (setq-default indent-tabs-mode nil
52 (save-excursion 52 save-interprogram-paste-before-kill t
53 (dolist (buf (buffer-list)) 53 apropos-do-all t
54 (set-buffer buf) 54 mouse-yank-at-point t
55 (if (and (buffer-file-name) (buffer-modified-p)) 55 require-final-newline t
56 (basic-save-buffer))))) 56 visible-bell (not *acdw/at-larry*)
57 (add-hook 'auto-save-hook 'full-auto-save) 57 ediff-window-setup-function 'ediff-setup-windows-plain
58 (add-hook 'focus-out-hook 'full-auto-save) ; might be resource-intensive 58 use-dialog-box nil
59 59 mark-even-if-inactive nil
60 ;; follow the split! 60 sentence-end-double-space t)
61 (defun split-and-follow-below () 61
62 (interactive) 62 ;; utf-8 is now, old man
63 (split-window-below) 63 (set-charset-priority 'unicode)
64 (balance-windows) 64 (set-language-environment "UTF-8")
65 (other-window 1)) 65 (set-default-coding-systems 'utf-8)
66 66 (set-terminal-coding-system 'utf-8)
67 (defun split-and-follow-right () 67 (set-keyboard-coding-system 'utf-8)
68 (interactive) 68 (set-selection-coding-system 'utf-8)
69 (split-window-right) 69 (prefer-coding-system 'utf-8)
70 (balance-windows) 70 (setq default-buffer-file-coding-system 'utf-8
71 (other-window 1)) 71 default-process-coding-system '(utf-8-unix . utf-8-unix)
72 72 locale-coding-system 'utf-8)
73 (setq save-place-file (no-littering-expand-var-file-name "places")) 73
74 (save-place-mode) 74 ;; don't confirm killing
75 75 (setq confirm-kill-processes nil
76 (set-language-environment "UTF-8") 76 confirm-kill-emacs nil)
77 (prefer-coding-system 'utf-8) 77
78 (set-default-coding-systems 'utf-8) 78 ;; simplify the GUI
79 (set-terminal-coding-system 'utf-8) 79 (setq default-frame-alist '((tool-bar-lines . 0)
80 (set-keyboard-coding-system 'utf-8) 80 (menu-bar-lines . 0)
81 (setq default-buffer-file-coding-system 'utf-8) 81 (vertical-scroll-bars . nil)
82 82 (horizontal-scroll-bars . nil)
83 (fset 'yes-or-no-p 'y-or-n-p) 83 (right-divider-width . 2)
84 84 (bottom-divider-width . 2)
85 (global-visual-line-mode) 85 (left-fringe-width . 2)
86 (mouse-avoidance-mode 'jump) 86 (right-fringe-width . 2))
87 (setq show-paren-style 'mixed) 87 inhibit-startup-buffer-menu t
88 (delete-selection-mode 1) 88 inhibit-startup-screen t
89 89 initial-buffer-choice t
90 ;; TODO figure out how to add this to the :hook block 90 initial-scratch-message nil)
91 (add-hook 'prog-mode-hook (if (and (fboundp 'display-line-numbers-mode) 91
92 (display-graphic-p)) 92 ;; When at larry, fullscreen emacs.
93 #'display-line-numbers-mode 93 (when *acdw/at-larry*
94 #'linum-mode)) 94 (add-to-list 'default-frame-alist '(fullscreen . maximized)))
95 95
96 (setq completion-ignore-case t) 96 ;; set up the cursor
97 (setq read-buffer-completion-ignore-case t) 97 (blink-cursor-mode 0)
98 (setq read-file-name-completion-ignore-case t) 98 (setq-default cursor-type 'bar
99 99 cursor-in-non-selected-windows 'hollow)
100 ;; don't confirm death 100
101 (setq confirm-kill-processes nil) 101 ;; display line numbers in `prog-mode'
102 (setq confirm-kill-emacs nil) 102 (add-hook 'prog-mode-hook
103 103 (if (and (fboundp 'display-line-numbers-mode)
104 ;; cursor betterment 104 (display-graphic-p))
105 (blink-cursor-mode 0) 105 #'display-line-numbers-mode
106 (setq-default cursor-type 'bar) 106 #'linum-mode))
107 107
108 :bind 108 ;; custom functions
109 ([remap split-window-below] . split-and-follow-below) 109 (defun split-and-follow-below ()
110 ([remap split-window-right] . split-and-follow-right) 110 "Split the window below and switch to the split."
111 111 (interactive)
112 :hook 112 (split-window-below)
113 (prog-mode-hook . prettify-symbols-mode) 113 (balance-windows)
114 (auto-save-hook . full-auto-save) 114 (other-window 1))
115 (focus-out-hook . full-auto-save) 115
116 (before-save-hook . delete-trailing-whitespace)) 116 (defun split-and-follow-right ()
117 117 "Split the window right and switch to the split."
118(use-package async 118 (interactive)
119 :config 119 (split-window-right)
120 (dired-async-mode 1)) 120 (balance-windows)
121 121 (other-window 1))
122(use-package auto-compile 122
123 :config 123 (defun full-auto-save ()
124 (auto-compile-on-load-mode) 124 "Save all buffers that (a) have files associated and (b) are modified."
125 (setq load-prefer-newer t)) 125 (interactive)
126 126 (save-excursion
127;; start the server when at home 127 (dolist (buf (buffer-list))
128 128 (set-buffer buf)
129(if *acdw/at-home* 129 (if (and (buffer-file-name) (buffer-modified-p))
130 (server-start)) 130 (basic-save-buffer)))))
131 131
132;;; quality-of-life improvements 132 (defun kill-this-buffer ()
133 133 "Kill the current buffer."
134(use-package diminish) 134 (interactive)
135 135 (kill-buffer nil))
136(use-package which-key 136
137 :diminish which-key-mode 137 :bind
138 :config 138 ("C-x C-b" . ibuffer)
139 (which-key-mode)) 139 ("M-z" . zap-up-to-char)
140 140 ([remap split-window-below] . split-and-follow-below)
141(use-package recentf 141 ([remap split-window-right] . split-and-follow-right)
142 :init 142 ("C-x f" . find-file)
143 (setq recentf-max-menu-items 100) 143 ("C-z" . nil)
144 (setq recentf-max-saved-items 100) 144 ("C-x k" . kill-this-buffer)
145 :config 145 ("C-x K" . kill-buffer)
146 (recentf-mode)) 146
147 147 :hook
148(use-package savehist 148 (prog-mode-hook . prettify-symbols-mode)
149 :config 149 ((auto-save-hook focus-out-hook) . full-auto-save)
150 (savehist-mode) 150 (before-save-hook . delete-trailing-whitespace))
151 (setq savehist-additional-variables 151
152 '(kill-ring search-ring regexp-search-ring))) 152;;;; Keep .emacs.d clean
153 153;; load this early for other packages to use
154(use-package restart-emacs) 154(use-package no-littering
155 155 :demand
156(use-package volatile-highlights 156 :config
157 :config 157 (setq custom-file (no-littering-expand-etc-file-name "custom.el"))
158 (volatile-highlights-mode t)) 158
159 159 (setq create-lockfiles nil)
160(use-package zop-to-char 160
161 :bind 161 (setq delete-old-versions t
162 ([remap zap-to-char] . zop-to-char) 162 kept-new-versions 6
163 ([remap zap-up-to-char] . zop-up-to-char)) 163 kept-old-versions 2
164 164 version-control t)
165(use-package easy-kill 165
166 :bind 166 (setq backup-directory-alist
167 ([remap kill-ring-save] . easy-kill) 167 `((".*" . ,(no-littering-expand-var-file-name "backup/"))))
168 ([remap mark-sexp] . easy-mark)) 168
169 169 (setq auto-save-file-name-transforms
170(use-package whole-line-or-region 170 `((".*" ,(no-littering-expand-var-file-name "auto-save/") t)))
171 :config 171 (auto-save-mode))
172 (whole-line-or-region-global-mode 1)) 172
173 173;;;; Uniquily name buffers
174(use-package avy 174(use-package uniquify
175 :bind 175 :straight nil
176 ("M-s" . avy-goto-char-timer)) 176 :init
177 177 (setq uniquify-buffer-name-style 'forward))
178(use-package selectrum 178
179 :config 179;;;; Use async when possible
180 (ido-mode -1) ;; not sure why this is necessary 180(use-package async
181 (setq enable-recursive-minibuffers t) 181 :config
182 (minibuffer-depth-indicate-mode) 182 (dired-async-mode))
183 (selectrum-mode 1)) 183
184 184;;;; Autocompile elisp files (like this one)
185(use-package prescient) 185(use-package auto-compile
186 186 :init
187(use-package selectrum-prescient 187 (setq load-prefer-newer t)
188 :config 188 :config
189 (selectrum-prescient-mode 1) 189 (auto-compile-on-load-mode))
190 (prescient-persist-mode 1)) 190
191 191;;;; Recent files
192(use-package ctrlf 192(use-package recentf
193 :config 193 :init
194 (ctrlf-mode 1)) 194 (setq recentf-max-menu-items 100
195 195 recentf-max-saved-items 100)
196;;; programming 196 :config
197 197 (add-to-list 'recentf-exclude no-littering-var-directory)
198(use-package aggressive-indent 198 (add-to-list 'recentf-exclude no-littering-etc-directory)
199 :diminish aggressive-indent-mode 199 (recentf-mode))
200 :hook 200;;;; Save places in files
201 (prog-mode-hook . aggressive-indent-mode)) 201(use-package saveplace
202 202 :init
203(use-package magit 203 (setq save-place-file (no-littering-expand-var-file-name "places"))
204 :if *acdw/at-home* 204 (when *acdw/at-work*
205 :bind 205 (setq save-place-forget-unreadable-files nil))
206 ("C-x g" . magit)) 206 :config
207 207 (save-place-mode))
208(use-package forge 208
209 :if *acdw/at-home* 209;;;; Save history of commands, etc.
210 :after magit 210(use-package savehist
211 :custom 211 :init
212 (forge-owned-accounts '(("duckwork")))) 212 (setq savehist-additional-variables
213 213 '(kill-ring
214(use-package company 214 search-ring
215 :commands company-mode 215 regexp-search-ring))
216 :init 216 :config
217 (setq company-idle-delay 0.1) 217 (savehist-mode))
218 :hook 218
219 (prog-mode-hook . company-mode) 219;;;; Authority sources for logins
220 :bind (:map company-active-map 220;; TODO: use gpg
221 ("C-n" . company-select-next) 221(use-package auth-source
222 ("C-p" . company-select-previous)) 222 :init
223 :config 223 (setq auth-sources '("~/.authinfo"))
224 (use-package company-quickhelp 224 (setq user-full-name "Case Duckworth")
225 :hook 225 (setq user-mail-address "acdw@acdw.net"))
226 (company-mode-hook . (lambda () 226
227 (company-quickhelp-local-mode))))) 227;;; General-ish Packages
228 228;;;; General improvements
229(use-package helpful 229;;;;; Diminish TODO: is this necessary?
230 :bind 230(use-package diminish)
231 ("C-h f" . helpful-callable) 231
232 ("C-h v" . helpful-variable) 232;;;;; Restart emacs /from within/ emacs
233 ("C-h k" . helpful-key) 233(use-package restart-emacs)
234 ("C-c C-d" . helpful-at-point) 234
235 ("C-h F" . helpful-function) 235;;;; User interface
236 ("C-h C" . helpful-command)) 236;;;;; Pop-up help for keys
237 237(use-package which-key
238(when *acdw/at-home* 238 :diminish which-key-mode
239 (use-package su 239 :init
240 :config 240 (setq which-key-enable-extended-define-key t)
241 (su-mode)) 241 :config
242 242 (which-key-setup-side-window-right-bottom)
243 (use-package trashed 243 (which-key-mode))
244 :init 244
245 (setq delete-by-moving-to-trash t))) 245;;;;; A better help buffer
246 246(use-package helpful
247(use-package smartparens 247 :bind
248 :config 248 ("C-h f" . helpful-callable)
249 (require 'smartparens-config) 249 ("C-h v" . helpful-variable)
250 (smartparens-global-mode)) 250 ("C-h k" . helpful-key)
251 251 ("C-c C-d" . helpful-at-point)
252 252 ("C-h F" . helpful-function)
253(use-package rainbow-mode 253 ("C-h C" . helpful-command))
254 :hook 254
255 (prog-mode-hook . rainbow-mode)) 255;;;;; A better `outline-mode'
256 256(use-package outshine
257;;; writing 257 :init
258 258 (setq outshine-cycle-emulate-tab t)
259(use-package visual-fill-column 259 :bind (:map outshine-mode-map
260 :init 260 ("<S-iso-lefttab>" . outshine-cycle-buffer)
261 (setq split-window-preferred-function 'visual-fill-column-split-window-sensibly) 261 ("<backtab>" . outshine-cycle-buffer))
262 (setq visual-fill-column-center-text t) 262 :hook
263 :config 263 (emacs-lisp-mode . outshine-mode))
264 (advice-add 'text-scale-adjust 264
265 :after #'visual-fill-column-adjust)) 265;;;;; Item selection & narrowing
266 266(use-package selectrum
267;;; window management 267 :init
268 268 (setq enable-recursive-minibuffers t)
269(use-package switch-window 269 (minibuffer-depth-indicate-mode)
270 :init 270 :config
271 (setq switch-window-shortcut-style 'qwerty) 271 (selectrum-mode))
272 :bind 272
273 ([remap other-window] . switch-window) 273(use-package prescient)
274 ("s-o" . switch-window)) 274
275 275(use-package selectrum-prescient
276;;; theming and looks 276 :config
277 277 (selectrum-prescient-mode)
278(use-package dynamic-fonts 278 (prescient-persist-mode))
279 :init 279
280 (setq dynamic-fonts-preferred-monospace-fonts 280;;;;; Searching
281 '("Iosevka Term Slab" 281(use-package ctrlf
282 "Consolas" 282 :config
283 "Fira Code" 283 (ctrlf-mode))
284 "DejaVu Sans Mono" 284
285 "Courier" 285;;;;; Visually switch windows
286 "Fixed")) 286(use-package switch-window
287 (setq dynamic-fonts-preferred-monospace-point-size 11) 287 :init
288 (setq dynamic-fonts-preferred-proportional-fonts 288 (setq switch-window-shortcut-style 'qwerty)
289 '("DejaVu Sans" 289 :bind
290 "Georgia" 290 ([remap other-window] . switch-window)
291 "Times New Roman" 291 ("s-o" . switch-window))
292 "Times")) 292
293 (setq dynamic-fonts-preferred-proportional-point-size 12) 293;;;; Theming, looks, fonts
294 :config 294;;;;; Modeline
295 (dynamic-fonts-setup)) 295(use-package doom-modeline
296 296 :init
297(use-package doom-modeline 297 (setq doom-modeline-icon nil
298 :init 298 doom-modeline-enable-word-count t)
299 (setq doom-modeline-icon nil) 299
300 (setq doom-modeline-enable-word-count t) 300 (when *acdw/at-larry*
301 (when *acdw/at-larry* 301 (setq display-time-format "%R")
302 (setq display-time-format "%R") 302 (display-time-mode))
303 (display-time-mode)) 303
304 :hook 304 :hook
305 (after-init-hook . doom-modeline-mode)) 305 (window-setup-hook . doom-modeline-mode))
306 306;;;;; Ligatures
307(use-package ligature 307(use-package ligature
308 :straight (ligature 308 :straight (ligature
309 :host github 309 :host github
310 :repo "mickeynp/ligature.el") 310 :repo "mickeynp/ligature.el")
311 :config 311 :config
312 (ligature-set-ligatures 'prog-mode 312 (ligature-set-ligatures 'prog-mode
313 '("++" "--" "/=" "&&" "||" "||=" 313 '("++" "--" "/=" "&&" "||" "||="
314 "->" "=>" "::" "__" 314 "->" "=>" "::" "__"
315 "==" "===" "!=" "=/=" "!==" 315 "==" "===" "!=" "=/=" "!=="
316 "<=" ">=" "<=>" 316 "<=" ">=" "<=>"
317 "/*" "*/" "//" "///" 317 "/*" "*/" "//" "///"
318 "\\n" "\\\\" 318 "\\n" "\\\\"
319 "<<" "<<<" "<<=" ">>" ">>>" ">>=" 319 "<<" "<<<" "<<=" ">>" ">>>" ">>="
320 "|=" "^=" 320 "|=" "^="
321 "**" "--" "---" "----" "-----" 321 "**" "--" "---" "----" "-----"
322 "==" "===" "====" "=====" 322 "==" "===" "====" "====="
323 "</" "<!--" "</>" "-->" "/>" 323 "</" "<!--" "</>" "-->" "/>"
324 ":=" "..." ":>" ":<" ">:" "<:" 324 ":=" "..." ":>" ":<" ">:" "<:"
325 "::=" ;; add others here 325 "::=" ;; add others here
326 )) 326 ))
327 (global-ligature-mode t)) 327 (global-ligature-mode))
328 328;;;;; Unicode
329(use-package unicode-fonts 329(use-package unicode-fonts
330 :config 330 :config
331 (unicode-fonts-setup)) 331 (unicode-fonts-setup))
332 332;;;;; Modus themes
333;; modus themes 333(use-package modus-operandi-theme
334 334 :if window-system
335(use-package modus-operandi-theme 335 :config
336 :if window-system 336 (load-theme 'modus-operandi t t)
337 :config 337
338 (load-theme 'modus-operandi t t) 338 (defun acdw/sunrise ()
339 339 (enable-theme 'modus-operandi)
340 (defun acdw/sunrise () 340 (start-process-shell-command "light" nil "light -S 60"))
341 (enable-theme 'modus-operandi) 341
342 (start-process-shell-command "light" nil "light -S 60")) 342 (if *acdw/at-work*
343 343 (enable-theme 'modus-operandi)
344 (if *acdw/at-work* 344 (run-at-time (nth 1 (split-string (sunrise-sunset)))
345 (enable-theme 'modus-operandi) 345 (* 60 60 24) #'acdw/sunrise)))
346 (run-at-time (nth 1 (split-string (sunrise-sunset))) 346
347 (* 60 60 24) #'acdw/sunrise))) 347(when *acdw/at-home*
348 348 (use-package modus-vivendi-theme
349(when *acdw/at-home* 349 :if window-system
350 (use-package modus-vivendi-theme 350 :config
351 :if window-system 351 (load-theme 'modus-vivendi t t)
352 :config 352
353 (load-theme 'modus-vivendi t t) 353 (defun acdw/sunset ()
354 354 (enable-theme 'modus-vivendi)
355 (defun acdw/sunset () 355 (start-process-shell-command "light" nil "light -S 35"))
356 (enable-theme 'modus-vivendi) 356
357 (start-process-shell-command "light" nil "light -S 35")) 357 (run-at-time (nth 4 (split-string (sunrise-sunset)))
358 358 (* 60 60 24) #'acdw/sunset)
359 (run-at-time (nth 4 (split-string (sunrise-sunset))) 359 (run-at-time "12am" (* 60 60 24) #'acdw/sunset)))
360 (* 60 60 24) #'acdw/sunset) 360;;;; General text editing
361 (run-at-time "12am" (* 60 60 24) #'acdw/sunset))) 361;;;;; Jump to characters fast
362 362(use-package avy
363;;; gemini/gopher 363 :bind
364(use-package elpher 364 ("M-s" . avy-goto-char-timer))
365 :straight (elpher 365;;;;; Show text commands acted on
366 :repo "git://thelambdalab.xyz/elpher.git") 366(use-package volatile-highlights
367 :bind (:map elpher-mode-map 367 :config
368 ("n" . elpher-next-link) 368 (volatile-highlights-mode))
369 ("p" . elpher-prev-link) 369;;;;; Visual replacement for `zap-to-char'
370 ("o" . elpher-follow-current-link) 370(use-package zop-to-char
371 ("G" . elpher-go-current)) 371 :bind
372 :hook (elpher-mode-hook . (lambda () 372 ([remap zap-to-char] . zop-to-char)
373 (variable-pitch-mode 1) 373 ([remap zap-up-to-char] . zop-up-to-char))
374 (visual-fill-column-mode 1)))) 374;;;;; Kill & mark things more visually
375 375(use-package easy-kill
376(use-package gemini-mode 376 :bind
377 :straight (gemini-mode 377 ([remap kill-ring-save] . easy-kill)
378 :repo "https://git.carcosa.net/jmcbray/gemini.el.git")) 378 ([remap mark-sexp] . easy-mark))
379 379;;;;; Operate on the current line if no region is active
380(use-package gemini-write 380(use-package whole-line-or-region
381 :straight (gemini-write 381 :config
382 :repo "https://alexschroeder.ch/cgit/gemini-write")) 382 (whole-line-or-region-global-mode))
383 383
384(defun post-to-gemlog-blue (post-title user pass) 384;;;;; Expand region
385 "Post current buffer to gemlog.blue." 385(use-package expand-region
386 (interactive 386 :bind
387 (let* ((title-maybe (progn ;; TODO this is ... clunky 387 ("C-=" . er/expand-region))
388 (goto-char (point-min)) 388;;;; Programming
389 (if (re-search-forward "^# \\(.*\\)" nil t) 389;;;;; Code completion
390 (buffer-substring-no-properties 390(use-package company
391 (match-beginning 1) 391 :init
392 (match-end 1)) 392 (setq company-idle-delay 0.1
393 ""))) 393 company-show-numbers t)
394 (title (read-string 394 :config
395 (format "Title%s: " 395 (let ((map company-active-map))
396 (if (string= "" title-maybe) 396 (mapc (lambda (x)
397 "" 397 (define-key map (format "%d" x)
398 (concat " (" title-maybe ")"))) 398 `(lambda ()
399 nil nil title-maybe)) 399 (interactive)
400 (user (read-string "User: " nil)) 400 (company-complete-number ,x))))
401 (pass (read-passwd "Pass: " nil))) 401 (number-sequence 0 9)))
402 (list title user pass))) 402 :hook
403 403 (prog-mode-hook . company-mode)
404 (require 'mm-url) 404 :bind (:map company-active-map
405 (let ((url-request-method "POST") 405 ("C-n" . company-select-next)
406 (url-request-extra-headers 406 ("C-p" . company-select-previous)))
407 '(("Content-Type" . "application/x-www-form-urlencoded"))) 407
408 (url-request-data 408(use-package company-quickhelp
409 (mm-url-encode-www-form-urlencoded 409 :hook
410 `(("title" . ,post-title) 410 (company-mode-hook . company-quickhelp-local-mode))
411 ("gemloguser" . ,user) 411
412 ("pw" . ,pass) 412(use-package company-prescient
413 ("post" . ,(buffer-string)))))) 413 :hook
414 (with-current-buffer 414 (company-mode-hook . company-prescient-mode))
415 (url-retrieve-synchronously "https://gemlog.blue/post.php") 415
416 (goto-char (point-min)) 416;;;;; Git integration
417 (re-search-forward "\\(gemini://.*\\.gmi\\)") 417(use-package magit
418 (elpher-go (match-string 1))))) 418 :if *acdw/at-home*
419 419 :bind
420;;; exwm ~ Emacs X Window Manager 420 ("C-x g" . magit-status)
421(when *acdw/at-larry* 421 :config
422 (use-package exwm 422 (add-to-list 'magit-no-confirm 'stage-all-changes))
423 :if window-system 423
424 :demand 424;; use libgit to speed up magit, only at home
425 :custom 425(when (and *acdw/at-home* (executable-find "cmake"))
426 (exwm-layout-show-all-buffers t) 426 (use-package libgit)
427 (exwm-workspace-warp-cursor t) 427
428 ;;(mouse-autoselect-window t) 428 (use-package magit-libgit
429 (exwm-workspace-number 4) 429 :after (magit libgit))
430 (exwm-input-global-keys 430 )
431 `( 431
432 ([remap split-window-below] . split-and-follow-below) 432(use-package forge
433 ([remap split-window-right] . split-and-follow-right) 433 :if *acdw/at-home*
434 ([?\s-r] . exwm-reset) 434 :after magit
435 ([?\s-w] . exwm-workspace-switch) 435 :config
436 ([?\s-&] . (lambda (command) 436 (setq forge-owned-accounts '(("duckwork"))))
437 (interactive (list (read-shell-command "$ "))) 437;;;;; Code formatting & display
438 (start-process-shell-command command nil command))) 438;;;;;; Keep code properly indented
439 ,@(mapcar (lambda (i) 439(use-package aggressive-indent
440 `(,(kbd (format "s-%d" i)) . 440 :diminish aggressive-indent-mode
441 (lambda () 441 :hook
442 (interactive) 442 (prog-mode-hook . aggressive-indent-mode))
443 (exwm-workspace-switch-create ,i)))) 443;;;;;; Smartly deal with pairs
444 (number-sequence 0 9)))) 444(use-package smartparens
445 (exwm-input-simulation-keys 445 :config
446 '(([?\C-b] . [left]) 446 (require 'smartparens-config)
447 ([?\M-b] . [C-left]) 447 (smartparens-global-mode))
448 ([?\C-f] . [right]) 448;;;;;; Show delimiters as different colors
449 ([?\M-f] . [C-right]) 449(use-package rainbow-delimiters
450 ([?\C-p] . [up]) 450 :hook
451 ([?\C-n] . [down]) 451 (prog-mode-hook . rainbow-delimiters-mode))
452 ([?\C-a] . [home]) 452;;;;;; Show colors as they appear in the buffer
453 ([?\C-e] . [end]) 453(use-package rainbow-mode
454 ([?\M-v] . [prior]) 454 :hook
455 ([?\C-v] . [next]) 455 (prog-mode-hook . rainbow-mode))
456 ([?\C-d] . [delete]) 456;;;; Writing
457 ([?\C-k] . [S-end delete]) 457;;;;; `fill-column', but in `visual-line-mode'
458 ([?\C-s] . [?\C-f]) 458(use-package visual-fill-column
459 ([?\C-w] . [?\C-x]) 459 :init
460 ([?\M-w] . [?\C-c]) 460 (setq split-window-preferred-function 'visual-fill-column-split-window-sensibly)
461 ([?\C-y] . [?\C-v]))) 461 (setq visual-fill-column-center-text t)
462 :hook 462 :config
463 ((exwm-update-class-hook . 463 (advice-add 'text-scale-adjust
464 (lambda () "Rename buffer to window's class name" 464 :after #'visual-fill-column-adjust))
465 (exwm-workspace-rename-buffer exwm-class-name))) 465
466 (exwm-update-title-hook . 466;;;; Machine-specific
467 (lambda () "Update workspace name to window title" 467;;;;; Linux at home
468 (when (not exwm-instance-name) 468(when *acdw/at-home*
469 (exwm-workspace-rename-buffer exwm-title)))) 469;;;;;; Edit files with `sudo' (I think?)
470 (exwm-init-hook . window-divider-mode) 470 (use-package su
471 (exwm-init-hook . 471 :config
472 (lambda () "Autostart" 472 (su-mode))
473 (start-process-shell-command "cmst" nil "cmst -m -w 5") 473;;;;;; Implement XDG Trash specification
474 (start-process-shell-command "keepassxc" nil "keepassxc") 474 (use-package trashed
475 (start-process-shell-command 475 :init
476 "pa-applet" nil 476 (setq delete-by-moving-to-trash t))
477 "pa-applet --disable-key-grabbing --disable-notifications") 477;;;;;; Build exec-path from $PATH
478 (start-process-shell-command 478 (use-package exec-path-from-shell
479 "cbatticon" nil "cbatticon")))) 479 :demand
480 :config 480 :config
481 (require 'exwm) 481 (exec-path-from-shell-initialize))
482 (exwm-enable) 482 )
483 (require 'exwm-systemtray) 483;;; Specialized packages
484 (exwm-systemtray-enable)) 484;;;; Gemini & Gopher
485 485(use-package elpher
486 (use-package exwm-firefox-core 486 :straight (elpher
487 :after exwm 487 :repo "git://thelambdalab.xyz/elpher.git")
488 :straight (exwm-firefox-core 488 :bind (:map elpher-mode-map
489 :type git 489 ("n" . elpher-next-link)
490 :host github 490 ("p" . elpher-prev-link)
491 :repo "walseb/exwm-firefox-core")) 491 ("o" . elpher-follow-current-link)
492 492 ("G" . elpher-go-current))
493 (use-package exwm-firefox 493 :hook (elpher-mode-hook . (lambda ()
494 :after exwm-firefox-core 494 (variable-pitch-mode)
495 :straight (exwm-firefox 495 (set-fill-column 100)
496 :type git 496 (visual-fill-column-mode))))
497 :host github 497
498 :repo "ieure/exwm-firefox") 498(use-package gemini-mode
499 :config 499 :straight (gemini-mode
500 (exwm-firefox-mode)) 500 :repo "https://git.carcosa.net/jmcbray/gemini.el.git"))
501 501
502 (use-package exwm-mff 502(use-package gemini-write
503 :straight (exwm-mff 503 :straight (gemini-write
504 :host github 504 :repo "https://alexschroeder.ch/cgit/gemini-write"))
505 :repo "ieure/exwm-mff" 505
506 :fork ( 506(defun post-to-gemlog-blue (post-title user pass)
507 :host github 507 "Post current buffer to gemlog.blue."
508 :repo "duckwork/exwm-mff")) 508 (interactive
509 :after exwm 509 (let* ((title-maybe (progn ;; TODO this is ... clunky
510 :hook 510 (goto-char (point-min))
511 (exwm-init-hook . exwm-mff-mode)) 511 (if (re-search-forward "^# \\(.*\\)" nil t)
512 512 (buffer-substring-no-properties
513 (use-package exwm-edit) 513 (match-beginning 1)
514 514 (match-end 1))
515 ) ;; end of *acdw/at-larry* block for exwm 515 "")))
516 516 (title (read-string
517;;; other applications 517 (format "Title%s: "
518(use-package circe 518 (if (string= "" title-maybe)
519 :if *acdw/at-larry* 519 ""
520 :init 520 (concat " (" title-maybe ")")))
521 (defun my/fetch-password (&rest params) 521 nil nil title-maybe))
522 "Fetch a password from auth-sources" 522 (user (read-string "User: " nil))
523 (require 'auth-source) 523 (pass (read-passwd "Pass: " nil)))
524 (let ((match (car (apply 'auth-source-search params)))) 524 (list title user pass)))
525 (if match 525
526 (let ((secret (plist-get match :secret))) 526 (require 'mm-url)
527 (if (functionp secret) 527 (let ((url-request-method "POST")
528 (funcall secret) 528 (url-request-extra-headers
529 secret)) 529 '(("Content-Type" . "application/x-www-form-urlencoded")))
530 (error "Password not found for %S" params)))) 530 (url-request-data
531 531 (mm-url-encode-www-form-urlencoded
532 (defun my/sasl-password (nick server) 532 `(("title" . ,post-title)
533 "Fetch a password for $server and $nick" 533 ("gemloguser" . ,user)
534 (my/fetch-password :user nick :host server)) 534 ("pw" . ,pass)
535 (require 'lui-autopaste) 535 ("post" . ,(buffer-string))))))
536 (defun my/circe-prompt () 536 (with-current-buffer
537 (lui-set-prompt 537 (url-retrieve-synchronously "https://gemlog.blue/post.php")
538 (concat (propertize (concat (buffer-name) ">") 538 (goto-char (point-min))
539 'face 'circe-prompt-face) 539 (re-search-forward "\\(gemini://.*\\.gmi\\)")
540 " "))) 540 (elpher-go (match-string 1)))))
541 (defun my/lui-setup () 541
542 (setq right-margin-width 5 542;;;; exwm ~ Emacs X Window Manager
543 fringes-outside-margins t 543(when *acdw/at-larry*
544 word-wrap t 544 (use-package exwm
545 wrap-prefix " ") 545 :if window-system
546 (setf (cdr (assoc 'continuation fringe-indicator-alist)) nil)) 546 :demand
547 :hook 547 :custom
548 (circe-channel-mode-hook . enable-lui-autopaste) 548 (exwm-layout-show-all-buffers t)
549 (circe-chat-mode-hook . my/circe-prompt) 549 (exwm-workspace-warp-cursor t)
550 (lui-mode-hook . my/lui-setup) 550 ;;(mouse-autoselect-window t)
551 :config 551 (exwm-workspace-number 4)
552 (setq circe-default-part-message "Peace out, cub scouts") 552 (exwm-input-global-keys
553 (setq circe-default-quit-message "See You Space Cowpokes ......") 553 `(
554 (setq circe-default-realname "Case D") 554 ([remap split-window-below] . split-and-follow-below)
555 (setq circe-highlight-nick-type 'all) 555 ([remap split-window-right] . split-and-follow-right)
556 (setq circe-reduce-lurker-spam t) 556 ([?\s-r] . exwm-reset)
557 (setq circe-format-say "{nick:-12s} {body}") 557 ([?\s-w] . exwm-workspace-switch)
558 (setq circe-format-self-say "{nick:-11s}> {body}") 558 ([?\s-&] . (lambda (command)
559 (setq lui-time-stamp-position 'right-margin) 559 (interactive (list (read-shell-command "$ ")))
560 (setq lui-fill-type nil) 560 (start-process-shell-command command nil command)))
561 (setq lui-time-stamp-format "%H:%M") 561 ,@(mapcar (lambda (i)
562 (setq lui-track-bar-behavior 'before-switch-to-buffer) 562 `(,(kbd (format "s-%d" i)) .
563 (setq circe-network-options 563 (lambda ()
564 `(("Freenode" 564 (interactive)
565 :tls t 565 (exwm-workspace-switch-create ,i))))
566 :port 6697 566 (number-sequence 0 9))))
567 :nick "acdw" 567 (exwm-input-simulation-keys
568 :sasl-username "acdw" 568 '(([?\C-b] . [left])
569 :sasl-password ,(my/sasl-password "acdw" "irc.freenode.net") 569 ([?\M-b] . [C-left])
570 :channels ("#emacs" "#daydreams")) 570 ([?\C-f] . [right])
571 ("Tilde.chat" 571 ([?\M-f] . [C-right])
572 :tls t 572 ([?\C-p] . [up])
573 :port 6697 573 ([?\C-n] . [down])
574 :nick "acdw" 574 ([?\C-a] . [home])
575 :sasl-username "acdw" 575 ([?\C-e] . [end])
576 :sasl-password ,(my/sasl-password "acdw" "irc.tilde.chat") 576 ([?\M-v] . [prior])
577 :channels ("#gemini" "#meta")))) 577 ([?\C-v] . [next])
578 (enable-lui-track-bar) 578 ([?\C-d] . [delete])
579 :custom-face 579 ([?\C-k] . [S-end delete])
580 (circe-my-message-face ((t (:inherit 'circe-highlight-nick-face :weight normal)))) 580 ([?\C-s] . [?\C-f])
581 (circe-originator-face ((t (:weight bold)))) 581 ([?\C-w] . [?\C-x])
582 (circe-prompt-face ((t (:inherit 'circe-my-message-face))))) 582 ([?\M-w] . [?\C-c])
583 583 ([?\C-y] . [?\C-v])))
584;;; eshell 584 :hook
585 585 ((exwm-update-class-hook .
586(use-package eshell 586 (lambda () "Rename buffer to window's class name"
587 :init 587 (exwm-workspace-rename-buffer exwm-class-name)))
588 (defun eshell/emacs (&rest args) 588 (exwm-update-title-hook .
589 "Open a file in emacs." 589 (lambda () "Update workspace name to window title"
590 (if (null args) 590 (when (not exwm-instance-name)
591 (bury-buffer) 591 (exwm-workspace-rename-buffer exwm-title))))
592 (mapc #'find-file 592 (exwm-init-hook . window-divider-mode)
593 (mapcar #'expand-file-name 593 (exwm-init-hook .
594 (eshell-flatten-list (reverse args)))))) 594 (lambda () "Autostart"
595 (defun eshell/info (&optional subject) 595 (start-process-shell-command "cmst" nil "cmst -m -w 5")
596 "Invoke `info', optionally opening Info to SUBJECT." 596 (start-process-shell-command "keepassxc" nil "keepassxc")
597 (require 'cl) 597 (start-process-shell-command
598 (let ((buf (current-buffer))) 598 "pa-applet" nil
599 (Info-directory) 599 "pa-applet --disable-key-grabbing --disable-notifications")
600 (if (not (null subject)) 600 (start-process-shell-command
601 (let ((node-exists (ignore-errors (Info-menu subject)))) 601 "cbatticon" nil "cbatticon"))))
602 (if (not node-exists) 602 :config
603 (format "No menu item `%s' in node `(dir)Top'." 603 (require 'exwm)
604 subject))))))) 604 (exwm-enable)
605 605 (require 'exwm-systemtray)
606(use-package eshell-syntax-highlighting 606 (exwm-systemtray-enable))
607 :after esh-mode 607
608 :config 608 (use-package exwm-firefox-core
609 (eshell-syntax-highlighting-global-mode 1)) 609 :after exwm
610 610 :straight (exwm-firefox-core
611;;; org-mode 611 :type git
612(use-package org 612 :host github
613 :init 613 :repo "walseb/exwm-firefox-core"))
614 (setq org-startup-indented t) 614
615 (setq org-src-tab-acts-natively t) 615 (use-package exwm-firefox
616 (setq org-hide-emphasis-markers t) 616 :after exwm-firefox-core
617 (setq org-fontify-done-headline t) 617 :straight (exwm-firefox
618 (setq org-hide-leading-stars t) 618 :type git
619 (setq org-pretty-entities t) 619 :host github
620 620 :repo "ieure/exwm-firefox")
621 (font-lock-add-keywords 'org-mode 621 :config
622 '(("^ *\\([-+*]\\) " 622 (exwm-firefox-mode))
623 (0 (prog1 () (compose-region (match-beginning 1) 623
624 (match-end 1) 624 (use-package exwm-mff
625 "•")))))) 625 :straight (exwm-mff
626 :hook 626 :host github
627 (org-mode-hook . (lambda () 627 :repo "ieure/exwm-mff"
628 (variable-pitch-mode 1) 628 :fork (
629 (visual-line-mode) 629 :host github
630 (visual-fill-column-mode)))) 630 :repo "duckwork/exwm-mff"))
631 631 :after exwm
632(use-package org-bullets 632 :hook
633 :hook 633 (exwm-init-hook . exwm-mff-mode))
634 (org-mode-hook . (lambda () (org-bullets-mode 1)))) 634
635 (use-package exwm-edit)
636
637 ) ;; end of *acdw/at-larry* block for exwm
638
639;;;; IRC
640(use-package circe
641 :if *acdw/at-larry*
642 :init
643 (defun my/fetch-password (&rest params)
644 "Fetch a password from auth-sources"
645 (require 'auth-source)
646 (let ((match (car (apply 'auth-source-search params))))
647 (if match
648 (let ((secret (plist-get match :secret)))
649 (if (functionp secret)
650 (funcall secret)
651 secret))
652 (error "Password not found for %S" params))))
653
654 (defun my/sasl-password (nick server)
655 "Fetch a password for $server and $nick"
656 (my/fetch-password :user nick :host server))
657 (require 'lui-autopaste)
658 (defun my/circe-prompt ()
659 (lui-set-prompt
660 (concat (propertize (concat (buffer-name) ">")
661 'face 'circe-prompt-face)
662 " ")))
663 (defun my/lui-setup ()
664 (setq right-margin-width 5
665 fringes-outside-margins t
666 word-wrap t
667 wrap-prefix " ")
668 (setf (cdr (assoc 'continuation fringe-indicator-alist)) nil))
669 :hook
670 (circe-channel-mode-hook . enable-lui-autopaste)
671 (circe-chat-mode-hook . my/circe-prompt)
672 (lui-mode-hook . my/lui-setup)
673 :config
674 (setq circe-default-part-message "Peace out, cub scouts")
675 (setq circe-default-quit-message "See You Space Cowpokes ......")
676 (setq circe-default-realname "Case D")
677 (setq circe-highlight-nick-type 'all)
678 (setq circe-reduce-lurker-spam t)
679 (setq circe-format-say "{nick:-12s} {body}")
680 (setq circe-format-self-say "{nick:-11s}> {body}")
681 (setq lui-time-stamp-position 'right-margin)
682 (setq lui-fill-type nil)
683 (setq lui-time-stamp-format "%H:%M")
684 (setq lui-track-bar-behavior 'before-switch-to-buffer)
685 (setq circe-network-options
686 `(("Freenode"
687 :tls t
688 :port 6697
689 :nick "acdw"
690 :sasl-username "acdw"
691 :sasl-password ,(my/sasl-password "acdw" "irc.freenode.net")
692 :channels ("#emacs" "#daydreams"))
693 ("Tilde.chat"
694 :tls t
695 :port 6697
696 :nick "acdw"
697 :sasl-username "acdw"
698 :sasl-password ,(my/sasl-password "acdw" "irc.tilde.chat")
699 :channels ("#gemini" "#meta"))))
700 (enable-lui-track-bar)
701 :custom-face
702 (circe-my-message-face ((t (:inherit 'circe-highlight-nick-face :weight normal))))
703 (circe-originator-face ((t (:weight bold))))
704 (circe-prompt-face ((t (:inherit 'circe-my-message-face)))))
705
706;;;; eshell
707(use-package eshell
708 :init
709 (defun eshell/emacs (&rest args)
710 "Open a file in emacs."
711 (if (null args)
712 (bury-buffer)
713 (mapc #'find-file
714 (mapcar #'expand-file-name
715 (eshell-flatten-list (reverse args))))))
716 (defun eshell/info (&optional subject)
717 "Invoke `info', optionally opening Info to SUBJECT."
718 (require 'cl)
719 (let ((buf (current-buffer)))
720 (Info-directory)
721 (if (not (null subject))
722 (let ((node-exists (ignore-errors (Info-menu subject))))
723 (if (not node-exists)
724 (format "No menu item `%s' in node `(dir)Top'."
725 subject)))))))
726
727(use-package eshell-syntax-highlighting
728 :after esh-mode
729 :config
730 (eshell-syntax-highlighting-global-mode))
731
732;;;; org-mode
733(use-package org
734 :init
735 (setq org-startup-indented t)
736 (setq org-src-tab-acts-natively t)
737 (setq org-hide-emphasis-markers t)
738 (setq org-fontify-done-headline t)
739 (setq org-hide-leading-stars t)
740 (setq org-pretty-entities t)
741
742 (font-lock-add-keywords 'org-mode
743 '(("^ *\\([-+*]\\) "
744 (0 (prog1 () (compose-region (match-beginning 1)
745 (match-end 1)
746 "•"))))))
747 :hook
748 (org-mode-hook . variable-pitch-mode))
749
750(use-package org-bullets
751 :hook
752 (org-mode-hook . (lambda () (org-bullets-mode))))