summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--meson.build3
-rw-r--r--mu4e/meson.build7
-rw-r--r--mu4e/mu4e-transient.el80
3 files changed, 89 insertions, 1 deletions
diff --git a/meson.build b/meson.build
index e8cebe9..071a63f 100644
--- a/meson.build
+++ b/meson.build
@@ -294,8 +294,9 @@ subdir('mu')
# emacs -- needed for mu4e compilation
emacs_name=get_option('emacs')
emacs_min_version='26.3'
-emacs=find_program([emacs_name], version: '>='+emacs_min_version, required:false)
+emacs=find_program([emacs_name], version: '>=' + emacs_min_version, required:false)
if emacs.found()
+ emacs28 = find_program([emacs_name], version: '>=28', required:false)
subdir('man')
subdir('mu4e')
else
diff --git a/mu4e/meson.build b/mu4e/meson.build
index da3e2da..cfccce1 100644
--- a/mu4e/meson.build
+++ b/mu4e/meson.build
@@ -72,6 +72,13 @@ mu4e_srcs=[
'mu4e-window.el'
]
+# emacs 28 is guaranteed to have transient
+# not very elegant, but
+# https://stackoverflow.com/questions/49221792/byte-compile-file-only-when-library-is-found
+if emacs28.found()
+ mu4e_srcs += 'mu4e-transient.el'
+endif
+
# note, we cannot compile mu4e-config.el without incurring
# WARNING: Source item
# '[...]/build/mu4e/mu4e-meta.el' cannot be converted to File object, because
diff --git a/mu4e/mu4e-transient.el b/mu4e/mu4e-transient.el
new file mode 100644
index 0000000..8322674
--- /dev/null
+++ b/mu4e/mu4e-transient.el
@@ -0,0 +1,80 @@
+;;; mu4e-transient.el --- -*- coding: utf-8; lexical-binding: t -*-
+;;
+;; Copyright (C) 2025 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
+
+;;; Commentary:
+;;;
+;;; Define "transients" for some mu4e menus.
+
+;;; Code:
+(require 'mu4e)
+(require 'mu4e-bookmarks)
+(require 'mu4e-compose)
+(require 'mu4e-draft)
+
+(require 'transient)
+
+(transient-define-prefix mu4e-transient-menu-docs-links()
+ "Mu4e documentation menu."
+ [["Documentation"
+ ("A" "About mu4e" mu4e-about)
+ ("N" "News" mu4e-news)
+ ("I" "Ideas" mu4e-ideas)
+ ("H" "Manual" mu4e-display-manual)
+ ("o" "Online manual" (lambda () (interactive)
+ (browse-url "https://www.djcbsoftware.nl/code/mu/mu4e/")))]
+ ["Links"
+ ("h" "Mu homepage" (lambda () (interactive)
+ (browse-url "https://www.djcbsoftware.nl/code/mu/")))
+ ("m" "Mu4e homepage" (lambda () (interactive)
+ (browse-url "https://www.djcbsoftware.nl/code/mu/")))
+ ("r" "Mu repository" (lambda () (interactive)
+ (browse-url "https://github.com/djcb/mu/")))
+ ("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)
+ ("," "Message sexp" mu4e-sexp-at-point
+ :inapt-if-not (lambda () (mu4e-message-at-point 'nowarn)))
+ ("l" "Last query sexp" mu4e-analyze-last-query)]])
+
+(transient-define-prefix mu4e-transient-menu()
+ "Mu4e main menu."
+ [["Basics"
+ ("M" "Main menu" mu4e)
+ ("U" "Update mail" mu4e-update-mail-and-index)
+ (";" "Switch context" mu4e-context-switch
+ :inapt-if-nil mu4e-contexts)
+ ("M-q" "Quit mu4e" mu4e-quit)]
+ ["Search"
+ ("b" "Bookmark" mu4e-search-bookmark)
+ ("j" "Maildir" mu4e-search-maildir)
+ ("c" "Choose query" mu4e-search-query)
+ ("s" "Search" mu4e-search-query)]
+ ["Composition"
+ ("C" "New mail" mu4e-compose-new)]
+ ["" ;; 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))
+ ("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))))
+ ;; 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)]])
+
+(provide 'mu4e-transient)
+;;; mu4e-transient.el ends here