about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorCase Duckworth2020-12-01 22:58:43 -0600
committerCase Duckworth2020-12-01 22:58:43 -0600
commit1d553e0b68a1c10236a6f89d7cbedaf3e44bbe9e (patch)
tree410487ad20892cad1eede979cf055e65dea60aeb
parentOnly show tabs when there's > 1 (diff)
downloademacs-1d553e0b68a1c10236a6f89d7cbedaf3e44bbe9e.tar.gz
emacs-1d553e0b68a1c10236a6f89d7cbedaf3e44bbe9e.zip
Update README
-rw-r--r--README.md603
1 files changed, 474 insertions, 129 deletions
diff --git a/README.md b/README.md index 9fdd0a0..6e45992 100644 --- a/README.md +++ b/README.md
@@ -42,14 +42,15 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w
42 42
43## Original init.el 43## Original init.el
44 44
45 ;; This file replaces itself with the actual configuration when 45This file replaces itself with the actual configuration when it's first run. For easy installation, *this* is the `init.el` file in git – and you probably want to keep it that way. To keep git from trying to update `init.el` when it's re-tangled, type this in the repo:
46 ;; first run. To keep only this version in git, run this command: 46
47 ;; 47 git update-index --assume-unchanged init.el
48 ;; git update-index --assume-unchanged init.el 48
49 ;; 49If, for some reason, you want to change this original file to be re-tracked, run this command:
50 ;; If it needs to be changed, start tracking it again thusly: 50
51 ;; 51 git update-index --no-assume-unchanged init.el
52 ;; git update-index --no-assume-unchanged init.el 52
53Otherwise, here's the actual, original `init.el` that tangles this Org file and gets us going.
53 54
54 (require 'org) 55 (require 'org)
55 (find-file (concat user-emacs-directory "config.org")) 56 (find-file (concat user-emacs-directory "config.org"))
@@ -59,8 +60,15 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w
59 (byte-compile-file (concat user-emacs-directory "init.el")) 60 (byte-compile-file (concat user-emacs-directory "init.el"))
60 61
61 62
63### TODO What I should do instead
64
65Honestly, I should just change this "Original init.el" thing to a Makefile I can tangle in `config.org`, and track – since it won't be overwritten or need any special `git` invocations to stop tracking it, I can edit it as I think about what would work best. I could also maybe give it more of a "cross-platform" vibe by installing, say, `straight.el` in the Makefile on Windows. One day …
66
67
62## Tangling 68## Tangling
63 69
70After our first tangle, each time we edit `config.org` we want to go ahead and re-tangle our config. To that end, I've written `acdw/tangle-init`, which automatically tangles `config.org`.
71
64 (defun acdw/tangle-init () 72 (defun acdw/tangle-init ()
65 "If the current buffer is `config.org', tangle it, then compile 73 "If the current buffer is `config.org', tangle it, then compile
66 and load the resulting files." 74 and load the resulting files."
@@ -80,8 +88,12 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w
80 (acdw/load-init) 88 (acdw/load-init)
81 (message "Tangled and loaded: %s" response))))) 89 (message "Tangled and loaded: %s" response)))))
82 90
91Since I want to tangle every time I save `config.org`, I've added `acdw/tangle-init` to a hook.
92
83 (add-hook 'after-save-hook #'acdw/tangle-init) 93 (add-hook 'after-save-hook #'acdw/tangle-init)
84 94
95Finally, I want an easier way to load the generated init files than the old `M-x load-file RET ~/.config/emacs/init.el RET`. So I've written `acdw/load-init` – which also gets called at the end of the async part of `acdw/tangle-init`.
96
85 (defun acdw/load-init () 97 (defun acdw/load-init ()
86 (interactive) 98 (interactive)
87 (load-file (expand-file-name 99 (load-file (expand-file-name
@@ -95,25 +107,35 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w
95 107
96### Add directories to `load-path` 108### Add directories to `load-path`
97 109
110I also put lispy stuff in the `lisp/` subdirectory of my Emacs config, and under my SyncThing directory (for easy syncing ;P).
111
98 (dolist (dir `(,(concat user-emacs-directory 112 (dolist (dir `(,(concat user-emacs-directory
99 (convert-standard-filename "lisp/")) 113 (convert-standard-filename "lisp/"))
100 ,(expand-file-name "~/Sync/elisp/"))) 114 ,(expand-file-name "~/Sync/elisp/")))
101 (add-to-list 'load-path dir)) 115 (add-to-list 'load-path dir))
102 116
103 117
104### Require my secrets 118### TODO Require my secrets
119
120While this is like, the *dumbest* way to do this, it's what I'm doing right now. I'm going to slap a TODO on here because I really should make it better – like, `auth-sources` hooked into KeePassXC somehow… ? Maybe follow [Bill Dietrich's setup](https://www.billdietrich.me/Authentication.html?expandall=1#KeePassXCandSecretService).
105 121
106 (require 'acdw-secrets) 122 (require 'acdw-secrets)
107 123
108 124
109# Early initiation 125# Early initiation
110 126
127Starting with version 27.1, Emacs loads `early-init.el` *before* `init.el`, setting up early stuff like package management, etc. Since I use an alternative package manager, I have to bootstrap it here.
128
129Of course, I also want to set some really early-on settings here too, like `load-prefer-newer` – why not?
130
111 ;; early-init.el -*- lexical-binding: t; no-byte-compile: t -*- 131 ;; early-init.el -*- lexical-binding: t; no-byte-compile: t -*-
112 (setq load-prefer-newer t) 132 (setq load-prefer-newer t)
113 133
114 134
115## Increase the garbage collector 135## Increase the garbage collector
116 136
137Let's try to speed startup times by increasing the garbage collector's threshold while running init. Note the hook afterwards that restores it to a reasonable default.
138
117 (setq gc-cons-threshold (* 100 100 1000)) 139 (setq gc-cons-threshold (* 100 100 1000))
118 140
119 (add-hook 'after-init-hook 141 (add-hook 'after-init-hook
@@ -123,16 +145,28 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w
123 gc-cons-threshold))) 145 gc-cons-threshold)))
124 146
125 147
126## Add more paths to the `exec-path` when using Windows 148## Add more paths to the `exec-path`
149
150When using Windows (at work), I need to use the PortableGit installation I've downloaded, since I don't have Admin privileges.
127 151
128 (when (eq system-type 'windows-nt) 152 (when (eq system-type 'windows-nt)
129 (dolist (path '("~/bin" 153 (dolist (path '("C:/Users/aduckworth/Downloads/PortableGit/bin"
130 "C:/Users/aduckworth/Downloads/PortableGit/bin"
131 "C:/Users/aduckworth/Downloads/PortableGit/usr/bin")) 154 "C:/Users/aduckworth/Downloads/PortableGit/usr/bin"))
132 (add-to-list 'exec-path path))) 155 (add-to-list 'exec-path path)))
133 156
157Elsewhere, I want to add a few more paths to the `exec-path` as well, since I store scripts in a couple of places at ~.
158
159 (dolist (path '("~/bin"
160 "~/.local/bin"
161 "~/Scripts"))
162 (add-to-list 'exec-path path))
163
134 164
135## Bootstrap `straight.el` 165## Bootstrap [straight.el](https://github.com/raxod502/straight.el)
166
167So far, this is the best package manager I've used. It allows for *truly* declarative package management (if I don't specify a package here, it doesn't get loaded), easy installation from pretty much any source (as long as it's got a git repo), *and* it hooks into `use-package`!
168
169The one annoying thing is that this bootstrap code doesn't work on Windows for some reason. I'm too lazy to really try and figure out why, so when I need to bootstrap on Windows (pretty rare, TBH), I just [download the master-branch zip file](https://github.com/raxod502/straight.el/archive/master.zip) and extract it to `~/.emacs.d/straight/repos/`.
136 170
137 (defvar bootstrap-version) 171 (defvar bootstrap-version)
138 (let ((bootstrap-file 172 (let ((bootstrap-file
@@ -149,13 +183,17 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w
149 (load bootstrap-file nil 'nomessage)) 183 (load bootstrap-file nil 'nomessage))
150 184
151 185
152## Use `use-package` 186## Use [use-package](https://jwiegley.github.io/use-package/)
187
188Like I said, `straight.el` hooks into `use-package` easily. These two lines get the latter to use the former by default.
153 189
154 (setq straight-use-package-by-default t) 190 (setq straight-use-package-by-default t)
155 (straight-use-package 'use-package) 191 (straight-use-package 'use-package)
156 192
157 193
158## Keep `~/.emacs.d` tidy 194## Keep `~/.emacs.d` tidy with [no-littering](https://github.com/emacscollective/no-littering)
195
196I'll be honest – I don't really notice this package. But I think that's the point. It keeps Emacs (and packages) from throwing files all over the place, so I have a clean `ls -l`. Since I want to run this code as early as possible, I use the `straight-use-package` form instead of `use-package`.
159 197
160 (straight-use-package 'no-littering) 198 (straight-use-package 'no-littering)
161 (require 'no-littering) 199 (require 'no-littering)
@@ -164,7 +202,21 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w
164## Additional `use-package` keywords 202## Additional `use-package` keywords
165 203
166 204
167### `:custom-update` 205### [:custom-update](https://github.com/a13/use-package-custom-update)
206
207The `:custom-update` keyword lets me do this:
208
209 (use-package package
210 :custom-update
211 (package-list '(1 2 3)))
212
213instead of this:
214
215 (use-package package
216 :config
217 (add-to-list 'package-list '(1 2 3)))
218
219It's not … perfect, but it's kind of nice.
168 220
169 (use-package use-package-custom-update 221 (use-package use-package-custom-update
170 :straight (use-package-custom-update 222 :straight (use-package-custom-update
@@ -172,7 +224,9 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w
172 :repo "a13/use-package-custom-update")) 224 :repo "a13/use-package-custom-update"))
173 225
174 226
175## Setup async 227## Setup [async](https://github.com/jwiegley/emacs-async)
228
229I thought this was included in Emacs at first, but it's not – so we need to install and require it.
176 230
177 (straight-use-package 'async) 231 (straight-use-package 'async)
178 (require 'async) 232 (require 'async)
@@ -183,6 +237,10 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w
183 237
184## Customizing variables 238## Customizing variables
185 239
240I like `use-package` a lot, but I don't like using those shims you see in a lot of other Emacs configs where they use `(use-package emacs)` forms and stuff like that – it just feels dirty. Plus, `straight` gets confused about those packages sometimes. So, since I'm actually *configuring* Emacs in this Org file, which is nicely organized anyway, I can just set settings the old-school way.
241
242Except. Using `setq` is actually *not* recommended any more, because `customize-set-variable` is more expressive and can include side-effects. However, not all settings are customizable, *and* `customize-set-variable` is like, way longer to type. So I've decided to write a little macro (my first!) to copy `use-package`'s `:custom` keyword, except … *outside* `use-package`. I've called it `cuss`, because I have a terrible sense of humor.
243
186 (defmacro cuss (var val) 244 (defmacro cuss (var val)
187 "Basically `use-package''s `:custom', but without using either." 245 "Basically `use-package''s `:custom', but without using either."
188 `(progn 246 `(progn
@@ -190,9 +248,11 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w
190 ',var ,val))) 248 ',var ,val)))
191 249
192 250
193# Theme 251# Theme: [Modus](https://protesilaos.com/modus-themes/)
252
253Protesilaos Stavrou's *excellent* theme pair. At some point I'll probably write my own that's really minimal and does some funky stuff with faces, but until then, these really are the best I've used.
194 254
195I'm using the [Modus](https://protesilaos.com/modus-themes/) themes. 255The big `dolist` form is from [his documentation](https://protesilaos.com/modus-themes/#h:a897b302-8e10-4a26-beab-3caaee1e1193); it basically allows me to configure both themes before loading them. I've tweaked his code a little to use `use-package`.
196 256
197 (defmacro modus-themes-format-sexp (sexp &rest objects) 257 (defmacro modus-themes-format-sexp (sexp &rest objects)
198 `(eval (read (format ,(format "%S" sexp) ,@objects)))) 258 `(eval (read (format ,(format "%S" sexp) ,@objects))))
@@ -200,33 +260,39 @@ I'm using the [Modus](https://protesilaos.com/modus-themes/) themes.
200 (dolist (theme '("operandi" "vivendi")) 260 (dolist (theme '("operandi" "vivendi"))
201 (modus-themes-format-sexp 261 (modus-themes-format-sexp
202 (use-package modus-%1$s-theme 262 (use-package modus-%1$s-theme
203 :init 263 :custom
204 (setq modus-%1$s-theme-slanted-constructs t 264 (modus-%1$s-theme-slanted-constructs t)
205 modus-%1$s-theme-bold-constructs t 265 (modus-%1$s-theme-bold-constructs t)
206 modus-%1$s-theme-fringes 'subtle 266 (modus-%1$s-theme-fringes nil)
207 modus-%1$s-theme-mode-line '3d 267 (modus-%1$s-theme-mode-line '3d)
208 modus-%1$s-theme-syntax 'yellow-comments 268 (modus-%1$s-theme-syntax 'yellow-comments)
209 modus-%1$s-theme-intense-hl-line nil 269 (modus-%1$s-theme-intense-hl-line nil)
210 modus-%1$s-theme-intense-paren-match t 270 (modus-%1$s-theme-intense-paren-match t)
211 modus-%1$s-theme-links nil 271 (modus-%1$s-theme-links nil)
212 modus-%1$s-theme-no-mixed-fonts nil 272 (modus-%1$s-theme-no-mixed-fonts nil)
213 modus-%1$s-theme-prompts nil 273 (modus-%1$s-theme-prompts nil)
214 modus-%1$s-theme-completions nil 274 (modus-%1$s-theme-completions nil)
215 modus-%1$s-theme-diffs nil 275 (modus-%1$s-theme-diffs nil)
216 modus-%1$s-theme-org-blocks 'grayscale 276 (modus-%1$s-theme-org-blocks 'grayscale)
217 modus-%1$s-theme-headings 277 (modus-%1$s-theme-headings
218 '((1 . section) 278 '((1 . section)
219 (2 . line) 279 (2 . line)
220 (t . rainbow-line-no-bold)) 280 (t . rainbow-line)))
221 modus-%1$s-theme-variable-pitch-headings nil 281 (modus-%1$s-theme-variable-pitch-headings t)
222 modus-%1$s-theme-scale-headings t 282 (modus-%1$s-theme-scale-headings t)
223 modus-%1$s-theme-scale-1 1.1 283 (modus-%1$s-theme-scale-1 1.1)
224 modus-%1$s-theme-scale-2 1.15 284 (modus-%1$s-theme-scale-2 1.15)
225 modus-%1$s-theme-scale-3 1.21 285 (modus-%1$s-theme-scale-3 1.21)
226 modus-%1$s-theme-scale-4 1.27 286 (modus-%1$s-theme-scale-4 1.27)
227 modus-%1$s-theme-scale-5 1.33)) 287 (modus-%1$s-theme-scale-5 1.33)
288 :custom-face
289 (font-lock-comment-face
290 ((t (:inherit (custom-comment italic variable-pitch))))))
228 theme)) 291 theme))
229 292
293
294## Theme changer
295
230I also want to switch themes between night and day. 296I also want to switch themes between night and day.
231 297
232 (use-package theme-changer 298 (use-package theme-changer
@@ -240,12 +306,16 @@ I also want to switch themes between night and day.
240# Simplify GUI 306# Simplify GUI
241 307
242 308
309<a id="orga685025"></a>
310
243## Frame defaults 311## Frame defaults
244 312
313I want no toolbar, menubar, or scrollbars (ideally I'd have a vertical scrollbar if necessary, but apparently that's too much to ask the Emacs devs); and fringes and window dividers 2 pixels wide.
314
245 (cuss default-frame-alist 315 (cuss default-frame-alist
246 '((tool-bar-lines . 0) 316 '((tool-bar-lines . 0)
247 (menu-bar-lines . 0) 317 (menu-bar-lines . 0)
248 (vertical-scroll-bars . 'right) 318 (vertical-scroll-bars . nil)
249 (horizontal-scroll-bars . nil) 319 (horizontal-scroll-bars . nil)
250 (right-divider-width . 2) 320 (right-divider-width . 2)
251 (bottom-divider-width . 2) 321 (bottom-divider-width . 2)
@@ -255,6 +325,8 @@ I also want to switch themes between night and day.
255 325
256## Minibuffer window/frame defaults 326## Minibuffer window/frame defaults
257 327
328Of course, on the minibuffer, I want to make sure there's no scrollbar &#x2013; even if I change my mind on `vertical-scroll-bars`, above.
329
258 (cuss minibuffer-frame-alist 330 (cuss minibuffer-frame-alist
259 '((width . 80) 331 '((width . 80)
260 (height . 2) 332 (height . 2)
@@ -265,24 +337,50 @@ I also want to switch themes between night and day.
265 337
266## Remove unneeded GUI elements 338## Remove unneeded GUI elements
267 339
340The [Frame Defaults](#orga685025) section sets up the frame to be free of visual clutter, but *this* section allows us to toggle that clutter's visibility easily, with one call to each of these functions.
341
268 (menu-bar-mode -1) 342 (menu-bar-mode -1)
269 (tool-bar-mode -1) 343 (tool-bar-mode -1)
344 (scroll-bar-mode -1)
270 (horizontal-scroll-bar-mode -1) 345 (horizontal-scroll-bar-mode -1)
271 346
272 347
348## Tabs
349
350I'm kind of getting into Emacs tabs &#x2013; but I like not showing the `tab-bar` when there's only one.
351
352 (cuss tab-bar-show 1)
353
354 (cuss tab-bar-tab-name-function 'tab-bar-tab-name-current-with-count)
355
356 (tab-bar-mode 1)
357
358
273## Word wrap and operate visually 359## Word wrap and operate visually
274 360
361`global-visual-line-mode` is one of those which, in my opinion, should be a default. There's only one place I don't want to wrap words, and that's in `dired`, which I can set individually in its config.
362
275 (global-visual-line-mode 1) 363 (global-visual-line-mode 1)
276 364
277 365
278## Modeline 366## Modeline
279 367
368
369### [smart-mode-line](https://github.com/Malabarba/smart-mode-line)
370
280 (use-package smart-mode-line 371 (use-package smart-mode-line
281 :custom 372 :custom
282 (sml/no-confirm-load-theme t) 373 (sml/no-confirm-load-theme t)
283 :config 374 :config
284 (sml/setup)) 375 (sml/setup))
285 376
377
378### [rich-minority](https://github.com/Malabarba/rich-minority)
379
380`smart-mode-line` comes with `rich-minority` for taking care of minor modes in the modeline, so I'm not going to *also* use `diminish` or anything. However, `rich-minority` has kind of a hinky way of adding modes to the whitelist, so I had to write my own function to do so.
381
382This confuration means that, by default, no minor modes are shown; if you want a minor mode to be shown (like `word-count-mode` for me), call `(rm/whitelist-add "REGEXP")`.
383
286 (defun rm/whitelist-add (regexp) 384 (defun rm/whitelist-add (regexp)
287 "Add a REGEXP to the whitelist for `rich-minority'." 385 "Add a REGEXP to the whitelist for `rich-minority'."
288 (if (listp 'rm--whitelist-regexps) 386 (if (listp 'rm--whitelist-regexps)
@@ -309,6 +407,8 @@ from [Ergo Emacs](http://ergoemacs.org/emacs/emacs_stop_cursor_enter_prompt.html
309 407
310## Show `^L` as a line 408## Show `^L` as a line
311 409
410I like using the form-feed character to separate pages, it turns out. 'Tis nice. This package turns that character into a nice long line.
411
312 (use-package form-feed 412 (use-package form-feed
313 :hook 413 :hook
314 ((text-mode prog-mode) . form-feed-mode)) 414 ((text-mode prog-mode) . form-feed-mode))
@@ -316,11 +416,18 @@ from [Ergo Emacs](http://ergoemacs.org/emacs/emacs_stop_cursor_enter_prompt.html
316 416
317## Cursor 417## Cursor
318 418
419I want my cursor to be a bar in focused windows, but a hollow box in non-focused windows.
420
319 (cuss cursor-type 'bar) 421 (cuss cursor-type 'bar)
320 (cuss cursor-in-non-selected-windows 'hollow) 422 (cuss cursor-in-non-selected-windows 'hollow)
321 423
322 424
323# Fonts 425# Typesetting
426
427
428## Fonts
429
430This is the best way I've come up with to specify a number of different fonts that apply depending on what's applied. To be honest, I didn't really come up with the `font-candidate` function, though &#x2013; I got it from the ["Testing if fonts are available?"](https://www.emacswiki.org/emacs/SetFonts#toc11) section of the SetFonts page on EmacsWiki.
324 431
325See [this StackExchange question and answer](https://emacs.stackexchange.com/questions/12351/when-to-call-find-font-if-launching-emacs-in-daemon-mode) for more information on why I have these font settings applied in a hook. 432See [this StackExchange question and answer](https://emacs.stackexchange.com/questions/12351/when-to-call-find-font-if-launching-emacs-in-daemon-mode) for more information on why I have these font settings applied in a hook.
326 433
@@ -363,7 +470,9 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que
363 (add-hook 'focus-in-hook #'acdw/setup-fonts) 470 (add-hook 'focus-in-hook #'acdw/setup-fonts)
364 471
365 472
366## Unicode 473## [unicode-fonts](https://github.com/rolandwalker/unicode-fonts)
474
475This does something similar to the above code, but for the entirety of the Unicode field (I think).
367 476
368 (use-package unicode-fonts 477 (use-package unicode-fonts
369 :config 478 :config
@@ -372,18 +481,49 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que
372 481
373## Variable pitch faces 482## Variable pitch faces
374 483
484One reason I like the Modus themes so much is that they have *excellent* support for variable-pitch faces, and mixing them with fixed-pitch faces in, say, Org Mode. That means I can enable `variable-pitch-mode` in all my `text-mode`-derived buffers.
485
375 (add-hook 'text-mode-hook #'variable-pitch-mode) 486 (add-hook 'text-mode-hook #'variable-pitch-mode)
376 487
377 488
489## Padding
490
491This has been taken from ["Ricing Org Mode"](https://lepisma.xyz/2017/10/28/ricing-org-mode/) &#x2013; of course, I want the typographic niceties everywhere.
492
493 (cuss line-spacing 0.1)
494
495
378# Ease of use 496# Ease of use
379 497
380 498
381## Selectrum & Prescient 499## Startup
500
501I want a minimal screen when I start Emacs. Based on the beauty of configs like [Nicolas Rougier's](https://github.com/rougier/elegant-emacs) [splash screen](https://github.com/rougier/emacs-splash) [experiments](https://github.com/rougier/nano-emacs), I might try my hand at some kind of splash screen or dashboard &#x2013; but until then, a simple "Hi there!" will suffice 😎
502
503 (cuss inhibit-startup-buffer-menu t)
504 (cuss inhibit-startup-screen t)
505 (cuss initial-buffer-choice t)
506 (cuss initial-scratch-message ";; Hi there!\n")
507
508
509## Completing-read niceties
510
511`completing-read` is Emacs's selection-narrowing-slash-completion framework thing. There's a bunch of packages for it, including `ido`, `icomplete`, `ivy`, and `helm`. I use raxod52's `selectrum` and others, which *extend* without *clobbering* existing Emacs functionality. Plus they seem to run faster, at least on Windows.
512
513
514### [selectrum](https://github.com/raxod502/selectrum)
515
516`selectrum` is the basic *sorting and selecting items from a list* functionality. It's a drop-in replacement for `ido` or the really basic tab-completion Emacs has for, say, `find-file`.
382 517
383 (use-package selectrum 518 (use-package selectrum
384 :config 519 :config
385 (selectrum-mode 1)) 520 (selectrum-mode 1))
386 521
522
523### [prescient](https://github.com/raxod502/prescient.el)
524
525`prescient` helps `selectrum` be more intelligent about sorting the candidates in a list &#x2013; it's in charge of the *filtering and sorting* bit of `completing-read` and friends. It has an algorithm that works well enough for me, though I keep hearing about [orderless](https://github.com/oantolin/orderless), enough to maybe try it as well sometime.
526
387 (use-package prescient 527 (use-package prescient
388 :config 528 :config
389 (prescient-persist-mode 1)) 529 (prescient-persist-mode 1))
@@ -394,7 +534,44 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que
394 (selectrum-prescient-mode 1)) 534 (selectrum-prescient-mode 1))
395 535
396 536
397## CtrlF 537### [consult](https://github.com/minad/cconsult)
538
539`consult` is the newest package I have with this setup, and it kind of brings the `selectrum` experience up to par with `ivy`'s &#x2013; it provides functions that list, say, recently used files *alongside* buffers, allow you to search lines and go to them, etc. It seems pretty nice so far.
540
541By the way, the [Reddit announcement thread for consult](https://www.reddit.com/r/emacs/comments/k3c0u7) has a great comment by the author detailing [the differences between different completing-read implementations](https://www.reddit.com/r/emacs/comments/k3c0u7/consult_counselswiper_alternative_for/ge460z3/) that actually is what convinced me to try `consult`.
542
543 (use-package consult
544 :after (selectrum)
545 :straight (consult
546 :host github
547 :repo "minad/consult")
548 :bind (("C-x b" . consult-buffer)
549 ("C-x 4 b" . consult-buffer-other-window)
550 ("C-x 5 b" . consult-buffer-other-frame)
551 ("M-g o" . consult-outline)
552 ("M-g l" . consult-line)
553 ("M-y" . consult-yank-pop)
554 ("<help> a" . consult-apropos))
555 :init
556 (fset 'multi-occur #'consult-multi-occur)
557 (consult-annotate-mode)
558 :config
559 (setf (alist-get 'execute-extended-command consult-annotate-alist)
560 #'consult-annotate-command-full))
561
562
563### Ignore case
564
565I don't like holding the Shift key if I can help it.
566
567 (cuss completion-ignore-case t)
568 (cuss read-buffer-completion-ignore-case t)
569 (cuss read-file-name-completion-ignore-case t)
570
571
572## [ctrlf](https://github.com/raxod502/ctrlf)
573
574The biggest reason I use this over the default functionality of `C-s` is that `ctrlf-forward-*` wraps the search around by default.
398 575
399 (use-package ctrlf 576 (use-package ctrlf
400 :custom 577 :custom
@@ -408,22 +585,9 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que
408 (ctrlf-mode 1)) 585 (ctrlf-mode 1))
409 586
410 587
411## Startup 588## [which-key](https://github.com/justbur/emacs-which-key)
412 589
413 (cuss inhibit-startup-buffer-menu t) 590This package is really helpful for discovering functionality. When I get more adept in my Emacs-fu, I might remove this.
414 (cuss inhibit-startup-screen t)
415 (cuss initial-buffer-choice t)
416 (cuss initial-scratch-message ";; Hi there!\n")
417
418
419## Ignore case
420
421 (cuss completion-ignore-case t)
422 (cuss read-buffer-completion-ignore-case t)
423 (cuss read-file-name-completion-ignore-case t)
424
425
426## Which key
427 591
428 (use-package which-key 592 (use-package which-key
429 :custom 593 :custom
@@ -434,8 +598,12 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que
434 598
435## Miscellaneous settings 599## Miscellaneous settings
436 600
601Maybe a better title for this section is **Other settings** &#x2013; or maybe I should put them somewhere else entirely.
602
437 603
438### Set view mode when in a read-only file 604### Set `view-mode` when in a read-only file
605
606`view-mode` gives easy-to-use keybindings, like Space for page-down, etc., which are nice to have when you can't edit the file anyway.
439 607
440 (cuss view-read-only t) 608 (cuss view-read-only t)
441 609
@@ -447,22 +615,30 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que
447 615
448### Enable all functions 616### Enable all functions
449 617
618By default, Emacs disables some commands, because NeWbIeS wOuLd GeT cOnFuSeD or some ish. I just want to use the dang editor!
619
450 (cuss disabled-command-function nil) 620 (cuss disabled-command-function nil)
451 621
452 622
453### Shorter confirmations 623### Shorter confirmations
454 624
625Instead of making me type *yes* or *no*, just let me hit the *y* or *n* key.
626
455 (fset 'yes-or-no-p #'y-or-n-p) 627 (fset 'yes-or-no-p #'y-or-n-p)
456 628
457 629
458### Uniquify buffer names 630### Uniquify buffer names
459 631
632This names buffers with the same basename (e.g., `~/.config/emacs/config.org` and `~/.emacs.d/config.org`) in a better way than the default (`config.org<1>`, etc).
633
460 (require 'uniquify) 634 (require 'uniquify)
461 (cuss uniquify-buffer-name-style 'forward) 635 (cuss uniquify-buffer-name-style 'forward)
462 636
463 637
464### Show buffer boundaries 638### Show buffer boundaries
465 639
640These little L-shaped graphics at the top and bottom of buffers don't do anything, but I like 'em.
641
466 (cuss indicate-buffer-boundaries 642 (cuss indicate-buffer-boundaries
467 '((top . right) 643 '((top . right)
468 (bottom . right) 644 (bottom . right)
@@ -471,23 +647,14 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que
471 647
472### Hippie expand 648### Hippie expand
473 649
474 (global-set-key (kbd "M-/") 'hippie-expand) 650At some point, will probably replace with [company](https://company-mode.github.io/).
475
476 651
477### iBuffer 652 (global-set-key (kbd "M-/") 'hippie-expand)
478
479 (global-set-key (kbd "C-x C-b") 'ibuffer)
480
481
482### Zap-up-to-char, not zap-to-char
483
484 (autoload 'zap-up-to-char "misc"
485 "Kill up to, but not including, ARGth occurrence of CHAR." t)
486 653
487 (global-set-key (kbd "M-z") 'zap-up-to-char)
488 654
655### "[better defaults](https://git.sr.ht/~technomancy/better-defaults/tree/master/better-defaults.el)"
489 656
490### Other "[better defaults](https://git.sr.ht/~technomancy/better-defaults/tree/master/better-defaults.el)" 657Most of these come from technomancy's repo, linked above, just copy-pasted into here.
491 658
492 (cuss save-interprogram-paste-before-kill t) 659 (cuss save-interprogram-paste-before-kill t)
493 (cuss apropos-do-all t) 660 (cuss apropos-do-all t)
@@ -496,15 +663,34 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que
496 (cuss visible-bell (not (string= (system-name) "larry"))) 663 (cuss visible-bell (not (string= (system-name) "larry")))
497 (cuss ediff-window-setup-function #'ediff-setup-windows-plain) 664 (cuss ediff-window-setup-function #'ediff-setup-windows-plain)
498 665
6661. Zap-up-to-char, not zap-to-char
667
668 Similarly to `ibuffer`, this is a Better default™.
669
670 (autoload 'zap-up-to-char "misc"
671 "Kill up to, but not including, ARGth occurrence of CHAR." t)
672
673 (global-set-key (kbd "M-z") 'zap-up-to-char)
674
6752. iBuffer
676
677 A Better Default™ for `C-x C-b`. I don't really use this, but everyone says it's worth it, so it's there.
678
679 (global-set-key (kbd "C-x C-b") 'ibuffer)
680
499 681
500### So-long-mode 682### So-long-mode
501 683
684I figure, why not go ahead and make Emacs deal with really long lines better? Can't hurt, right?
685
502 (if (boundp 'global-so-long-mode) 686 (if (boundp 'global-so-long-mode)
503 (global-so-long-mode)) 687 (global-so-long-mode))
504 688
505 689
506### Change `just-one-space` to `cycle-space` 690### Change `just-one-space` to `cycle-space`
507 691
692I keep forgetting to actually *use* this keybind (I think it's `M-SPC`?), but cycling spacing seems *way* more useful than the default `just-one-space` function.
693
508 (defun acdw/cycle-spacing-1 () 694 (defun acdw/cycle-spacing-1 ()
509 (interactive) 695 (interactive)
510 (cycle-spacing -1)) 696 (cycle-spacing -1))
@@ -514,8 +700,12 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que
514 700
515# Persistence 701# Persistence
516 702
703Honestly, persistence across sessions was one of the best things about my well-tuned Vim setup. Here's where I try to repeat that with Emacs.
517 704
518## Auto-saves 705
706## Auto-saves with [super-save](https://github.com/bbatsov/super-save)
707
708The default `auto-save` functionality isn't &#x2026; *enough* for me. I want to *actually* save the files, and I don't care about `#file#` stuff. So &#x2026; I use this package.
519 709
520 (use-package super-save 710 (use-package super-save
521 :custom 711 :custom
@@ -527,6 +717,8 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que
527 717
528## Backup files 718## Backup files
529 719
720To be honest, I probably don't need backup files at all. At some point, I will probably delete this.
721
530 (cuss backup-directory-alist 722 (cuss backup-directory-alist
531 `((".*" . ,(no-littering-expand-var-file-name "backup/")))) 723 `((".*" . ,(no-littering-expand-var-file-name "backup/"))))
532 724
@@ -538,20 +730,26 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que
538 730
539## Recent files 731## Recent files
540 732
541 (use-package recentf 733Since I apparently *only* edit my `config.org`, this is also probably not necessary &#x2013; I'd be better off just adding a `(find-file (concat (user-emacs-directory "config.org")))` at the end 😎
542 :custom-update 734
543 (recentf-exclude 735But until then, it's really nice to have a `recentf` list.
544 '(no-littering-var-directory 736
545 no-littering-etc-directory)) 737 (require 'recentf)
546 :custom 738
547 (recentf-max-menu-items 100) 739 (add-to-list 'recentf-exclude
548 (recentf-max-saved-items 100) 740 '(no-littering-var-directory
549 :config 741 no-littering-etc-directory))
550 (recentf-mode 1)) 742
743 (cuss recentf-max-menu-items 100)
744 (cuss recentf-max-saved-items 100)
745
746 (recentf-mode 1)
551 747
552 748
553### Easily navigate recent files 749### Easily navigate recent files
554 750
751Now I'm going through this, I might not need this function any more. I'll have to see how `consult` goes.
752
555 (defun recentf-find-file () 753 (defun recentf-find-file ()
556 "Find a recent file using `completing-read'." 754 "Find a recent file using `completing-read'."
557 (interactive) 755 (interactive)
@@ -564,31 +762,39 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que
564 762
565## Save places in visited files 763## Save places in visited files
566 764
567 (use-package saveplace 765 (require 'saveplace)
568 :custom 766
569 (save-place-file (no-littering-expand-var-file-name "places")) 767 (cuss save-place-file (no-littering-expand-var-file-name "places"))
570 (save-place-forget-unreadable-files (not 768
571 (eq system-type 'windows-nt)) 769 (cuss save-place-forget-unreadable-files
572 :config 770 (not (eq system-type 'windows-nt)))
573 (save-place-mode 1))) 771
772 (save-place-mode 1)
574 773
575 774
576## Save history 775## Save history
577 776
578 (use-package savehist 777 (require 'savehist)
579 :custom 778
580 (savehist-additional-variables 779 (cuss savehist-additional-variables
581 '(kill-ring 780 '(kill-ring
582 search-ring 781 search-ring
583 regexp-search-ring)) 782 regexp-search-ring))
584 (savehist-save-minibuffer-history t)
585 (history-length t)
586 (history-delete-duplicates t)
587 :config
588 (savehist-mode 1))
589 783
784 (cuss savehist-save-minibuffer-history t)
590 785
591## Undo 786 (cuss history-length t)
787
788 (cuss history-delete-duplicates t)
789
790 (savehist-mode 1)
791
792
793## Undo: [undo-fu-session](https://gitlab.com/ideasman42/emacs-undo-fu-session)
794
795The other Killer Feature of Neovim when I used it was the perisistent undo. I *think* this works the same. Honestly, undo is giving me a little grief recently; I need to look into it.
796
797Note to self: if I *do* switch away from `undo-fu`, look at [undohist](https://github.com/emacsorphanage/undohist).
592 798
593 (use-package undo-fu-session 799 (use-package undo-fu-session
594 :after (no-littering undo-fu) 800 :after (no-littering undo-fu)
@@ -607,6 +813,8 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que
607 813
608## File encoding 814## File encoding
609 815
816I just want to use UTF-8 everywhere, and end all files with UNIX line endings (`^J`, or `LF`). Hell, even Windows Notepad correctly reads UNIX files nowadays (though of course you can't configure it to *save* the files in UNIX-mode). However, since Emacs is ~40 years old, it has a billion different ways to set encodings. This is my best attempt at setting everything up how I want it.
817
610I'm going to be honest &#x2013; most of this is a stab in the dark. 818I'm going to be honest &#x2013; most of this is a stab in the dark.
611 819
612 (set-language-environment 'utf-8) 820 (set-language-environment 'utf-8)
@@ -627,7 +835,9 @@ I'm going to be honest &#x2013; most of this is a stab in the dark.
627 (add-hook 'find-file-hooks #'acdw/no-junk-please-were-unixish) 835 (add-hook 'find-file-hooks #'acdw/no-junk-please-were-unixish)
628 836
629 837
630## Undo 838## [undo-fu](https://gitlab.com/ideasman42/emacs-undo-fu)
839
840I've heard that Emacs' undo is weird, so here I am, trying to make it &#x2026;. *less* weird. I keep forgetting I've installed this though, so I might uninstall it at some point.
631 841
632 (use-package undo-fu 842 (use-package undo-fu
633 :bind 843 :bind
@@ -635,7 +845,9 @@ I'm going to be honest &#x2013; most of this is a stab in the dark.
635 ("C-?" . undo-fu-only-redo)) 845 ("C-?" . undo-fu-only-redo))
636 846
637 847
638## Find/replace 848## Find/replace: [visual-regexp](https://github.com/benma/visual-regexp.el)
849
850Another replacement for a Killer Feature in Neovim &#x2013; the ease of regexp find/replace was so wonderful, because I could easily see *what* I'd be changing with a `%s` command, as well as *how* it'd change. This works&#x2026; pretty similarly. It could be a little better.
639 851
640 (use-package visual-regexp 852 (use-package visual-regexp
641 :bind 853 :bind
@@ -646,14 +858,20 @@ I'm going to be honest &#x2013; most of this is a stab in the dark.
646## Visual editing 858## Visual editing
647 859
648 860
649### Volatile highlights 861### [volatile-highlights](https://github.com/k-talo/volatile-highlights.el)
862
863Highlights text changed by certain operations.
650 864
651 (use-package volatile-highlights 865 (use-package volatile-highlights
652 :config 866 :config
653 (volatile-highlights-mode 1)) 867 (volatile-highlights-mode 1))
654 868
655 869
656### Expand region 870### [expand-region](https://github.com/magnars/expand-region.el)
871
872I don't use this a *ton*, but not because it's not useful &#x2013; I just forget it's there sometimes.
873
874Basically, it allows you to do like a Kakoune-style incremental widening of the selection by semantic units.
657 875
658 (use-package expand-region 876 (use-package expand-region
659 :bind 877 :bind
@@ -663,19 +881,25 @@ I'm going to be honest &#x2013; most of this is a stab in the dark.
663 881
664## Clean up white space on save 882## Clean up white space on save
665 883
884I'm not sure if I'll *keep* this forever, because in combination with `super-save` I lose the final "thinking spaces" when I shift contexts to another window.
885
666 (add-hook 'before-save-hook #'whitespace-cleanup) 886 (add-hook 'before-save-hook #'whitespace-cleanup)
667 (add-hook 'before-save-hook #'delete-trailing-whitespace) 887 (add-hook 'before-save-hook #'delete-trailing-whitespace)
668 888
669 889
670## Automatically revert a file to what it is on disk 890## Automatically revert a file to what it is on disk
671 891
892Revert a buffer to reflect what's on disk if it's changed outside of Emacs.
893
672 (global-auto-revert-mode 1) 894 (global-auto-revert-mode 1)
673 895
674 896
675# Writing 897# Writing
676 898
899Configurations related to writing prose or verse.
900
677 901
678## Word count 902## Word count: [wc-mode](https://github.com/bnbeckwith/wc-mode)
679 903
680 (use-package wc-mode 904 (use-package wc-mode
681 :config 905 :config
@@ -683,7 +907,9 @@ I'm going to be honest &#x2013; most of this is a stab in the dark.
683 :hook text-mode) 907 :hook text-mode)
684 908
685 909
686## Visual fill column mode 910## [visual-fill-column-mode](https://github.com/joostkremers/visual-fill-column)
911
912Center the text part of the frame within a `fill-column`-sized area in the frame as a whole.
687 913
688 (use-package visual-fill-column 914 (use-package visual-fill-column
689 :custom 915 :custom
@@ -698,7 +924,22 @@ I'm going to be honest &#x2013; most of this is a stab in the dark.
698 (text-mode . visual-fill-column-mode)) 924 (text-mode . visual-fill-column-mode))
699 925
700 926
701## Org mode 927### Fix mouse bindings
928
929In `visual-fill-column-mode`, mouse bindings on the margins don't work. In fact, they don't work when *not* in `visual-fill-column-mode`. Let's bind those bindings.
930
931 (bind-key [left-margin wheel-down] 'scroll-down-command)
932 (bind-key [right-margin wheel-down] 'scroll-down-command)
933
934 (bind-key [left-margin wheel-up] 'scroll-up-command)
935 (bind-key [right-margin wheel-up] 'scroll-up-command)
936
937
938## [org-mode](https://orgmode.org/)
939
940Pretty self-explanatory, I think&#x2026;
941
942I need to break this config up and like, comment it better.
702 943
703 (use-package org 944 (use-package org
704 :custom 945 :custom
@@ -707,10 +948,25 @@ I'm going to be honest &#x2013; most of this is a stab in the dark.
707 (org-hide-emphasis-markers t) 948 (org-hide-emphasis-markers t)
708 (org-fontify-done-headline t) 949 (org-fontify-done-headline t)
709 (org-fontify-whole-heading-line t) 950 (org-fontify-whole-heading-line t)
951 (org-fontify-quote-and-verse-blocks t)
710 (org-hide-leading-stars t) 952 (org-hide-leading-stars t)
711 (org-hidden-keywords '(author date title)) 953 (org-hidden-keywords '(author date title))
712 (org-src-window-setup 'current-window) 954 (org-src-window-setup 'current-window)
713 (org-pretty-entities t)) 955 (org-pretty-entities t)
956 (org-ellipsis " ⋯ "))
957
958
959### Make bullets look like centered dots
960
961from [zzamboni.org](https://zzamboni.org/post/beautifying-org-mode-in-emacs/)
962
963 (font-lock-add-keywords
964 'org-mode
965 '(("^ *\\([-+]\\) "
966 (0 (prog1 ()
967 (compose-region (match-beginning 1)
968 (match-end 1)
969 "•"))))))
714 970
715 971
716### Enable markdown export 972### Enable markdown export
@@ -869,18 +1125,26 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim)
869 1125
870# Coding 1126# Coding
871 1127
1128The Other Thing Emacs is Good For.
1129
872 1130
873## Formatting 1131## Formatting
874 1132
875 1133
876### Indenting 1134### Indenting: [aggressive-indent-mode](https://github.com/Malabarba/aggressive-indent-mode)
1135
1136This automagically indents code on every change, as opposed to `electric-indent-mode`, which only does when I like, hit `RET` or whatever. As such, I can turn `electric-indent-mode` off.
877 1137
878 (use-package aggressive-indent 1138 (use-package aggressive-indent
1139 :init
1140 (electric-indent-mode -1)
879 :config 1141 :config
880 (global-aggressive-indent-mode 1)) 1142 (global-aggressive-indent-mode 1))
881 1143
882 1144
883### Smart tabs 1145### [Smart tabs](https://github.com/jcsalomon/smarttabs)
1146
1147I really want to like, use tabs all the time. But I thought the `smart-tabs` package author made some good points about using tabs for semantic indentation, and spaces for the rest. So.
884 1148
885 (use-package smart-tabs-mode 1149 (use-package smart-tabs-mode
886 :custom 1150 :custom
@@ -897,6 +1161,8 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim)
897 1161
898### Prettify symbols mode 1162### Prettify symbols mode
899 1163
1164By default, I think `prettify-symbols-mode` only changes `lambda` to `λ`. I should, at some point, add some prettified symbols.
1165
900 (add-hook 'prog-mode-hook #'prettify-symbols-mode) 1166 (add-hook 'prog-mode-hook #'prettify-symbols-mode)
901 1167
902 1168
@@ -904,10 +1170,14 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim)
904 1170
9051. `show-paren-style` 11711. `show-paren-style`
906 1172
1173 A `mixed` `show-paren-style` means that, when both parentheses are visible, it just highlights them. If one is *not*, though, it highlights the entire block.
1174
907 (cuss show-paren-style 'mixed) 1175 (cuss show-paren-style 'mixed)
908 (show-paren-mode 1) 1176 (show-paren-mode 1)
909 1177
9102. Smartparens 11782. [smartparens](https://github.com/Fuco1/smartparens)
1179
1180 Automagically close pairs and stuff. See also [ParEdit](https://www.emacswiki.org/emacs/ParEdit) &#x2013; maybe test that one?
911 1181
912 (use-package smartparens 1182 (use-package smartparens
913 :init 1183 :init
@@ -917,13 +1187,17 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim)
917 :hook 1187 :hook
918 (prog-mode . acdw/setup-smartparens)) 1188 (prog-mode . acdw/setup-smartparens))
919 1189
9203. Rainbow delimiters 11903. [rainbow-delimiters](https://github.com/Fanael/rainbow-delimiters)
1191
1192 Show different pairs of delimiters in diffferent colors. Pretty! Useful!
921 1193
922 (use-package rainbow-delimiters 1194 (use-package rainbow-delimiters
923 :hook (prog-mode . rainbow-delimiters-mode)) 1195 :hook (prog-mode . rainbow-delimiters-mode))
924 1196
925 1197
926### Rainbow mode 1198### [rainbow-mode](https://elpa.gnu.org/packages/rainbow-mode.html)
1199
1200Show different colors *in that color*. Useful! Pretty!
927 1201
928 (use-package rainbow-mode 1202 (use-package rainbow-mode
929 :custom 1203 :custom
@@ -933,6 +1207,8 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim)
933 1207
934### Line numbers 1208### Line numbers
935 1209
1210I only want line numbers in `prog-mode`-derived modes. In addition, apparently `linum-mode` works better in TUI, but is slower that `display-line-numbers`. So I want to do some logic to see what to use.
1211
936 (defun acdw/enable-line-numbers () 1212 (defun acdw/enable-line-numbers ()
937 "Enable line numbers, either through `display-line-numbers-mode' 1213 "Enable line numbers, either through `display-line-numbers-mode'
938 or through `linum-mode'." 1214 or through `linum-mode'."
@@ -948,6 +1224,8 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim)
948 1224
949## Programming languages 1225## Programming languages
950 1226
1227These are the programming languages I (don't really) use.
1228
951 1229
952### Fish shell 1230### Fish shell
953 1231
@@ -1001,14 +1279,25 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim)
1001 1279
1002# Applications 1280# Applications
1003 1281
1282Of course, the real reason we love emacs is for the application layer. What is it they say?
1283
1284> Emacs is a great operating system, lacking only a decent editor.
1285
1286Yeah, that's it 😎
1287
1004 1288
1005## Git 1289## Git: [magit](https://magit.vc/)
1290
1291The magical porcelain.
1006 1292
1007 (use-package magit 1293 (use-package magit
1008 :bind 1294 :bind
1009 ("C-x g" . magit-status) 1295 ("C-x g" . magit-status)
1010 :custom-update 1296 :custom-update
1011 (magit-no-confirm '(stage-all-changes))) 1297 (magit-no-confirm '(stage-all-changes))
1298 :config
1299 (add-hook 'magit-process-find-password-functions
1300 #'magit-process-password-auth-source))
1012 1301
1013 1302
1014### Hook into `prescient` 1303### Hook into `prescient`
@@ -1044,6 +1333,8 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim)
1044 1333
1045## Dired 1334## Dired
1046 1335
1336I'm still figuring out what all I can do with `dired`.
1337
1047 (with-eval-after-load 'dired 1338 (with-eval-after-load 'dired
1048 (cuss dired-dwim-target t) 1339 (cuss dired-dwim-target t)
1049 (cuss dired-listing-switches "-alDh") 1340 (cuss dired-listing-switches "-alDh")
@@ -1052,8 +1343,20 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim)
1052 (bind-key "C-c w" #'wdired-change-to-wdired-mode 'dired-mode-map)) 1343 (bind-key "C-c w" #'wdired-change-to-wdired-mode 'dired-mode-map))
1053 1344
1054 1345
1346### dired-subtree
1347
1348Part of the [dired-hacks](https://github.com/Fuco1/dired-hacks) package.
1349
1350 (use-package dired-subtree
1351 :bind (:map dired-mode-map
1352 (("i" . dired-subtree-insert)
1353 (";" . dired-subtree-remove))))
1354
1355
1055## Proced 1356## Proced
1056 1357
1358The process editor.
1359
1057 (defun acdw/setup-proced () 1360 (defun acdw/setup-proced ()
1058 (variable-pitch-mode -1) 1361 (variable-pitch-mode -1)
1059 (toggle-truncate-lines 1) 1362 (toggle-truncate-lines 1)
@@ -1062,7 +1365,14 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim)
1062 (add-hook 'proced-mode-hook #'acdw/setup-proced) 1365 (add-hook 'proced-mode-hook #'acdw/setup-proced)
1063 1366
1064 1367
1065## Elpher 1368## Gemini (and gopher)
1369
1370
1371### [elpher](https://thelambdalab.xyz/elpher/)
1372
1373Actually, `elpher` is the reason I started using Emacs. So thanks, smol web denizens!
1374
1375Fun fact: these packages are *also* why I use `straight.el`, since they're none of them on GitHub.
1066 1376
1067 (use-package elpher 1377 (use-package elpher
1068 :straight (elpher 1378 :straight (elpher
@@ -1094,6 +1404,11 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim)
1094 :hook 1404 :hook
1095 (elpher-mode . visual-fill-column-mode)) 1405 (elpher-mode . visual-fill-column-mode))
1096 1406
1407
1408### [gemini-mode](https://git.carcosa.net/jmcbray/gemini.el)
1409
1410A major mode for `text/gemini` files. I've changed the headings to match Elpher's.
1411
1097 (use-package gemini-mode 1412 (use-package gemini-mode
1098 :straight (gemini-mode 1413 :straight (gemini-mode
1099 :repo "https://git.carcosa.net/jmcbray/gemini.el.git") 1414 :repo "https://git.carcosa.net/jmcbray/gemini.el.git")
@@ -1105,29 +1420,48 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim)
1105 ((t (:inherit (elpher-gemini-heading2))))) 1420 ((t (:inherit (elpher-gemini-heading2)))))
1106 (gemini-heading-face3 1421 (gemini-heading-face3
1107 ((t (:inherit (elpher-gemini-heading3))))) 1422 ((t (:inherit (elpher-gemini-heading3)))))
1423 :init
1424 (defun acdw/setup-gemini-mode ()
1425 (visual-fill-column-mode 1)
1426 (variable-pitch-mode -1))
1108 :hook 1427 :hook
1109 (gemini-mode . visual-fill-column-mode)) 1428 (gemini-mode . acdw/setup-gemini-mode))
1429
1430
1431### [gemini-write](https://alexschroeder.ch/cgit/gemini-write/about/)
1432
1433Alex Schroeder's Emacs implementation of the Titan protocol. This is why I use his Gemini server, [Phoebe](https://alexschroeder.ch/cgit/phoebe/)!
1110 1434
1111 (use-package gemini-write 1435 (use-package gemini-write
1112 :straight (gemini-write 1436 :straight (gemini-write
1113 :repo "https://alexschroeder.ch/cgit/gemini-write") 1437 :repo "https://alexschroeder.ch/cgit/gemini-write")
1114 :config 1438 :config
1115 (add-to-list 'elpher-gemini-tokens 1439 (when (boundp 'acdw-secrets/elpher-gemini-tokens)
1116 (acdw-secrets/elpher-gemini-tokens))) 1440 (add-to-list 'elpher-gemini-tokens
1441 acdw-secrets/elpher-gemini-tokens)))
1442
1443
1444### [post-to-gemlog-blue](https://git.sr.ht/~acdw/post-to-gemlog-blue.el)
1445
1446My first (!) Emacs package, to allow posting to [gemlog.blue's web interface](https://gemlog.blue). I don't use gemlog.blue any more, but if I didn't have this package, no one would 😎
1117 1447
1118 (use-package post-to-gemlog-blue 1448 (use-package post-to-gemlog-blue
1119 :straight (post-to-gemlog-blue 1449 :straight (post-to-gemlog-blue
1120 :repo "https://git.sr.ht/~acdw/post-to-gemlog-blue.el")) 1450 :repo "https://git.sr.ht/~acdw/post-to-gemlog-blue.el"))
1121 1451
1122 1452
1123## Pastebin (0x0) 1453## Pastebin: [0x0](https://git.sr.ht/~zge/nullpointer-emacs)
1454
1455Pastebins are so useful. Now I can use them from Emacs.
1124 1456
1125 (use-package 0x0 1457 (use-package 0x0
1126 :custom 1458 :custom
1127 (0x0-default-service 'ttm)) 1459 (0x0-default-service 'ttm))
1128 1460
1129 1461
1130## Mu4e 1462## [mu4e](https://www.djcbsoftware.nl/code/mu/mu4e.html)
1463
1464I've just recently started (again) using mu4e. We'll see how it goes.
1131 1465
1132 (when (executable-find "mu") 1466 (when (executable-find "mu")
1133 (add-to-list 'load-path 1467 (add-to-list 'load-path
@@ -1213,3 +1547,14 @@ if ! emacsclient -nc "$@" 2>/dev/null; then
1213 emacs --daemon 1547 emacs --daemon
1214 emacsclient -nc "$@" 1548 emacsclient -nc "$@"
1215 fi 1549 fi
1550
1551
1552# Appendix B: areas for further research
1553
1554- [ebuku](https://github.com/flexibeast/ebuku) (of course, I'd need [buku](https://github.com/jarun/buku) as well) &#x2013; bookmarks
1555- [KeePassXC as Secret Service](https://www.billdietrich.me/Authentication.html?expandall=1#KeePassXCandSecretService)
1556- [Ignoramus](https://github.com/rolandwalker/ignoramus) &#x2013; this might not e necessary
1557- [Dynamic fonts](https://github.com/rolandwalker/dynamic-fonts) &#x2013; take a look @ this and compare with my fonts section
1558- [Simple clipboard integration](https://github.com/rolandwalker/simpleclip) &#x2013; test with Windows, maybe
1559- [visible mark](https://git.sr.ht/~iank/visible-mark) &#x2013; show where the marks are &#x2026;
1560- consider this Reddit thread: [speeding up magit](https://www.reddit.com/r/emacs/comments/k3xfa1/speeding_up_magit/)