[PATCH v6] emacs: Let the user choose where to compose new mails

Subject: [PATCH v6] emacs: Let the user choose where to compose new mails

Date: Fri, 4 May 2012 12:37:56 +0200

To: notmuch@notmuchmail.org


From: Thomas Jost

Introduce a new defcustom notmuch-mua-compose-in that allows users to
specify where new mails are composed, either in the current window or
in a new window or frame.

Signed-off-by: Jameson Rollins <jrollins@finestructure.net>
Hi David et al.,

Here it is again, with a warning in the customize message that only
appears in Emacs 23. The indentation is a little bit of a mess but
that's needed for the docstring to look good :)

(If you want I can remove the test and also display the Emacs 23
warning in Emacs 24.)

Does it look good to you? I'm not comfortable with writing docs in
English, so feel free to rephrase it if needed.

I also moved notmuch-mua-compose-in to the 'notmuch-send group, just
as other notmuch-mua-* variables.


 emacs/notmuch-mua.el |   45 +++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 43 insertions(+), 2 deletions(-)

diff --git a/emacs/notmuch-mua.el b/emacs/notmuch-mua.el
index 87bd88d..641dae7 100644
--- a/emacs/notmuch-mua.el
+++ b/emacs/notmuch-mua.el
@@ -36,6 +36,26 @@
   :group 'notmuch-send
   :group 'notmuch-hooks)

+(defcustom notmuch-mua-compose-in 'current-window
+  (concat
+   "Where to create the mail buffer used to compose a new message.
+Possible values are `current-window' (default), `new-window' and
+`new-frame'. If set to `current-window', the mail buffer will be
+displayed in the current window, so the old buffer will be
+restored when the mail buffer is killed. If set to `new-window'
+or `new-frame', the mail buffer will be displayed in a new
+window/frame that will be destroyed when the buffer is killed.
+You may want to customize `message-kill-buffer-on-exit'
+   (when (< emacs-major-version 24)
+           " Due to a known bug in Emacs 23, you should not set
+this to `new-window' if `message-kill-buffer-on-exit' is
+disabled: this would result in an incorrect behavior."))
+  :group 'notmuch-send
+  :type '(choice (const :tag "Compose in the current window" current-window)
+		 (const :tag "Compose mail in a new window"  new-window)
+		 (const :tag "Compose mail in a new frame"   new-frame)))
 (defcustom notmuch-mua-user-agent-function 'notmuch-mua-user-agent-full
   "Function used to generate a `User-Agent:' string. If this is
 `nil' then no `User-Agent:' will be generated."
@@ -55,6 +75,23 @@ list."


+(defun notmuch-mua-get-switch-function ()
+  "Get a switch function according to `notmuch-mua-compose-in'."
+  (cond ((eq notmuch-mua-compose-in 'current-window)
+	 'switch-to-buffer)
+	((eq notmuch-mua-compose-in 'new-window)
+	 'switch-to-buffer-other-window)
+	((eq notmuch-mua-compose-in 'new-frame)
+	 'switch-to-buffer-other-frame)
+	(t (error "Invalid value for `notmuch-mua-compose-in'"))))
+(defun notmuch-mua-maybe-set-window-dedicated ()
+  "Set the selected window as dedicated according to
+  (when (or (eq notmuch-mua-compose-in 'new-frame)
+	    (eq notmuch-mua-compose-in 'new-window))
+    (set-window-dedicated-p (selected-window) t)))
 (defun notmuch-mua-user-agent-full ()
   "Generate a `User-Agent:' string suitable for notmuch."
   (concat (notmuch-mua-user-agent-notmuch)
@@ -148,7 +185,8 @@ list."
 		     collect pair)))
 	  (notmuch-mua-mail (plist-get reply-headers :To)
 			    (plist-get reply-headers :Subject)
-			    (notmuch-headers-plist-to-alist reply-headers))))
+			    (notmuch-headers-plist-to-alist reply-headers)
+			    nil (notmuch-mua-get-switch-function))))

       ;; Insert the message body - but put it in front of the signature
       ;; if one is present
@@ -186,6 +224,7 @@ list."
   (set-buffer-modified-p nil))

 (defun notmuch-mua-forward-message ()
+  (funcall (notmuch-mua-get-switch-function) (current-buffer))

   (when notmuch-mua-user-agent-function
@@ -195,6 +234,7 @@ list."
   (set-buffer-modified-p nil)
+  (notmuch-mua-maybe-set-window-dedicated)


@@ -217,6 +257,7 @@ OTHER-ARGS are passed through to `message-mail'."
   (set-buffer-modified-p nil)
+  (notmuch-mua-maybe-set-window-dedicated)


@@ -273,7 +314,7 @@ the From: address first."
   (let ((other-headers
 	 (when (or prompt-for-sender notmuch-always-prompt-for-sender)
 	   (list (cons 'From (notmuch-mua-prompt-for-sender))))))
-    (notmuch-mua-mail nil nil other-headers)))
+    (notmuch-mua-mail nil nil other-headers nil (notmuch-mua-get-switch-function))))

 (defun notmuch-mua-new-forward-message (&optional prompt-for-sender)
   "Invoke the notmuch message forwarding window.