Respect switch-function in compose-mail.

Emacs has several standard keybindings

C-x m   compose-mail
C-x 4 m compose-mail-other-window
C-x 5 m compose-mail-other-frame

This patch fixes the creation of new mail buffers to respect the
latter two keybindings, C-x 4 m and C-x 5 m.

Note that there is already the variable mu4e-compose-in-new-frame
which if true opens in a new frame.  That will still work for C-x m
and C-x 5 m, but if the user runs C-x 4 m, it switches to other-window
as it assumes the keybinding takes precedence.  This behaviour can be
changed within mu4e~draft-open-file.
This commit is contained in:
Stephen J. Eglen
2021-04-03 22:23:21 +01:00
parent b63c3c990e
commit 5d859d005f
2 changed files with 17 additions and 12 deletions

View File

@ -676,7 +676,8 @@ See `mu4e-compose-crypto-policy' for more details."
(sign (mml-secure-message-sign)) (sign (mml-secure-message-sign))
(encrypt (mml-secure-message-encrypt))))) (encrypt (mml-secure-message-encrypt)))))
(cl-defun mu4e~compose-handler (compose-type &optional original-msg includes) (cl-defun mu4e~compose-handler (compose-type &optional original-msg includes
switch-function)
"Create a new draft message, or open an existing one. "Create a new draft message, or open an existing one.
COMPOSE-TYPE determines the kind of message to compose and is a COMPOSE-TYPE determines the kind of message to compose and is a
@ -710,7 +711,7 @@ tempfile)."
;; this opens (or re-opens) a messages with all the basic headers set. ;; this opens (or re-opens) a messages with all the basic headers set.
(let ((winconf (current-window-configuration))) (let ((winconf (current-window-configuration)))
(condition-case nil (condition-case nil
(mu4e-draft-open compose-type original-msg) (mu4e-draft-open compose-type original-msg switch-function)
(quit (set-window-configuration winconf) (quit (set-window-configuration winconf)
(mu4e-message "Operation aborted") (mu4e-message "Operation aborted")
(cl-return-from mu4e~compose-handler)))) (cl-return-from mu4e~compose-handler))))
@ -971,7 +972,7 @@ draft message."
;;;###autoload ;;;###autoload
(defun mu4e~compose-mail (&optional to subject other-headers _continue (defun mu4e~compose-mail (&optional to subject other-headers _continue
_switch-function yank-action _send-actions _return-action) switch-function yank-action _send-actions _return-action)
"This is mu4e's implementation of `compose-mail'. "This is mu4e's implementation of `compose-mail'.
Quoting its docstring: Quoting its docstring:
Start composing a mail message to send. Start composing a mail message to send.
@ -1009,7 +1010,7 @@ buffer buried."
;; create a new draft message 'resetting' (as below) is not actually needed in this case, but ;; create a new draft message 'resetting' (as below) is not actually needed in this case, but
;; let's prepare for the re-edit case as well ;; let's prepare for the re-edit case as well
(mu4e~compose-handler 'new) (mu4e~compose-handler 'new nil nil switch-function)
(when (message-goto-to) ;; reset to-address, if needed (when (message-goto-to) ;; reset to-address, if needed
(message-delete-line)) (message-delete-line))

View File

@ -523,11 +523,15 @@ will be the same as in the original."
"The drafts-folder for this compose buffer. "The drafts-folder for this compose buffer.
This is based on `mu4e-drafts-folder', which is evaluated once.") This is based on `mu4e-drafts-folder', which is evaluated once.")
(defun mu4e~draft-open-file (path) (defun mu4e~draft-open-file (path switch-function)
"Open the the draft file at PATH." "Open the the draft file at PATH."
(if mu4e-compose-in-new-frame (let ((buf (find-file-noselect path)))
(find-file-other-frame path) (funcall (or
(find-file path))) switch-function
(and mu4e-compose-in-new-frame 'switch-to-buffer-other-frame)
'switch-to-buffer)
buf)))
(defun mu4e~draft-determine-path (draft-dir) (defun mu4e~draft-determine-path (draft-dir)
"Determines the path for a new draft file in DRAFT-DIR." "Determines the path for a new draft file in DRAFT-DIR."
@ -535,7 +539,7 @@ This is based on `mu4e-drafts-folder', which is evaluated once.")
(mu4e-root-maildir) draft-dir (mu4e~draft-message-filename-construct "DS"))) (mu4e-root-maildir) draft-dir (mu4e~draft-message-filename-construct "DS")))
(defun mu4e-draft-open (compose-type &optional msg) (defun mu4e-draft-open (compose-type &optional msg switch-function)
"Open a draft file for a message MSG. "Open a draft file for a message MSG.
In case of a new message (when COMPOSE-TYPE is `reply', `forward' In case of a new message (when COMPOSE-TYPE is `reply', `forward'
or `new'), open an existing draft (when COMPOSE-TYPE is `edit'), or `new'), open an existing draft (when COMPOSE-TYPE is `edit'),
@ -555,7 +559,7 @@ will be created from either `mu4e~draft-reply-construct', or
;; full path, but we cannot really know 'drafts folder'... we make a ;; full path, but we cannot really know 'drafts folder'... we make a
;; guess ;; guess
(setq draft-dir (mu4e~guess-maildir (mu4e-message-field msg :path))) (setq draft-dir (mu4e~guess-maildir (mu4e-message-field msg :path)))
(mu4e~draft-open-file (mu4e-message-field msg :path))) (mu4e~draft-open-file (mu4e-message-field msg :path) switch-function))
(resend (resend
;; case-2: copy some exisisting message to a draft message, then edit ;; case-2: copy some exisisting message to a draft message, then edit
@ -563,7 +567,7 @@ will be created from either `mu4e~draft-reply-construct', or
(setq draft-dir (mu4e~guess-maildir (mu4e-message-field msg :path))) (setq draft-dir (mu4e~guess-maildir (mu4e-message-field msg :path)))
(let ((draft-path (mu4e~draft-determine-path draft-dir))) (let ((draft-path (mu4e~draft-determine-path draft-dir)))
(copy-file (mu4e-message-field msg :path) draft-path) (copy-file (mu4e-message-field msg :path) draft-path)
(mu4e~draft-open-file draft-path))) (mu4e~draft-open-file draft-path switch-function)))
((reply forward new) ((reply forward new)
;; case-3: creating a new message; in this case, we can determine ;; case-3: creating a new message; in this case, we can determine
@ -575,7 +579,7 @@ will be created from either `mu4e~draft-reply-construct', or
(reply (mu4e~draft-reply-construct msg)) (reply (mu4e~draft-reply-construct msg))
(forward (mu4e~draft-forward-construct msg)) (forward (mu4e~draft-forward-construct msg))
(new (mu4e~draft-newmsg-construct))))) (new (mu4e~draft-newmsg-construct)))))
(mu4e~draft-open-file draft-path) (mu4e~draft-open-file draft-path switch-function)
(insert initial-contents) (insert initial-contents)
(newline) (newline)
;; include the message signature (if it's set) ;; include the message signature (if it's set)