From 82fd77c3ededcff419aa06ee306dd6c8f7c4801a Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Thu, 23 Jan 2025 21:36:02 +0200 Subject: [PATCH] mu4e-transient: update Still experimental, but a few improvements. --- mu4e/mu4e-transient.el | 116 +++++++++++++++++++++++++++++++++++------ 1 file changed, 100 insertions(+), 16 deletions(-) diff --git a/mu4e/mu4e-transient.el b/mu4e/mu4e-transient.el index 83226741..6877bc38 100644 --- a/mu4e/mu4e-transient.el +++ b/mu4e/mu4e-transient.el @@ -4,17 +4,52 @@ ;;; Commentary: ;;; -;;; Define "transients" for some mu4e menus. +;;; Define "transients" for some mu4e functionality. ;;; Code: (require 'mu4e) (require 'mu4e-bookmarks) (require 'mu4e-compose) (require 'mu4e-draft) +(require 'mu4e-headers) +(require 'mu4e-helpers) (require 'transient) -(transient-define-prefix mu4e-transient-menu-docs-links() +;; Helpers. + +(defun mu4e--toggle-description(name val) + "Return a string for a transient toggle with NAME. +Show On/Off based on value VAL." + (concat name " " + (propertize (if val "On " "Off") + 'face 'transient-value))) + +(defmacro mu4e--define-toggle-suffix (name symbol &optional toggle-func) + "Define a transient suffix to toggle some value. +Show the suffix with NAME. SYMBOL is the symbol for the value to +toggle. + +TOGGLE-FUNC is the function to do the toggling. If nil, a simple +toggle-function is created." + (let* ((symname (symbol-name symbol)) + (ifname (intern (format "mu4e--suffix-toggle-%s" symname))) + (docstring (format "Toggle the value of `%s'" symname)) + (toggle-func (or toggle-func + `(lambda () + (interactive) + (setq ,symbol (not ,symbol)))))) + `(progn + (transient-define-suffix ,ifname () ,docstring + :transient t + :if (lambda () (boundp (quote ,symbol))) + :description (lambda () (mu4e--toggle-description ,name ,symbol)) + (interactive) + (call-interactively ,toggle-func))))) + +;; Transients + +(transient-define-prefix mu4e--prefix-docs-links() "Mu4e documentation menu." [["Documentation" ("A" "About mu4e" mu4e-about) @@ -33,13 +68,58 @@ ("o" "Mu Issues" (lambda () (interactive) (browse-url "https://github.com/djcb/mu/issues")))]]) -(transient-define-prefix mu4e-transient-menu-debug() - "Mu4e debugging menu." - [["Debugging" - ("$" "Toggle logging" mu4e-toggle-logging) +(mu4e--define-toggle-suffix "Debug client" mu4e-debug #'mu4e-toggle-logging) +(mu4e--define-toggle-suffix "Debug server" mu4e-mu-debug) +(mu4e--define-toggle-suffix "Report render-time" mu4e-headers-report-render-time) +(mu4e--define-toggle-suffix "Temp-file optimization" mu4e-mu-allow-temp-file) + +(transient-define-prefix mu4e--prefix-debug-tweaks() + "Mu4e debugging and tweaks menu." + [["Debug" + ("$" mu4e--suffix-toggle-mu4e-debug) + ("r" mu4e--suffix-toggle-mu4e-headers-report-render-time) + ("L" "Toggle logging" mu4e-toggle-logging) + ("l" "Log buffer" mu4e-show-log)] + ["Info" ("," "Message sexp" mu4e-sexp-at-point :inapt-if-not (lambda () (mu4e-message-at-point 'nowarn))) - ("l" "Last query sexp" mu4e-analyze-last-query)]]) + ("a" "Analyze query" mu4e-analyze-last-query) + ("c" "Known contacts" mu4e-contacts-info)] + ["Server (needs restart)" + ("d" mu4e--suffix-toggle-mu4e-mu-debug) + ("t" mu4e--suffix-toggle-mu4e-mu-allow-temp-file)]]) + +(mu4e--define-toggle-suffix "format=flowed" mu4e-compose-format-flowed) +(mu4e--define-toggle-suffix "Forward as MIME" message-forward-as-mime) + +;; (transient-define-suffix mu4e--suffix-message-forward-show-mml (args) +;; "Show MML when forwarding? +;; See `message-forward-show-mml' for details." +;; :transient t +;; :description (lambda () +;; (let ((val (pcase message-forward-as-mime +;; ('nil "Off") +;; ('best "Best") +;; (_ "On"))))) +;; (concat "Show MML " +;; (propertize val 'face 'transient-value))) +;; ;;:choices '("On" "Off" "Best") + +;; ) + +;;(setq message-forward-as-mime 'best) + +;;(mu4e--define-toggle-suffix "Show MML" message-forward-show-mml) + +(transient-define-prefix mu4e--prefix-compose-options() + "Mu4e debugging menu." + [["Formatting" + ("f" mu4e--suffix-toggle-mu4e-compose-format-flowed)] + ["Forwarding" + ("m" mu4e--suffix-toggle-message-forward-as-mime) + ;; handle 'best' + ;;("M" mu4e--suffix-toggle-message-forward-show-mml) + ]]) (transient-define-prefix mu4e-transient-menu() "Mu4e main menu." @@ -53,28 +133,32 @@ ("b" "Bookmark" mu4e-search-bookmark) ("j" "Maildir" mu4e-search-maildir) ("c" "Choose query" mu4e-search-query) - ("s" "Search" mu4e-search-query)] + ("s" "Search" mu4e-search)] ["Composition" - ("C" "New mail" mu4e-compose-new)] + ("C" "New mail" mu4e-compose-new) + ("o" "Options..." mu4e--prefix-compose-options) + ] ["" ;; composition that requires an existing message - :if (lambda () (memq major-mode '(mu4e-headers-mode mu4e-view-mode))) - :inapt-if-not (lambda () (mu4e-message-at-point 'nowarn)) + :if (lambda () + (memq major-mode '(mu4e-headers-mode mu4e-view-mode))) + :inapt-if-not (lambda () + (mu4e-message-at-point 'nowarn)) ("R" "Reply" mu4e-compose-reply) ("W" "Reply-to-all" mu4e-compose-wide-reply) ("F" "Forward" mu4e-compose-forward) ;; only draft messages can be edited ("E" "Edit draft" mu4e-compose-edit :inapt-if-not (lambda () - (member 'draft - (mu4e-message-field - (mu4e-message-at-point 'nowarn) :flags)))) + (member 'draft + (mu4e-message-field + (mu4e-message-at-point 'nowarn) :flags)))) ;; you can only supersede your own messages ("S" "Supersede" mu4e-compose-supersede :inapt-if-not mu4e--message-is-yours-p) ("X" "Resend" mu4e-compose-resend)] ["Misc" - ("d" "Docs & links" mu4e-transient-menu-docs-links) - ("D" "Debugging" mu4e-transient-menu-debug)]]) + ("d" "Docs & links" mu4e--prefix-docs-links) + ("D" "Debug/tweaks..." mu4e--prefix-debug-tweaks)]]) (provide 'mu4e-transient) ;;; mu4e-transient.el ends here