From af2f22aa4b9b41f26542e6702ab98cfb6a9554b5 Mon Sep 17 00:00:00 2001 From: Lucien Cartier-Tilet Date: Sun, 3 May 2026 01:11:40 +0200 Subject: [PATCH] feat(emacs): recreate my old hydra menu for writeroom with transient Create a Transient menu to adapt on the fly the width of my buffers when using writeroom-mode. This commit also adds two other functions: - `my/writeroom-reset` which resets the width of the buffer to its default state - `my/writeroom-fit-buffer` which sets the width of the buffer to be exactly what is needed to fit the longest line of the buffer --- docs/emacs/keybindings.org | 58 +++++++++++++++++---------------- docs/emacs/packages/editing.org | 26 +++++++++++++++ 2 files changed, 56 insertions(+), 28 deletions(-) diff --git a/docs/emacs/keybindings.org b/docs/emacs/keybindings.org index 23eafb2..a3e7652 100644 --- a/docs/emacs/keybindings.org +++ b/docs/emacs/keybindings.org @@ -504,34 +504,36 @@ My toggle keybindings are prefixed by ~t~. A couple of keybindings are hidden from which-key, otherwise there’s not much to say. The prefix here is ~w~. #+name: keybindings-windows -| Key | Function | Description | Package | -|-----+-------------------------------+-------------+----------------| -| | | windows | | -| c | evil-window-left | | evil | -| t | evil-window-down | | evil | -| s | evil-window-up | | evil | -| r | evil-window-right | | evil | -| . | windows-adjust-size/body | | | -| - | split-window-below-and-focus | | | -| / | split-window-right-and-focus | | | -| $ | winum-select-window-by-number | | winum | -| 0 | winum-select-window-0-or-10 | none | winum | -| 1 | winum-select-window-1 | none | winum | -| 2 | winum-select-window-2 | none | winum | -| 3 | winum-select-window-3 | none | winum | -| 4 | winum-select-window-4 | none | winum | -| 5 | winum-select-window-5 | none | winum | -| 6 | winum-select-window-6 | none | winum | -| 7 | winum-select-window-7 | none | winum | -| 8 | winum-select-window-8 | none | winum | -| 9 | winum-select-window-9 | none | winum | -| b | kill-buffer-and-window | | | -| d | delete-window | | | -| o | other-window | | | -| D | delete-other-windows | | | -| w | | writeroom | | -| w. | writeroom-buffer-width/body | | writeroom-mode | -| ww | writeroom-mode | | writeroom-mode | +| Key | Function | Description | Package | +|-----+-------------------------------+----------------+----------------| +| | | windows | | +| c | evil-window-left | | evil | +| t | evil-window-down | | evil | +| s | evil-window-up | | evil | +| r | evil-window-right | | evil | +| . | windows-adjust-size/body | | | +| - | split-window-below-and-focus | | | +| / | split-window-right-and-focus | | | +| $ | winum-select-window-by-number | | winum | +| 0 | winum-select-window-0-or-10 | none | winum | +| 1 | winum-select-window-1 | none | winum | +| 2 | winum-select-window-2 | none | winum | +| 3 | winum-select-window-3 | none | winum | +| 4 | winum-select-window-4 | none | winum | +| 5 | winum-select-window-5 | none | winum | +| 6 | winum-select-window-6 | none | winum | +| 7 | winum-select-window-7 | none | winum | +| 8 | winum-select-window-8 | none | winum | +| 9 | winum-select-window-9 | none | winum | +| b | kill-buffer-and-window | | | +| d | delete-window | | | +| o | other-window | | | +| D | delete-other-windows | | | +| w | | writeroom | | +| w. | my/writeroom-transient | adapt width | | +| w= | my/writeroom-reset | reset width | | +| wf | my/writeroom-fit-buffer | fit to content | | +| ww | writeroom-mode | | writeroom-mode | ** Quit Why would I ever use any of these keybindings? They are prefixed with ~q~. diff --git a/docs/emacs/packages/editing.org b/docs/emacs/packages/editing.org index 3d1839f..9df3620 100644 --- a/docs/emacs/packages/editing.org +++ b/docs/emacs/packages/editing.org @@ -176,4 +176,30 @@ is a bit too small for me, and I prefer not to go full-screen. writeroom-maximize-window nil writeroom-mode-line t writeroom-major-modes '(text-mode org-mode markdown-mode nov-mode Info-mode))) + +(with-eval-after-load 'transient + (defun my/writeroom-reset () + (interactive) + (setq writeroom-width 100) + (writeroom-adjust-width nil)) + + (defun my/writeroom-fit-buffer () + "Set writeroom to fit the longest line in the current buffer." + (interactive) + (when writeroom-mode + (let ((max-width 0)) + (save-excursion + (goto-char (point-min)) + (while (not (eobp)) + (end-of-line) + (setq max-width (max max-width (current-column))) + (forward-line 1))) + (writeroom-adjust-width (- max-width visual-fill-column-width))))) + + (transient-define-prefix my/writeroom-transient () + "Writewroom Transient" + ["Adjust" + ("r" "widen" writeroom-increase-width :transient t) + ("c" "tighten" writeroom-decrease-width :transient t) + ("q" "quit" transient-quit-all)])) #+end_src