From 1d553e0b68a1c10236a6f89d7cbedaf3e44bbe9e Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Tue, 1 Dec 2020 22:58:43 -0600 Subject: Update README --- README.md | 603 ++++++++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 474 insertions(+), 129 deletions(-) (limited to 'README.md') 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 ## Original init.el - ;; This file replaces itself with the actual configuration when - ;; first run. To keep only this version in git, run this command: - ;; - ;; git update-index --assume-unchanged init.el - ;; - ;; If it needs to be changed, start tracking it again thusly: - ;; - ;; git update-index --no-assume-unchanged init.el +This 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: + + git update-index --assume-unchanged init.el + +If, for some reason, you want to change this original file to be re-tracked, run this command: + + git update-index --no-assume-unchanged init.el + +Otherwise, here's the actual, original `init.el` that tangles this Org file and gets us going. (require 'org) (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 (byte-compile-file (concat user-emacs-directory "init.el")) +### TODO What I should do instead + +Honestly, 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 … + + ## Tangling +After 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`. + (defun acdw/tangle-init () "If the current buffer is `config.org', tangle it, then compile and load the resulting files." @@ -80,8 +88,12 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w (acdw/load-init) (message "Tangled and loaded: %s" response))))) +Since I want to tangle every time I save `config.org`, I've added `acdw/tangle-init` to a hook. + (add-hook 'after-save-hook #'acdw/tangle-init) +Finally, 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`. + (defun acdw/load-init () (interactive) (load-file (expand-file-name @@ -95,25 +107,35 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w ### Add directories to `load-path` +I also put lispy stuff in the `lisp/` subdirectory of my Emacs config, and under my SyncThing directory (for easy syncing ;P). + (dolist (dir `(,(concat user-emacs-directory (convert-standard-filename "lisp/")) ,(expand-file-name "~/Sync/elisp/"))) (add-to-list 'load-path dir)) -### Require my secrets +### TODO Require my secrets + +While 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). (require 'acdw-secrets) # Early initiation +Starting 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. + +Of course, I also want to set some really early-on settings here too, like `load-prefer-newer` – why not? + ;; early-init.el -*- lexical-binding: t; no-byte-compile: t -*- (setq load-prefer-newer t) ## Increase the garbage collector +Let'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. + (setq gc-cons-threshold (* 100 100 1000)) (add-hook 'after-init-hook @@ -123,16 +145,28 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w gc-cons-threshold))) -## Add more paths to the `exec-path` when using Windows +## Add more paths to the `exec-path` + +When using Windows (at work), I need to use the PortableGit installation I've downloaded, since I don't have Admin privileges. (when (eq system-type 'windows-nt) - (dolist (path '("~/bin" - "C:/Users/aduckworth/Downloads/PortableGit/bin" + (dolist (path '("C:/Users/aduckworth/Downloads/PortableGit/bin" "C:/Users/aduckworth/Downloads/PortableGit/usr/bin")) (add-to-list 'exec-path path))) +Elsewhere, I want to add a few more paths to the `exec-path` as well, since I store scripts in a couple of places at ~. + + (dolist (path '("~/bin" + "~/.local/bin" + "~/Scripts")) + (add-to-list 'exec-path path)) + -## Bootstrap `straight.el` +## Bootstrap [straight.el](https://github.com/raxod502/straight.el) + +So 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`! + +The 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/`. (defvar bootstrap-version) (let ((bootstrap-file @@ -149,13 +183,17 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w (load bootstrap-file nil 'nomessage)) -## Use `use-package` +## Use [use-package](https://jwiegley.github.io/use-package/) + +Like I said, `straight.el` hooks into `use-package` easily. These two lines get the latter to use the former by default. (setq straight-use-package-by-default t) (straight-use-package 'use-package) -## Keep `~/.emacs.d` tidy +## Keep `~/.emacs.d` tidy with [no-littering](https://github.com/emacscollective/no-littering) + +I'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`. (straight-use-package 'no-littering) (require 'no-littering) @@ -164,7 +202,21 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w ## Additional `use-package` keywords -### `:custom-update` +### [:custom-update](https://github.com/a13/use-package-custom-update) + +The `:custom-update` keyword lets me do this: + + (use-package package + :custom-update + (package-list '(1 2 3))) + +instead of this: + + (use-package package + :config + (add-to-list 'package-list '(1 2 3))) + +It's not … perfect, but it's kind of nice. (use-package use-package-custom-update :straight (use-package-custom-update @@ -172,7 +224,9 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w :repo "a13/use-package-custom-update")) -## Setup async +## Setup [async](https://github.com/jwiegley/emacs-async) + +I thought this was included in Emacs at first, but it's not – so we need to install and require it. (straight-use-package 'async) (require 'async) @@ -183,6 +237,10 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w ## Customizing variables +I 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. + +Except. 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. + (defmacro cuss (var val) "Basically `use-package''s `:custom', but without using either." `(progn @@ -190,9 +248,11 @@ It's highly likely that the WTFPL is completely incompatible with the GPL, for w ',var ,val))) -# Theme +# Theme: [Modus](https://protesilaos.com/modus-themes/) + +Protesilaos 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. -I'm using the [Modus](https://protesilaos.com/modus-themes/) themes. +The 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`. (defmacro modus-themes-format-sexp (sexp &rest objects) `(eval (read (format ,(format "%S" sexp) ,@objects)))) @@ -200,33 +260,39 @@ I'm using the [Modus](https://protesilaos.com/modus-themes/) themes. (dolist (theme '("operandi" "vivendi")) (modus-themes-format-sexp (use-package modus-%1$s-theme - :init - (setq modus-%1$s-theme-slanted-constructs t - modus-%1$s-theme-bold-constructs t - modus-%1$s-theme-fringes 'subtle - modus-%1$s-theme-mode-line '3d - modus-%1$s-theme-syntax 'yellow-comments - modus-%1$s-theme-intense-hl-line nil - modus-%1$s-theme-intense-paren-match t - modus-%1$s-theme-links nil - modus-%1$s-theme-no-mixed-fonts nil - modus-%1$s-theme-prompts nil - modus-%1$s-theme-completions nil - modus-%1$s-theme-diffs nil - modus-%1$s-theme-org-blocks 'grayscale - modus-%1$s-theme-headings - '((1 . section) - (2 . line) - (t . rainbow-line-no-bold)) - modus-%1$s-theme-variable-pitch-headings nil - modus-%1$s-theme-scale-headings t - modus-%1$s-theme-scale-1 1.1 - modus-%1$s-theme-scale-2 1.15 - modus-%1$s-theme-scale-3 1.21 - modus-%1$s-theme-scale-4 1.27 - modus-%1$s-theme-scale-5 1.33)) + :custom + (modus-%1$s-theme-slanted-constructs t) + (modus-%1$s-theme-bold-constructs t) + (modus-%1$s-theme-fringes nil) + (modus-%1$s-theme-mode-line '3d) + (modus-%1$s-theme-syntax 'yellow-comments) + (modus-%1$s-theme-intense-hl-line nil) + (modus-%1$s-theme-intense-paren-match t) + (modus-%1$s-theme-links nil) + (modus-%1$s-theme-no-mixed-fonts nil) + (modus-%1$s-theme-prompts nil) + (modus-%1$s-theme-completions nil) + (modus-%1$s-theme-diffs nil) + (modus-%1$s-theme-org-blocks 'grayscale) + (modus-%1$s-theme-headings + '((1 . section) + (2 . line) + (t . rainbow-line))) + (modus-%1$s-theme-variable-pitch-headings t) + (modus-%1$s-theme-scale-headings t) + (modus-%1$s-theme-scale-1 1.1) + (modus-%1$s-theme-scale-2 1.15) + (modus-%1$s-theme-scale-3 1.21) + (modus-%1$s-theme-scale-4 1.27) + (modus-%1$s-theme-scale-5 1.33) + :custom-face + (font-lock-comment-face + ((t (:inherit (custom-comment italic variable-pitch)))))) theme)) + +## Theme changer + I also want to switch themes between night and day. (use-package theme-changer @@ -240,12 +306,16 @@ I also want to switch themes between night and day. # Simplify GUI + + ## Frame defaults +I 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. + (cuss default-frame-alist '((tool-bar-lines . 0) (menu-bar-lines . 0) - (vertical-scroll-bars . 'right) + (vertical-scroll-bars . nil) (horizontal-scroll-bars . nil) (right-divider-width . 2) (bottom-divider-width . 2) @@ -255,6 +325,8 @@ I also want to switch themes between night and day. ## Minibuffer window/frame defaults +Of course, on the minibuffer, I want to make sure there's no scrollbar – even if I change my mind on `vertical-scroll-bars`, above. + (cuss minibuffer-frame-alist '((width . 80) (height . 2) @@ -265,24 +337,50 @@ I also want to switch themes between night and day. ## Remove unneeded GUI elements +The [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. + (menu-bar-mode -1) (tool-bar-mode -1) + (scroll-bar-mode -1) (horizontal-scroll-bar-mode -1) +## Tabs + +I'm kind of getting into Emacs tabs – but I like not showing the `tab-bar` when there's only one. + + (cuss tab-bar-show 1) + + (cuss tab-bar-tab-name-function 'tab-bar-tab-name-current-with-count) + + (tab-bar-mode 1) + + ## Word wrap and operate visually +`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. + (global-visual-line-mode 1) ## Modeline + +### [smart-mode-line](https://github.com/Malabarba/smart-mode-line) + (use-package smart-mode-line :custom (sml/no-confirm-load-theme t) :config (sml/setup)) + +### [rich-minority](https://github.com/Malabarba/rich-minority) + +`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. + +This 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")`. + (defun rm/whitelist-add (regexp) "Add a REGEXP to the whitelist for `rich-minority'." (if (listp 'rm--whitelist-regexps) @@ -309,6 +407,8 @@ from [Ergo Emacs](http://ergoemacs.org/emacs/emacs_stop_cursor_enter_prompt.html ## Show `^L` as a line +I like using the form-feed character to separate pages, it turns out. 'Tis nice. This package turns that character into a nice long line. + (use-package form-feed :hook ((text-mode prog-mode) . form-feed-mode)) @@ -316,11 +416,18 @@ from [Ergo Emacs](http://ergoemacs.org/emacs/emacs_stop_cursor_enter_prompt.html ## Cursor +I want my cursor to be a bar in focused windows, but a hollow box in non-focused windows. + (cuss cursor-type 'bar) (cuss cursor-in-non-selected-windows 'hollow) -# Fonts +# Typesetting + + +## Fonts + +This 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 – I got it from the ["Testing if fonts are available?"](https://www.emacswiki.org/emacs/SetFonts#toc11) section of the SetFonts page on EmacsWiki. See [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. @@ -363,7 +470,9 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que (add-hook 'focus-in-hook #'acdw/setup-fonts) -## Unicode +## [unicode-fonts](https://github.com/rolandwalker/unicode-fonts) + +This does something similar to the above code, but for the entirety of the Unicode field (I think). (use-package unicode-fonts :config @@ -372,18 +481,49 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que ## Variable pitch faces +One 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. + (add-hook 'text-mode-hook #'variable-pitch-mode) +## Padding + +This has been taken from ["Ricing Org Mode"](https://lepisma.xyz/2017/10/28/ricing-org-mode/) – of course, I want the typographic niceties everywhere. + + (cuss line-spacing 0.1) + + # Ease of use -## Selectrum & Prescient +## Startup + +I 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 – but until then, a simple "Hi there!" will suffice 😎 + + (cuss inhibit-startup-buffer-menu t) + (cuss inhibit-startup-screen t) + (cuss initial-buffer-choice t) + (cuss initial-scratch-message ";; Hi there!\n") + + +## Completing-read niceties + +`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. + + +### [selectrum](https://github.com/raxod502/selectrum) + +`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`. (use-package selectrum :config (selectrum-mode 1)) + +### [prescient](https://github.com/raxod502/prescient.el) + +`prescient` helps `selectrum` be more intelligent about sorting the candidates in a list – 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. + (use-package prescient :config (prescient-persist-mode 1)) @@ -394,7 +534,44 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que (selectrum-prescient-mode 1)) -## CtrlF +### [consult](https://github.com/minad/cconsult) + +`consult` is the newest package I have with this setup, and it kind of brings the `selectrum` experience up to par with `ivy`'s – 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. + +By 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`. + + (use-package consult + :after (selectrum) + :straight (consult + :host github + :repo "minad/consult") + :bind (("C-x b" . consult-buffer) + ("C-x 4 b" . consult-buffer-other-window) + ("C-x 5 b" . consult-buffer-other-frame) + ("M-g o" . consult-outline) + ("M-g l" . consult-line) + ("M-y" . consult-yank-pop) + (" a" . consult-apropos)) + :init + (fset 'multi-occur #'consult-multi-occur) + (consult-annotate-mode) + :config + (setf (alist-get 'execute-extended-command consult-annotate-alist) + #'consult-annotate-command-full)) + + +### Ignore case + +I don't like holding the Shift key if I can help it. + + (cuss completion-ignore-case t) + (cuss read-buffer-completion-ignore-case t) + (cuss read-file-name-completion-ignore-case t) + + +## [ctrlf](https://github.com/raxod502/ctrlf) + +The biggest reason I use this over the default functionality of `C-s` is that `ctrlf-forward-*` wraps the search around by default. (use-package ctrlf :custom @@ -408,22 +585,9 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que (ctrlf-mode 1)) -## Startup +## [which-key](https://github.com/justbur/emacs-which-key) - (cuss inhibit-startup-buffer-menu t) - (cuss inhibit-startup-screen t) - (cuss initial-buffer-choice t) - (cuss initial-scratch-message ";; Hi there!\n") - - -## Ignore case - - (cuss completion-ignore-case t) - (cuss read-buffer-completion-ignore-case t) - (cuss read-file-name-completion-ignore-case t) - - -## Which key +This package is really helpful for discovering functionality. When I get more adept in my Emacs-fu, I might remove this. (use-package which-key :custom @@ -434,8 +598,12 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que ## Miscellaneous settings +Maybe a better title for this section is **Other settings** – or maybe I should put them somewhere else entirely. + -### Set view mode when in a read-only file +### Set `view-mode` when in a read-only file + +`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. (cuss view-read-only t) @@ -447,22 +615,30 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que ### Enable all functions +By default, Emacs disables some commands, because NeWbIeS wOuLd GeT cOnFuSeD or some ish. I just want to use the dang editor! + (cuss disabled-command-function nil) ### Shorter confirmations +Instead of making me type *yes* or *no*, just let me hit the *y* or *n* key. + (fset 'yes-or-no-p #'y-or-n-p) ### Uniquify buffer names +This 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). + (require 'uniquify) (cuss uniquify-buffer-name-style 'forward) ### Show buffer boundaries +These little L-shaped graphics at the top and bottom of buffers don't do anything, but I like 'em. + (cuss indicate-buffer-boundaries '((top . right) (bottom . right) @@ -471,23 +647,14 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que ### Hippie expand - (global-set-key (kbd "M-/") 'hippie-expand) - +At some point, will probably replace with [company](https://company-mode.github.io/). -### iBuffer - - (global-set-key (kbd "C-x C-b") 'ibuffer) - - -### Zap-up-to-char, not zap-to-char - - (autoload 'zap-up-to-char "misc" - "Kill up to, but not including, ARGth occurrence of CHAR." t) + (global-set-key (kbd "M-/") 'hippie-expand) - (global-set-key (kbd "M-z") 'zap-up-to-char) +### "[better defaults](https://git.sr.ht/~technomancy/better-defaults/tree/master/better-defaults.el)" -### Other "[better defaults](https://git.sr.ht/~technomancy/better-defaults/tree/master/better-defaults.el)" +Most of these come from technomancy's repo, linked above, just copy-pasted into here. (cuss save-interprogram-paste-before-kill t) (cuss apropos-do-all t) @@ -496,15 +663,34 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que (cuss visible-bell (not (string= (system-name) "larry"))) (cuss ediff-window-setup-function #'ediff-setup-windows-plain) +1. Zap-up-to-char, not zap-to-char + + Similarly to `ibuffer`, this is a Better defaultâ„¢. + + (autoload 'zap-up-to-char "misc" + "Kill up to, but not including, ARGth occurrence of CHAR." t) + + (global-set-key (kbd "M-z") 'zap-up-to-char) + +2. iBuffer + + 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. + + (global-set-key (kbd "C-x C-b") 'ibuffer) + ### So-long-mode +I figure, why not go ahead and make Emacs deal with really long lines better? Can't hurt, right? + (if (boundp 'global-so-long-mode) (global-so-long-mode)) ### Change `just-one-space` to `cycle-space` +I 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. + (defun acdw/cycle-spacing-1 () (interactive) (cycle-spacing -1)) @@ -514,8 +700,12 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que # Persistence +Honestly, 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. -## Auto-saves + +## Auto-saves with [super-save](https://github.com/bbatsov/super-save) + +The default `auto-save` functionality isn't … *enough* for me. I want to *actually* save the files, and I don't care about `#file#` stuff. So … I use this package. (use-package super-save :custom @@ -527,6 +717,8 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que ## Backup files +To be honest, I probably don't need backup files at all. At some point, I will probably delete this. + (cuss backup-directory-alist `((".*" . ,(no-littering-expand-var-file-name "backup/")))) @@ -538,20 +730,26 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que ## Recent files - (use-package recentf - :custom-update - (recentf-exclude - '(no-littering-var-directory - no-littering-etc-directory)) - :custom - (recentf-max-menu-items 100) - (recentf-max-saved-items 100) - :config - (recentf-mode 1)) +Since I apparently *only* edit my `config.org`, this is also probably not necessary – I'd be better off just adding a `(find-file (concat (user-emacs-directory "config.org")))` at the end 😎 + +But until then, it's really nice to have a `recentf` list. + + (require 'recentf) + + (add-to-list 'recentf-exclude + '(no-littering-var-directory + no-littering-etc-directory)) + + (cuss recentf-max-menu-items 100) + (cuss recentf-max-saved-items 100) + + (recentf-mode 1) ### Easily navigate recent files +Now I'm going through this, I might not need this function any more. I'll have to see how `consult` goes. + (defun recentf-find-file () "Find a recent file using `completing-read'." (interactive) @@ -564,31 +762,39 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que ## Save places in visited files - (use-package saveplace - :custom - (save-place-file (no-littering-expand-var-file-name "places")) - (save-place-forget-unreadable-files (not - (eq system-type 'windows-nt)) - :config - (save-place-mode 1))) + (require 'saveplace) + + (cuss save-place-file (no-littering-expand-var-file-name "places")) + + (cuss save-place-forget-unreadable-files + (not (eq system-type 'windows-nt))) + + (save-place-mode 1) ## Save history - (use-package savehist - :custom - (savehist-additional-variables - '(kill-ring - search-ring - regexp-search-ring)) - (savehist-save-minibuffer-history t) - (history-length t) - (history-delete-duplicates t) - :config - (savehist-mode 1)) + (require 'savehist) + + (cuss savehist-additional-variables + '(kill-ring + search-ring + regexp-search-ring)) + (cuss savehist-save-minibuffer-history t) -## Undo + (cuss history-length t) + + (cuss history-delete-duplicates t) + + (savehist-mode 1) + + +## Undo: [undo-fu-session](https://gitlab.com/ideasman42/emacs-undo-fu-session) + +The 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. + +Note to self: if I *do* switch away from `undo-fu`, look at [undohist](https://github.com/emacsorphanage/undohist). (use-package undo-fu-session :after (no-littering undo-fu) @@ -607,6 +813,8 @@ See [this StackExchange question and answer](https://emacs.stackexchange.com/que ## File encoding +I 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. + I'm going to be honest – most of this is a stab in the dark. (set-language-environment 'utf-8) @@ -627,7 +835,9 @@ I'm going to be honest – most of this is a stab in the dark. (add-hook 'find-file-hooks #'acdw/no-junk-please-were-unixish) -## Undo +## [undo-fu](https://gitlab.com/ideasman42/emacs-undo-fu) + +I've heard that Emacs' undo is weird, so here I am, trying to make it …. *less* weird. I keep forgetting I've installed this though, so I might uninstall it at some point. (use-package undo-fu :bind @@ -635,7 +845,9 @@ I'm going to be honest – most of this is a stab in the dark. ("C-?" . undo-fu-only-redo)) -## Find/replace +## Find/replace: [visual-regexp](https://github.com/benma/visual-regexp.el) + +Another replacement for a Killer Feature in Neovim – 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… pretty similarly. It could be a little better. (use-package visual-regexp :bind @@ -646,14 +858,20 @@ I'm going to be honest – most of this is a stab in the dark. ## Visual editing -### Volatile highlights +### [volatile-highlights](https://github.com/k-talo/volatile-highlights.el) + +Highlights text changed by certain operations. (use-package volatile-highlights :config (volatile-highlights-mode 1)) -### Expand region +### [expand-region](https://github.com/magnars/expand-region.el) + +I don't use this a *ton*, but not because it's not useful – I just forget it's there sometimes. + +Basically, it allows you to do like a Kakoune-style incremental widening of the selection by semantic units. (use-package expand-region :bind @@ -663,19 +881,25 @@ I'm going to be honest – most of this is a stab in the dark. ## Clean up white space on save +I'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. + (add-hook 'before-save-hook #'whitespace-cleanup) (add-hook 'before-save-hook #'delete-trailing-whitespace) ## Automatically revert a file to what it is on disk +Revert a buffer to reflect what's on disk if it's changed outside of Emacs. + (global-auto-revert-mode 1) # Writing +Configurations related to writing prose or verse. + -## Word count +## Word count: [wc-mode](https://github.com/bnbeckwith/wc-mode) (use-package wc-mode :config @@ -683,7 +907,9 @@ I'm going to be honest – most of this is a stab in the dark. :hook text-mode) -## Visual fill column mode +## [visual-fill-column-mode](https://github.com/joostkremers/visual-fill-column) + +Center the text part of the frame within a `fill-column`-sized area in the frame as a whole. (use-package visual-fill-column :custom @@ -698,7 +924,22 @@ I'm going to be honest – most of this is a stab in the dark. (text-mode . visual-fill-column-mode)) -## Org mode +### Fix mouse bindings + +In `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. + + (bind-key [left-margin wheel-down] 'scroll-down-command) + (bind-key [right-margin wheel-down] 'scroll-down-command) + + (bind-key [left-margin wheel-up] 'scroll-up-command) + (bind-key [right-margin wheel-up] 'scroll-up-command) + + +## [org-mode](https://orgmode.org/) + +Pretty self-explanatory, I think… + +I need to break this config up and like, comment it better. (use-package org :custom @@ -707,10 +948,25 @@ I'm going to be honest – most of this is a stab in the dark. (org-hide-emphasis-markers t) (org-fontify-done-headline t) (org-fontify-whole-heading-line t) + (org-fontify-quote-and-verse-blocks t) (org-hide-leading-stars t) (org-hidden-keywords '(author date title)) (org-src-window-setup 'current-window) - (org-pretty-entities t)) + (org-pretty-entities t) + (org-ellipsis " ⋯ ")) + + +### Make bullets look like centered dots + +from [zzamboni.org](https://zzamboni.org/post/beautifying-org-mode-in-emacs/) + + (font-lock-add-keywords + 'org-mode + '(("^ *\\([-+]\\) " + (0 (prog1 () + (compose-region (match-beginning 1) + (match-end 1) + "•")))))) ### Enable markdown export @@ -869,18 +1125,26 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim) # Coding +The Other Thing Emacs is Good For. + ## Formatting -### Indenting +### Indenting: [aggressive-indent-mode](https://github.com/Malabarba/aggressive-indent-mode) + +This 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. (use-package aggressive-indent + :init + (electric-indent-mode -1) :config (global-aggressive-indent-mode 1)) -### Smart tabs +### [Smart tabs](https://github.com/jcsalomon/smarttabs) + +I 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. (use-package smart-tabs-mode :custom @@ -897,6 +1161,8 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim) ### Prettify symbols mode +By default, I think `prettify-symbols-mode` only changes `lambda` to `λ`. I should, at some point, add some prettified symbols. + (add-hook 'prog-mode-hook #'prettify-symbols-mode) @@ -904,10 +1170,14 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim) 1. `show-paren-style` + 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. + (cuss show-paren-style 'mixed) (show-paren-mode 1) -2. Smartparens +2. [smartparens](https://github.com/Fuco1/smartparens) + + Automagically close pairs and stuff. See also [ParEdit](https://www.emacswiki.org/emacs/ParEdit) – maybe test that one? (use-package smartparens :init @@ -917,13 +1187,17 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim) :hook (prog-mode . acdw/setup-smartparens)) -3. Rainbow delimiters +3. [rainbow-delimiters](https://github.com/Fanael/rainbow-delimiters) + + Show different pairs of delimiters in diffferent colors. Pretty! Useful! (use-package rainbow-delimiters :hook (prog-mode . rainbow-delimiters-mode)) -### Rainbow mode +### [rainbow-mode](https://elpa.gnu.org/packages/rainbow-mode.html) + +Show different colors *in that color*. Useful! Pretty! (use-package rainbow-mode :custom @@ -933,6 +1207,8 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim) ### Line numbers +I 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. + (defun acdw/enable-line-numbers () "Enable line numbers, either through `display-line-numbers-mode' or through `linum-mode'." @@ -948,6 +1224,8 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim) ## Programming languages +These are the programming languages I (don't really) use. + ### Fish shell @@ -1001,14 +1279,25 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim) # Applications +Of course, the real reason we love emacs is for the application layer. What is it they say? + +> Emacs is a great operating system, lacking only a decent editor. + +Yeah, that's it 😎 + -## Git +## Git: [magit](https://magit.vc/) + +The magical porcelain. (use-package magit :bind ("C-x g" . magit-status) :custom-update - (magit-no-confirm '(stage-all-changes))) + (magit-no-confirm '(stage-all-changes)) + :config + (add-hook 'magit-process-find-password-functions + #'magit-process-password-auth-source)) ### Hook into `prescient` @@ -1044,6 +1333,8 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim) ## Dired +I'm still figuring out what all I can do with `dired`. + (with-eval-after-load 'dired (cuss dired-dwim-target t) (cuss dired-listing-switches "-alDh") @@ -1052,8 +1343,20 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim) (bind-key "C-c w" #'wdired-change-to-wdired-mode 'dired-mode-map)) +### dired-subtree + +Part of the [dired-hacks](https://github.com/Fuco1/dired-hacks) package. + + (use-package dired-subtree + :bind (:map dired-mode-map + (("i" . dired-subtree-insert) + (";" . dired-subtree-remove)))) + + ## Proced +The process editor. + (defun acdw/setup-proced () (variable-pitch-mode -1) (toggle-truncate-lines 1) @@ -1062,7 +1365,14 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim) (add-hook 'proced-mode-hook #'acdw/setup-proced) -## Elpher +## Gemini (and gopher) + + +### [elpher](https://thelambdalab.xyz/elpher/) + +Actually, `elpher` is the reason I started using Emacs. So thanks, smol web denizens! + +Fun fact: these packages are *also* why I use `straight.el`, since they're none of them on GitHub. (use-package elpher :straight (elpher @@ -1094,6 +1404,11 @@ from [unpackaged.el](https://github.com/alphapapa/unpackaged.el#org-return-dwim) :hook (elpher-mode . visual-fill-column-mode)) + +### [gemini-mode](https://git.carcosa.net/jmcbray/gemini.el) + +A major mode for `text/gemini` files. I've changed the headings to match Elpher's. + (use-package gemini-mode :straight (gemini-mode :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) ((t (:inherit (elpher-gemini-heading2))))) (gemini-heading-face3 ((t (:inherit (elpher-gemini-heading3))))) + :init + (defun acdw/setup-gemini-mode () + (visual-fill-column-mode 1) + (variable-pitch-mode -1)) :hook - (gemini-mode . visual-fill-column-mode)) + (gemini-mode . acdw/setup-gemini-mode)) + + +### [gemini-write](https://alexschroeder.ch/cgit/gemini-write/about/) + +Alex Schroeder's Emacs implementation of the Titan protocol. This is why I use his Gemini server, [Phoebe](https://alexschroeder.ch/cgit/phoebe/)! (use-package gemini-write :straight (gemini-write :repo "https://alexschroeder.ch/cgit/gemini-write") :config - (add-to-list 'elpher-gemini-tokens - (acdw-secrets/elpher-gemini-tokens))) + (when (boundp 'acdw-secrets/elpher-gemini-tokens) + (add-to-list 'elpher-gemini-tokens + acdw-secrets/elpher-gemini-tokens))) + + +### [post-to-gemlog-blue](https://git.sr.ht/~acdw/post-to-gemlog-blue.el) + +My 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 😎 (use-package post-to-gemlog-blue :straight (post-to-gemlog-blue :repo "https://git.sr.ht/~acdw/post-to-gemlog-blue.el")) -## Pastebin (0x0) +## Pastebin: [0x0](https://git.sr.ht/~zge/nullpointer-emacs) + +Pastebins are so useful. Now I can use them from Emacs. (use-package 0x0 :custom (0x0-default-service 'ttm)) -## Mu4e +## [mu4e](https://www.djcbsoftware.nl/code/mu/mu4e.html) + +I've just recently started (again) using mu4e. We'll see how it goes. (when (executable-find "mu") (add-to-list 'load-path @@ -1213,3 +1547,14 @@ if ! emacsclient -nc "$@" 2>/dev/null; then emacs --daemon emacsclient -nc "$@" fi + + +# Appendix B: areas for further research + +- [ebuku](https://github.com/flexibeast/ebuku) (of course, I'd need [buku](https://github.com/jarun/buku) as well) – bookmarks +- [KeePassXC as Secret Service](https://www.billdietrich.me/Authentication.html?expandall=1#KeePassXCandSecretService) +- [Ignoramus](https://github.com/rolandwalker/ignoramus) – this might not e necessary +- [Dynamic fonts](https://github.com/rolandwalker/dynamic-fonts) – take a look @ this and compare with my fonts section +- [Simple clipboard integration](https://github.com/rolandwalker/simpleclip) – test with Windows, maybe +- [visible mark](https://git.sr.ht/~iank/visible-mark) – show where the marks are … +- consider this Reddit thread: [speeding up magit](https://www.reddit.com/r/emacs/comments/k3xfa1/speeding_up_magit/) -- cgit 1.4.1-21-gabe81