Commit a0bba1ac044e

Vincent Demeester <vincent@sbr.pm>
2026-07-03 22:56:47
feat(emacs): add transient for toggling modes
Added vde-toggle.el with a transient menu (C-c t m) for toggling visual, code, and text minor modes with live status indicators.
1 parent e4e7527
Changed files (2)
dots
config
dots/config/emacs/site-lisp/vde-toggle.el
@@ -0,0 +1,45 @@
+;;; vde-toggle.el --- Transient for toggling minor modes -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; A transient menu for quickly toggling buffer-local and global minor modes.
+
+;;; Code:
+
+(require 'transient)
+
+(defun vde-toggle--mode-status (mode)
+  "Return indicator string for MODE."
+  (if (and (boundp mode) (symbol-value mode)) "●" "○"))
+
+(transient-define-prefix vde-toggle-modes ()
+  "Toggle minor modes."
+  [["Visual / Display"
+   ("l" (lambda () (format "%s line numbers" (vde-toggle--mode-status 'display-line-numbers-mode)))
+    display-line-numbers-mode :transient t)
+   ("h" (lambda () (format "%s hl-line" (vde-toggle--mode-status 'global-hl-line-mode)))
+    global-hl-line-mode :transient t)
+   ("v" (lambda () (format "%s visual-line" (vde-toggle--mode-status 'visual-line-mode)))
+    visual-line-mode :transient t)
+   ("w" (lambda () (format "%s wrap-prefix" (vde-toggle--mode-status 'visual-wrap-prefix-mode)))
+    visual-wrap-prefix-mode :transient t)
+   ("W" (lambda () (format "%s whitespace" (vde-toggle--mode-status 'whitespace-mode)))
+    whitespace-mode :transient t)]
+   ["Code / Editing"
+   ("f" (lambda () (format "%s treesit-fold" (vde-toggle--mode-status 'treesit-fold-mode)))
+    treesit-fold-mode :transient t)
+   ("F" (lambda () (format "%s hideshow" (vde-toggle--mode-status 'hs-minor-mode)))
+    hs-minor-mode :transient t)
+   ("i" (lambda () (format "%s aggressive-indent" (vde-toggle--mode-status 'aggressive-indent-mode)))
+    aggressive-indent-mode :transient t)
+   ("e" (lambda () (format "%s electric-pair" (vde-toggle--mode-status 'electric-pair-mode)))
+    electric-pair-mode :transient t)
+   ("s" (lambda () (format "%s subword" (vde-toggle--mode-status 'subword-mode)))
+    subword-mode :transient t)]
+   ["Text"
+   ("S" (lambda () (format "%s flyspell" (vde-toggle--mode-status 'flyspell-mode)))
+    flyspell-mode :transient t)
+   ("a" (lambda () (format "%s auto-fill" (vde-toggle--mode-status 'auto-fill-function)))
+    auto-fill-mode :transient t)]])
+
+(provide 'vde-toggle)
+;;; vde-toggle.el ends here
dots/config/emacs/init.el
@@ -273,6 +273,9 @@ Otherwise, call `backward-kill-word'."
 ;; Add site-lisp to load-path for local elisp files
 (add-to-list 'load-path (expand-file-name "site-lisp" user-emacs-directory))
 
+(use-package vde-toggle
+  :bind ("C-c t m" . vde-toggle-modes))
+
 ;; TODO: Re-enable init-func when needed for custom macros
 ;; (use-package init-func)
 ;; ;; TODO: do useful stuff with the macro instead