diff --git a/elisp/org-mu4e-compose.el b/elisp/org-mu4e-compose.el index 1922992..9aff8dc 100644 --- a/elisp/org-mu4e-compose.el +++ b/elisp/org-mu4e-compose.el @@ -36,6 +36,10 @@ does.") (symbol-function 'mu4e-compose-mode) "The `message-mode' (or derived mode) used by `org-mu4e-compose-mode'.") +(defvar org-mu4e--old-mail-user-agent nil + "Previous value of `mail-user-agent'. +Set by `org-mu4e-mode'.") + (defvar-local org-mu4e--preview-message-buffer nil "The message buffer that backs this preview buffer.") @@ -432,6 +436,12 @@ WIDE is the same as `mu4e-compose-reply'." (interactive "P") (org-mu4e-compose-reply-to nil wide)) +;;;###autoload +(defun org-mu4e-compose-wide-reply () + "`org-mu4e-compose-mode' version of `mu4e-compose-wide-reply'." + (interactive) + (org-mu4e-compose-reply-to nil t)) + ;;;###autoload (defun org-mu4e-compose-edit () "This is like `mu4e-compose-edit', but utilizes `org-mu4e-compose-mode'." @@ -439,6 +449,13 @@ WIDE is the same as `mu4e-compose-reply'." (org-mu4e--with-replaced-compse-func (mu4e-compose-edit))) +;;;###autoload +(defun org-mu4e-compose-forward () + "`org-mu4e-compose-mode' version of `mu4e-compose-forward'." + (interactive) + (org-mu4e--with-replaced-compse-func + (mu4e-compose-forward))) + ;;;###autoload (defvar-keymap org-mu4e-compose-mode-map :parent org-mode-map @@ -558,5 +575,91 @@ This is derived from `org-mode', but it also essentially runs "Return `org-mu4e-user-agent'." 'org-mu4e-user-agent) +;; ######################## +;; # Global override mode # +;; ######################## +(defun org-mu4e--make-override-keymap (parent) + "Create and return new override keymap for PARENT. +An override keymap is the same as PARENT except that it remaps certain mu4e +functions to their org-mu4e equivalents." + (let ((map (make-sparse-keymap))) + (set-keymap-parent map parent) + (define-key map [remap mu4e-compose-new] #'org-mu4e-compose-new) + (define-key map [remap mu4e-compose-forward] #'org-mu4e-compose-forward) + (define-key map [remap mu4e-compose-reply] #'org-mu4e-compose-reply) + (define-key map [remap mu4e-compose-reply-to] #'org-mu4e-compose-reply-to) + (define-key map [remap mu4e-compose-wide-reply] + #'org-mu4e-compose-wide-reply) + (define-key map [remap mu4e-compose-edit] #'org-mu4e-compose-edit) + map)) + +(define-minor-mode org-mu4e--main-override-mode + "Minor mode to replace key bindings in `mu4e-headers-mode'." + :interactive nil + :keymap (org-mu4e--make-override-keymap mu4e-main-mode-map)) + +(define-minor-mode org-mu4e--headers-override-mode + "Minor mode to replace key bindings in `mu4e-headers-mode'." + :interactive nil + :keymap (org-mu4e--make-override-keymap mu4e-headers-mode-map)) + +(define-minor-mode org-mu4e--view-override-mode + "Minor mode to replace key bindings in `mu4e-headers-mode'." + :interactive nil + :keymap (org-mu4e--make-override-keymap mu4e-view-mode-map)) + +(defun org-mu4e--enable-override-mode () + "Enable `org-mu4e-override-mode'." + (setq org-mu4e--old-mail-user-agent mail-user-agent) + (setopt mail-user-agent 'org-mu4e-user-agent) + (add-hook 'mu4e-main-mode-hook #'org-mu4e--main-override-mode) + (add-hook 'mu4e-headers-mode-hook #'org-mu4e--headers-override-mode) + (add-hook 'mu4e-view-mode-hook #'org-mu4e--view-override-mode) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (cond + ((derived-mode-p 'mu4e-main-mode) + (org-mu4e--main-override-mode)) + ((derived-mode-p 'mu4e-headers-mode) + (org-mu4e--headers-override-mode)) + ((derived-mode-p 'mu4e-view-mode) + (org-mu4e--view-override-mode)))))) + +(defun org-mu4e--disable-override-mode () + "Disable `org-mu4e-override-mode'." + (setopt mail-user-agent org-mu4e--old-mail-user-agent) + (remove-hook 'mu4e-main-mode-hook #'org-mu4e--main-override-mode) + (remove-hook 'mu4e-headers-mode-hook #'org-mu4e--headers-override-mode) + (remove-hook 'mu4e-view-mode-hoook #'org-mu4e--view-override-mode) + (dolist (buffer (buffer-list)) + (with-current-buffer buffer + (org-mu4e--main-override-mode -1) + (org-mu4e--headers-override-mode -1) + (org-mu4e--view-override-mode -1)))) + +;;;###autoload +(define-minor-mode org-mu4e-override-mode + "Minor mode to replace all mu4e commands with their org-mu4e variant. +This also sets `mail-user-agent'." + :global t + :group 'org-mu4e + (if org-mu4e-override-mode + (org-mu4e--enable-override-mode) + (org-mu4e--disable-override-mode))) + +;;;###autoload +(defun org-mu4e-install-evil-bindings () + "Convenience function to install useful evil keybindings for org-mu4e. +Note that this mutates some org-mu4e keymaps (but not any mu4e keymaps)." + (require 'evil) + (evil-define-key '(normal visual) org-mu4e-compose-mode-map + "G" #'mu4e-compose-goto-bottom + "gg" #'mu4e-compose-goto-top) + (evil-define-key 'normal org-mu4e-compose-mode-map + "ZZ" #'message-send-and-exit + "ZD" #'message-dont-send + "ZQ" #'message-kill-buffer + "ZF" #'mml-attach-file)) + (provide 'org-mu4e-compose) ;;; org-mu4e-compose.el ends here diff --git a/init.el b/init.el index 2b13c7a..6401647 100644 --- a/init.el +++ b/init.el @@ -3414,38 +3414,35 @@ This is the same as `evil-ret' except that it works for links in ;; mu4e compose HTML messages (use-package org-mime) (require 'org-mu4e-compose) -(setq mail-user-agent 'org-mu4e-user-agent - org-mime-org-html-with-latex-default 'dvisvgm - org-mime-export-options '(:with-latex dvisvgm :with-footnotes t)) -(evil-define-key '(normal visual) org-mu4e-compose-mode-map - "G" #'mu4e-compose-goto-bottom - "gg" #'mu4e-compose-goto-top) -(evil-define-key 'normal org-mu4e-compose-mode-map - "ZZ" #'message-send-and-exit - "ZD" #'message-dont-send - "ZQ" #'message-kill-buffer - "ZF" #'mml-attach-file) -(evil-define-key 'normal mu4e-view-mode-map - "R" #'org-mu4e-compose-reply - "cr" #'org-mu4e-compose-reply - "ce" #'org-mu4e-compose-edit - "C" #'org-mu4e-compose-new) -(evil-define-key 'normal mu4e-headers-mode-map - "R" #'org-mu4e-compose-reply - "cr" #'org-mu4e-compose-reply - "E" #'org-mu4e-compose-edit - "ce" #'org-mu4e-compose-edit - "C" #'org-mu4e-compose-new) -(evil-define-key 'normal mu4e-main-mode-map - "C" #'compose-mail - "cc" #'compose-mail) -(defun my/-setup-org-mu4e-compose-mode () - "Setup up stuff in `org-mu4e-compose' buffers." - (setq-local ltex-eglot-variable-save-method 'file) - ;; this should come last so it can pick up the above - ;; (my/eglot-if-trusted) - ) -(add-hook 'org-mu4e-compose-mode-hook #'my/-setup-org-mu4e-compose-mode) +(with-eval-after-load 'org-mu4e-compose + (org-mu4e-override-mode)) +(setq ;; mail-user-agent 'org-mu4e-user-agent + org-mime-org-html-with-latex-default 'dvisvgm + org-mime-export-options '(:with-latex dvisvgm :with-footnotes t)) +;; (evil-define-key '(normal visual) org-mu4e-compose-mode-map +;; "G" #'mu4e-compose-goto-bottom +;; "gg" #'mu4e-compose-goto-top) +;; (evil-define-key 'normal org-mu4e-compose-mode-map +;; "ZZ" #'message-send-and-exit +;; "ZD" #'message-dont-send +;; "ZQ" #'message-kill-buffer +;; "ZF" #'mml-attach-file) +;; (evil-define-key 'normal mu4e-view-mode-map +;; "R" #'org-mu4e-compose-reply +;; "cr" #'org-mu4e-compose-reply +;; "ce" #'org-mu4e-compose-edit +;; "C" #'org-mu4e-compose-new +;; "cc" #'org-mu4e-compose-new +;; "cw" #'org-mu4e-compose-wide-reply) +;; (evil-define-key 'normal mu4e-headers-mode-map +;; "R" #'org-mu4e-compose-reply +;; "cr" #'org-mu4e-compose-reply +;; "E" #'org-mu4e-compose-edit +;; "ce" #'org-mu4e-compose-edit +;; "C" #'org-mu4e-compose-new) +;; (evil-define-key 'normal mu4e-main-mode-map +;; "C" #'compose-mail +;; "cc" #'compose-mail) (setopt mu4e-compose-switch 'display-buffer) (defun my/-match-mu4e-message-buffer (buffer _action) "Matcher for mu4e message buffers for `display-buffer-alist'.