You may want to customize `message-kill-buffer-on-exit'
accordingly."
(when (< emacs-major-version 24)
- " Due to a known bug in Emacs 23, you should not set
+ " 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 '(repeat string)
:group 'notmuch-send)
+(defgroup notmuch-reply nil
+ "Replying to messages in notmuch"
+ :group 'notmuch)
+
+(defcustom notmuch-mua-cite-function 'message-cite-original
+ "*Function for citing an original message.
+Predefined functions include `message-cite-original' and
+`message-cite-original-without-signature'.
+Note that these functions use `mail-citation-hook' if that is non-nil."
+ :type '(radio (function-item message-cite-original)
+ (function-item message-cite-original-without-signature)
+ (function-item sc-cite-original)
+ (function :tag "Other"))
+ :link '(custom-manual "(message)Insertion Variables")
+ :group 'notmuch-reply)
+
;;
(defun notmuch-mua-get-switch-function ()
(defun notmuch-mua-user-agent-notmuch ()
"Generate a `User-Agent:' string suitable for notmuch."
- (concat "Notmuch/" (notmuch-version) " (http://notmuchmail.org)"))
+ (let ((notmuch-version (if (string= notmuch-emacs-version "unknown")
+ (notmuch-cli-version)
+ notmuch-emacs-version)))
+ (concat "Notmuch/" notmuch-version " (http://notmuchmail.org)")))
(defun notmuch-mua-user-agent-emacs ()
"Generate a `User-Agent:' string suitable for notmuch."
notmuch-mua-hidden-headers))
(defun notmuch-mua-reply-crypto (parts)
+ "Add mml sign-encrypt flag if any part of original message is encrypted."
(loop for part in parts
- if (notmuch-match-content-type (plist-get part :content-type) "multipart/signed")
- do (mml-secure-message-sign)
- else if (notmuch-match-content-type (plist-get part :content-type) "multipart/encrypted")
+ if (notmuch-match-content-type (plist-get part :content-type) "multipart/encrypted")
do (mml-secure-message-sign-encrypt)
else if (notmuch-match-content-type (plist-get part :content-type) "multipart/*")
do (notmuch-mua-reply-crypto (plist-get part :content))))
(date (plist-get original-headers :Date))
(start (point)))
- ;; message-cite-original constructs a citation line based on the From and Date
- ;; headers of the original message, which are assumed to be in the buffer.
+ ;; notmuch-mua-cite-function constructs a citation line based
+ ;; on the From and Date headers of the original message, which
+ ;; are assumed to be in the buffer.
(insert "From: " from "\n")
(insert "Date: " date "\n\n")
(set-mark (point))
(goto-char start)
;; Quote the original message according to the user's configured style.
- (message-cite-original)))
+ (funcall notmuch-mua-cite-function)))
- ;; Sign and/or encrypt replies to signed and/or encrypted messages.
+ ;; Crypto processing based crypto content of the original message
(when process-crypto
(notmuch-mua-reply-crypto (plist-get original :body))))
(message-goto-body)
(set-buffer-modified-p nil))
-(defun notmuch-mua-mail (&optional to subject other-headers &rest other-args)
- "Invoke the notmuch mail composition window.
-
-OTHER-ARGS are passed through to `message-mail'."
+(define-derived-mode notmuch-message-mode message-mode "Message[Notmuch]"
+ "Notmuch message composition mode. Mostly like `message-mode'"
+ (when notmuch-address-command
+ (notmuch-address-setup)))
+
+(put 'notmuch-message-mode 'flyspell-mode-predicate 'mail-mode-flyspell-verify)
+
+(define-key notmuch-message-mode-map (kbd "C-c C-c") #'notmuch-mua-send-and-exit)
+(define-key notmuch-message-mode-map (kbd "C-c C-s") #'notmuch-mua-send)
+
+(defun notmuch-mua-pop-to-buffer (name)
+ "Pop to buffer NAME, and warn if it already exists and is
+modified. This function is notmuch addaptation of
+`message-pop-to-buffer'."
+ (let ((buffer (get-buffer name)))
+ (if (and buffer
+ (buffer-name buffer))
+ (let ((window (get-buffer-window buffer 0)))
+ (if window
+ ;; Raise the frame already displaying the message buffer.
+ (progn
+ (gnus-select-frame-set-input-focus (window-frame window))
+ (select-window window))
+ (funcall (notmuch-mua-get-switch-function) buffer)
+ (set-buffer buffer))
+ (when (and (buffer-modified-p)
+ (not (prog1
+ (y-or-n-p
+ "Message already being composed; erase? ")
+ (message nil))))
+ (error "Message being composed")))
+ (funcall (notmuch-mua-get-switch-function) name)
+ (set-buffer name))
+ (erase-buffer)
+ (notmuch-message-mode)))
+
+(defun notmuch-mua-mail (&optional to subject other-headers continue
+ switch-function yank-action send-actions
+ return-action &rest ignored)
+ "Invoke the notmuch mail composition window."
(interactive)
(when notmuch-mua-user-agent-function
(push (cons 'From (concat
(notmuch-user-name) " <" (notmuch-user-primary-email) ">")) other-headers))
- (apply #'message-mail to subject other-headers other-args)
+ (notmuch-mua-pop-to-buffer (message-buffer-name "mail" to))
+ (let ((headers
+ ;; The following sexp is copied from `message-mail'
+ (nconc
+ `((To . ,(or to "")) (Subject . ,(or subject "")))
+ ;; C-h f compose-mail says that headers should be specified as
+ ;; (string . value); however all the rest of message expects
+ ;; headers to be symbols, not strings (eg message-header-format-alist).
+ ;; http://lists.gnu.org/archive/html/emacs-devel/2011-01/msg00337.html
+ ;; We need to convert any string input, eg from rmail-start-mail.
+ (dolist (h other-headers other-headers)
+ (if (stringp (car h)) (setcar h (intern (capitalize (car h))))))))
+ (args (list yank-action send-actions)))
+ ;; message-setup-1 in Emacs 23 does not accept return-action
+ ;; argument. Pass it only if it is supplied by the caller. This
+ ;; will never be the case when we're called by `compose-mail' in
+ ;; Emacs 23.
+ (when return-action (nconc args '(return-action)))
+ (apply 'message-setup-1 headers args))
+ (notmuch-fcc-header-setup)
(message-sort-headers)
(message-hide-headers)
(set-buffer-modified-p nil)
(message-forward-make-body cur)
;; `message-forward-make-body' shows the User-agent header. Hide
;; it again.
- (message-hide-headers)))
+ (message-hide-headers)
+ (set-buffer-modified-p nil)))
(defun notmuch-mua-new-reply (query-string &optional prompt-for-sender reply-all)
"Compose a reply to the message identified by QUERY-STRING.
(defun notmuch-mua-send-and-exit (&optional arg)
(interactive "P")
- (message-send-and-exit arg))
+ (let ((message-fcc-handler-function #'notmuch-fcc-handler))
+ (message-send-and-exit arg)))
+
+(defun notmuch-mua-send (&optional arg)
+ (interactive "P")
+ (let ((message-fcc-handler-function #'notmuch-fcc-handler))
+ (message-send arg)))
(defun notmuch-mua-kill-buffer ()
(interactive)