Merge branch 'redbook'

This commit is contained in:
Joe Frikker
2026-09-11 13:03:02 -04:00
+192 -173
View File
@@ -851,8 +851,6 @@ Turn off some default settings that I don't find useful.
#+BEGIN_SRC elisp #+BEGIN_SRC elisp
(setopt save-interprogram-paste-before-kill t) (setopt save-interprogram-paste-before-kill t)
(setopt kill-whole-line t)
(column-number-mode t)
(setopt enable-recursive-minibuffers t) (setopt enable-recursive-minibuffers t)
(setopt line-spacing 0.15) (setopt line-spacing 0.15)
@@ -907,6 +905,22 @@ least this setting is correct.
(setopt sentence-end-double-space nil) (setopt sentence-end-double-space nil)
#+end_src #+end_src
I kill whole lines *way* more than partial lines. If the cursor is at the front of a line, this will
just kill the whole line instead of requiring two ~C-k C-k~ presses to make it happen. I'm not sure
when I'd ever want it to kill the line *without* the trailing newline, but I guess the one time ever
that I do, I'll have to press two more keys :(
#+begin_src elisp
(setopt kill-whole-line t)
#+end_src
Show column numbers in the modeline. Now that I think about it, I'm not sure why I want this. I
guess I could try turning it off someday?
#+begin_src elisp
(column-number-mode t)
#+end_src
Make sure which-key mode is always on. The on-the-fly keymap help it gives is indespensable. Make sure which-key mode is always on. The on-the-fly keymap help it gives is indespensable.
#+BEGIN_SRC elisp #+BEGIN_SRC elisp
@@ -1079,40 +1093,40 @@ windows. I place windows in the bottom or on the right mostly depending on how w
content to be. content to be.
#+BEGIN_SRC elisp #+BEGIN_SRC elisp
(defun jf/window-children (window) (defun jf/window-children (window)
(let ((result nil) (let ((result nil)
(child (window-child window))) (child (window-child window)))
(while child (while child
(push child result) (push child result)
(setq child (window-next-sibling child))) (setq child (window-next-sibling child)))
(reverse result))) (reverse result)))
(defun jf/window-main-root (&optional frame) (defun jf/window-main-root (&optional frame)
"Return FRAME's main (non-side) window or window subtree." "Return FRAME's main (non-side) window or window subtree."
(let* ((root (frame-root-window (or frame (selected-frame)))) (let* ((root (frame-root-window (or frame (selected-frame))))
(children (jf/window-children root))) (children (jf/window-children root)))
(if (seq-some (lambda (w) (window-parameter w 'window-side)) children) (if (seq-some (lambda (w) (window-parameter w 'window-side)) children)
(seq-find (lambda (w) (not (window-parameter w 'window-side))) children) (seq-find (lambda (w) (not (window-parameter w 'window-side))) children)
root))) root)))
(defun jf/window-leaves (window) (defun jf/window-leaves (window)
"Return the live leaf windows in WINDOW's subtree." "Return the live leaf windows in WINDOW's subtree."
(if (window-live-p window) (if (window-live-p window)
(list window) (list window)
(mapcan #'jf/window-leaves (jf/window-children window)))) (mapcan #'jf/window-leaves (jf/window-children window))))
(defun jf/topright-window (windows) (defun jf/topright-window (windows)
"Return whichever of WINDOWS sits furthest up, then furthest right." "Return whichever of WINDOWS sits furthest up, then furthest right."
(car (sort (copy-sequence windows) (car (sort (copy-sequence windows)
(lambda (a b) (lambda (a b)
(let ((top-a (nth 1 (window-edges a))) (let ((top-a (nth 1 (window-edges a)))
(top-b (nth 1 (window-edges b)))) (top-b (nth 1 (window-edges b))))
(if (= top-a top-b) (if (= top-a top-b)
(> (nth 0 (window-edges a)) (nth 0 (window-edges b))) (> (nth 0 (window-edges a)) (nth 0 (window-edges b)))
(< top-a top-b))))))) (< top-a top-b)))))))
(defun jf/display-buffer-right (buffer alist) (defun jf/display-buffer-right (buffer alist)
"Display BUFFER on the right of the main editing area. "Display BUFFER on the right of the main editing area.
Applies three rules, based on the shape of the frame's non-side windows: Applies three rules, based on the shape of the frame's non-side windows:
1. One window -> split it and show BUFFER in the new right window. 1. One window -> split it and show BUFFER in the new right window.
@@ -1120,92 +1134,92 @@ content to be.
right window is selected, swap the two windows first (keeping right window is selected, swap the two windows first (keeping
focus on the buffer that was active) so BUFFER doesn't evict it. focus on the buffer that was active) so BUFFER doesn't evict it.
3. Any other layout -> show BUFFER in the upper-rightmost window." 3. Any other layout -> show BUFFER in the upper-rightmost window."
(let ((main (jf/window-main-root))) (let ((main (jf/window-main-root)))
(cond (cond
((window-live-p main) ((window-live-p main)
(let* ((new (split-window main nil 'right)) (let* ((new (split-window main nil 'right))
(width (max 1 (- (frame-width) 120))) (width (max 1 (- (frame-width) 120)))
(delta (window-resizable new (- width (window-width new)) t))) (delta (window-resizable new (- width (window-width new)) t)))
(window-resize new delta t) (window-resize new delta t)
(window--display-buffer buffer new 'window alist))) (window--display-buffer buffer new 'window alist)))
((and (window-left-child main) ((and (window-left-child main)
(= (length (jf/window-children main)) 2) (= (length (jf/window-children main)) 2)
(seq-every-p #'window-live-p (jf/window-children main))) (seq-every-p #'window-live-p (jf/window-children main)))
(let* ((left (window-left-child main)) (let* ((left (window-left-child main))
(right (window-next-sibling left))) (right (window-next-sibling left)))
(when (eq (selected-window) right) (when (eq (selected-window) right)
(window-swap-states left right) (window-swap-states left right)
(select-window left)) (select-window left))
(window--display-buffer buffer right 'reuse alist))) (window--display-buffer buffer right 'reuse alist)))
(t (t
(window--display-buffer buffer (jf/topright-window (jf/window-leaves main)) 'reuse alist))))) (window--display-buffer buffer (jf/topright-window (jf/window-leaves main)) 'reuse alist)))))
(setopt popper-reference-buffers (setopt popper-reference-buffers
'("\\*Flymake diagnostics .*" '("\\*Flymake diagnostics .*"
"\\*Embark Export: .*" "\\*Embark Export: .*"
"\\*Embark Collect .*" "\\*Embark Collect .*"
"\\*xref\\*" "\\*xref\\*"
"\\*compilation\\*" "\\*compilation\\*"
"\\*pnpm:.*" "\\*pnpm:.*"
"\\*sly-mrepl *" "\\*sly-mrepl *"
"\\*lispy-message\\*" "\\*lispy-message\\*"
"\\*occur\\*" "\\*occur\\*"
".*eshell\\*" ".*eshell\\*"
"\\*SQL: .*" "\\*SQL: .*"
"magit-revision: .*" "magit-revision: .*"
"\\*Help\\*" "\\*Help\\*"
"\\*rustfmt\\*" "\\*rustfmt\\*"
"\\*slack: .*" "\\*slack: .*"
"\\*forge: .*" "\\*forge: .*"
"new-pullreq" "new-pullreq"
"\\*claude:.*" "\\*claude:.*"
"\\*Man .*" "\\*Man .*"
"\\*List .*" "\\*List .*"
"\\*eldoc\\*")) "\\*eldoc\\*"))
(setopt popper-display-control nil) (setopt popper-display-control nil)
(popper-mode) (popper-mode)
(popper-echo-mode) (popper-echo-mode)
(bind-keys ("C-q" . popper-toggle) (bind-keys ("C-q" . popper-toggle)
("C-;" . popper-cycle)) ("C-;" . popper-cycle))
(defvar jf/fullscreen-popup--param 'jf/fullscreen-saved-configuration (defvar jf/fullscreen-popup--param 'jf/fullscreen-saved-configuration
"Key used to stash the window configuration a fullscreen popup replaced. "Key used to stash the window configuration a fullscreen popup replaced.
Stored per-tab when `tab-bar-mode' is active, otherwise as a plain frame Stored per-tab when `tab-bar-mode' is active, otherwise as a plain frame
parameter; see `jf/tab-or-frame-parameter'.") parameter; see `jf/tab-or-frame-parameter'.")
(defvar-local jf/fullscreen-popup-p nil (defvar-local jf/fullscreen-popup-p nil
"Non-nil in a buffer currently being displayed as a fullscreen popup.") "Non-nil in a buffer currently being displayed as a fullscreen popup.")
(defun jf/current-tab-cell (&optional frame) (defun jf/current-tab-cell (&optional frame)
"Return FRAME's current tab's raw data cell, or nil without `tab-bar-mode'." "Return FRAME's current tab's raw data cell, or nil without `tab-bar-mode'."
(and (bound-and-true-p tab-bar-mode) (and (bound-and-true-p tab-bar-mode)
(assq 'current-tab (tab-bar-tabs frame)))) (assq 'current-tab (tab-bar-tabs frame))))
(defun jf/tab-or-frame-parameter (parameter &optional frame) (defun jf/tab-or-frame-parameter (parameter &optional frame)
"Like `frame-parameter', but scoped to FRAME's selected tab when tabs are in use. "Like `frame-parameter', but scoped to FRAME's selected tab when tabs are in use.
A plain frame parameter is shared by every tab on that frame, which is wrong A plain frame parameter is shared by every tab on that frame, which is wrong
for state like `jf/fullscreen-popup--param': switching tabs swaps in an for state like `jf/fullscreen-popup--param': switching tabs swaps in an
entirely different window layout, so \"the layout to restore\" has to travel entirely different window layout, so \"the layout to restore\" has to travel
with the tab, not the frame." with the tab, not the frame."
(if-let ((tab (jf/current-tab-cell frame))) (if-let ((tab (jf/current-tab-cell frame)))
(alist-get parameter tab) (alist-get parameter tab)
(frame-parameter frame parameter))) (frame-parameter frame parameter)))
(defun jf/set-tab-or-frame-parameter (parameter value &optional frame) (defun jf/set-tab-or-frame-parameter (parameter value &optional frame)
"Set PARAMETER to VALUE, scoped like `jf/tab-or-frame-parameter'." "Set PARAMETER to VALUE, scoped like `jf/tab-or-frame-parameter'."
(if-let ((tab (jf/current-tab-cell frame))) (if-let ((tab (jf/current-tab-cell frame)))
(let ((cell (assq parameter tab))) (let ((cell (assq parameter tab)))
(if cell (if cell
(setcdr cell value) (setcdr cell value)
(setcdr tab (cons (cons parameter value) (cdr tab))))) (setcdr tab (cons (cons parameter value) (cdr tab)))))
(set-frame-parameter frame parameter value))) (set-frame-parameter frame parameter value)))
(defun jf/display-buffer-fullscreen (buffer alist) (defun jf/display-buffer-fullscreen (buffer alist)
"Display BUFFER, deleting other windows, saving the prior layout. "Display BUFFER, deleting other windows, saving the prior layout.
Intended for use in `display-buffer-alist' for popups (e.g. Magit Intended for use in `display-buffer-alist' for popups (e.g. Magit
status/log) that should take over the frame while displayed, but status/log) that should take over the frame while displayed, but
@@ -1213,21 +1227,21 @@ content to be.
`q' or `popper-toggle' -- both end up calling `quit-window', which `q' or `popper-toggle' -- both end up calling `quit-window', which
is where the restore actually happens; see is where the restore actually happens; see
`jf/quit-window-restore-fullscreen'." `jf/quit-window-restore-fullscreen'."
(unless (jf/tab-or-frame-parameter jf/fullscreen-popup--param) (unless (jf/tab-or-frame-parameter jf/fullscreen-popup--param)
(jf/set-tab-or-frame-parameter jf/fullscreen-popup--param (jf/set-tab-or-frame-parameter jf/fullscreen-popup--param
(current-window-configuration))) (current-window-configuration)))
(when-let ((window (or (display-buffer-reuse-window buffer alist) (when-let ((window (or (display-buffer-reuse-window buffer alist)
(display-buffer-same-window buffer alist) (display-buffer-same-window buffer alist)
(display-buffer-pop-up-window buffer alist) (display-buffer-pop-up-window buffer alist)
(display-buffer-use-some-window buffer alist)))) (display-buffer-use-some-window buffer alist))))
(let ((ignore-window-parameters t)) (let ((ignore-window-parameters t))
(delete-other-windows window)) (delete-other-windows window))
(with-current-buffer buffer (with-current-buffer buffer
(setq jf/fullscreen-popup-p t)) (setq jf/fullscreen-popup-p t))
window)) window))
(defun jf/quit-window-restore-fullscreen (orig-fn &optional kill window) (defun jf/quit-window-restore-fullscreen (orig-fn &optional kill window)
"Restore the saved window configuration after quitting a fullscreen popup. "Restore the saved window configuration after quitting a fullscreen popup.
Advice around `quit-window' so both `q' (which Magit and other Advice around `quit-window' so both `q' (which Magit and other
special-mode buffers bind to buffer-quitting commands that call special-mode buffers bind to buffer-quitting commands that call
@@ -1236,70 +1250,69 @@ content to be.
last fullscreen popup on the tab (or frame, without `tab-bar-mode') last fullscreen popup on the tab (or frame, without `tab-bar-mode')
has closed, so opening one fullscreen popup from within another has closed, so opening one fullscreen popup from within another
falls back to the outer one first." falls back to the outer one first."
(let* ((window (or window (selected-window))) (let* ((window (or window (selected-window)))
(was-fullscreen (buffer-local-value 'jf/fullscreen-popup-p (was-fullscreen (buffer-local-value 'jf/fullscreen-popup-p
(window-buffer window))) (window-buffer window)))
(frame (window-frame window))) (frame (window-frame window)))
(funcall orig-fn kill window) (funcall orig-fn kill window)
(when (and was-fullscreen (when (and was-fullscreen
(not (and (window-live-p window) (not (and (window-live-p window)
(buffer-local-value 'jf/fullscreen-popup-p (buffer-local-value 'jf/fullscreen-popup-p
(window-buffer window)))) (window-buffer window))))
(jf/tab-or-frame-parameter jf/fullscreen-popup--param frame)) (jf/tab-or-frame-parameter jf/fullscreen-popup--param frame))
(let ((conf (jf/tab-or-frame-parameter jf/fullscreen-popup--param frame))) (let ((conf (jf/tab-or-frame-parameter jf/fullscreen-popup--param frame)))
(jf/set-tab-or-frame-parameter jf/fullscreen-popup--param nil frame) (jf/set-tab-or-frame-parameter jf/fullscreen-popup--param nil frame)
(set-window-configuration conf))))) (set-window-configuration conf)))))
(advice-add 'quit-window :around #'jf/quit-window-restore-fullscreen) (advice-add 'quit-window :around #'jf/quit-window-restore-fullscreen)
(setopt split-width-threshold 200) (setopt split-width-threshold 200)
(setopt split-height-threshold nil) (setopt split-height-threshold nil)
(setopt display-buffer-base-action (setopt display-buffer-base-action
'((display-buffer-reuse-window display-buffer-same-window '((display-buffer-reuse-window
display-buffer-in-previous-window display-buffer-reuse-mode-window
display-buffer-use-some-window))) display-buffer-use-some-window)))
(setq display-buffer-alist (setq display-buffer-alist
'(((or "magit: *" '(((or "\\*Flymake diagnostics .*"
"magit-log*" "\\*Embark Export: .*"
"\\*Messages\\*" "\\*Embark Collect .*"
"\\*trace-output\\*" "\\*xref\\*"
"\\*EGLOT connections\\*") "\\*compilation\\*"
(jf/display-buffer-fullscreen)) "\\*pnpm:.*"
((or "\\*Flymake diagnostics .*" "\\*sly-mrepl *"
"\\*Embark Export: .*" "\\*lispy-message\\*"
"\\*Embark Collect .*" "\\*occur\\*"
"\\*xref\\*" ".*eshell\\*"
"\\*compilation\\*" "\\*SQL: .*")
"\\*pnpm:.*" (display-buffer-in-side-window)
"\\*sly-mrepl *" (side . bottom)
"\\*lispy-message\\*" (slot . 0)
"\\*occur\\*" (window-height . 0.33))
".*eshell\\*" ((or "magit: *"
"\\*SQL: .*") "magit-log*"
(display-buffer-in-side-window) "\\*Messages\\*"
(side . bottom) "\\*trace-output\\*"
(slot . 0) "\\*EGLOT connections\\*"
(window-height . 0.33) "magit-revision: .*"
(window-parameters (no-delete-other-windows . t) "\\*Help\\*"
(no-other-window . t))) "\\*rustfmt\\*"
((or "magit-revision: .*" "\\*slack: .*"
"\\*Help\\*" "\\*forge: .*"
"\\*rustfmt\\*" "new-pullreq"
"\\*slack: .*" "\\*claude:.*"
"\\*forge: .*" "\\*Man .*"
"new-pullreq" "\\*List .*"
"\\*claude:.*" "\\*Embark Actions\\*"
"\\*Man .*" "\\*eldoc\\*")
"\\*List .*" (display-buffer-reuse-window
"\\*Embark Actions\\*" display-buffer-reuse-mode-window
"\\*eldoc\\*") jf/display-buffer-right))))
(jf/display-buffer-right))))
(setopt window-persistent-parameters (setopt window-persistent-parameters
(cl-list* '(no-delete-other-windows . writable) (cl-list* '(no-delete-other-windows . writable)
'(no-other-window . writable) '(no-other-window . writable)
window-persistent-parameters)) window-persistent-parameters))
#+END_SRC #+END_SRC
@@ -1315,10 +1328,10 @@ This configuration affects general text editing, across all modes. First, some p
programs.emacs = { programs.emacs = {
enable = true; enable = true;
extraPackages = epkgs: with epkgs; [ extraPackages = epkgs: with epkgs; [
apheleia
avy avy
edit-indirect edit-indirect
embark embark
format-all
god-mode god-mode
# evil # evil
# evil-collection # evil-collection
@@ -1432,6 +1445,12 @@ Just "silently" wrap when searching at the bottom of a document.
(bind-keys ("C-x 4 n" . edit-indirect-region)) (bind-keys ("C-x 4 n" . edit-indirect-region))
#+END_SRC #+END_SRC
Some auto-formatting stuff
#+begin_src elisp
(push '(prisma-format "prisma" "format" "--schema" filepath) apheleia-formatters)
#+end_src
** Workflow ** Workflow
:PROPERTIES: :PROPERTIES:
:header-args:elisp: :tangle target/desktop/emacs-workflow.el :header-args:elisp: :tangle target/desktop/emacs-workflow.el