Emacs has an interface called compose-mail which uses whatever mailing mode that you’ve selected in mail-user-agent so if you like the message mode that’s been hard-coded into notmuch.el, (setq mail-user-agent 'message-user-agent) and this will use that. This version of the patch also tries to yank the body text, calling mail-citation-hook as it does so it works with mu-cite, supercite, trivialcite and so on. I guess I started yak-shaving a bit too much because I kinda began to reconstruct the output of notmuch reply via emacs lisp. I’ll send another e-mail with the patch for just compose-mail without the mail-citation-hook, too. These patches are mutually exclusive. I’m not used to git so I hope this is all right. Sandra Signed-off-by: Sandra Snan <sandra.snan@handgranat.org> --- emacs/notmuch.el | 66 +++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 53 insertions(+), 13 deletions(-) diff --git a/emacs/notmuch.el b/emacs/notmuch.el index 117a365..68e2d43 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -49,7 +49,7 @@ (require 'cl) (require 'mm-view) -(require 'message) +(require 'message) ; not sure if this is needed now (defvar notmuch-show-stash-map (let ((map (make-sparse-keymap))) @@ -76,7 +76,7 @@ (define-key map (kbd "M-TAB") 'notmuch-show-previous-button) (define-key map (kbd "TAB") 'notmuch-show-next-button) (define-key map "s" 'notmuch-search) - (define-key map "m" 'message-mail) + (define-key map "m" 'compose-mail) (define-key map "f" 'notmuch-show-forward-current) (define-key map "r" 'notmuch-show-reply) (define-key map "|" 'notmuch-show-pipe-message) @@ -435,16 +435,56 @@ buffer." mm-handle (> (notmuch-count-attachments mm-handle) 1)))) (message "Done")) -(defun notmuch-reply (query-string) - (switch-to-buffer (generate-new-buffer "notmuch-draft")) - (call-process notmuch-command nil t nil "reply" query-string) - (message-insert-signature) + +(defun jump-to-end-of-header () + (re-search-forward "^[^:]*.: \\|^$") + (beginning-of-line) + (backward-char) + (point)) + +(defun notmuch-regex-header (re) (goto-char (point-min)) - (if (re-search-forward "^$" nil t) - (progn - (insert "--text follows this line--") - (forward-line))) - (message-mode)) + (if (re-search-forward re nil t) + (buffer-substring-no-properties (point) (jump-to-end-of-header)) + "")) + +(defun notmuch-other-headers (al) + (beginning-of-line) + (if (eq (point-at-bol) (point-at-eol)) + al + (if (re-search-forward "^[^:]*.: \\|^$" nil t) + (notmuch-other-headers + (let ((header (buffer-substring-no-properties (point-at-bol) (- (point) 2))) + (header-value (buffer-substring-no-properties (point) (jump-to-end-of-header)))) + (forward-char) + (if (or (string= "To" header) (string= "Subject" header)) + al + (acons + header + header-value + al)))) + al))) + +(defun notmuch-reply (query-string) + (let ((body + (save-excursion + (let ((filename (notmuch-show-get-filename))) + (with-temp-buffer + (insert-file-contents filename) + (set-mark (point-max)) + (goto-char (point-min)) + (run-hooks 'mail-citation-hook) + (message-insert-signature) ;; FIXME is there a standard hook for signatures, too? + (buffer-substring (point-min) (point-max))))))) + (with-temp-buffer + (call-process notmuch-command nil t nil "reply" query-string) + (compose-mail + (notmuch-regex-header "^To: ") + (notmuch-regex-header "^Subject: ") + (progn (goto-char (point-min)) + (notmuch-other-headers '()))) + (goto-char (point-max)) + (insert body)))) (defun notmuch-show-reply () "Begin composing a reply to the current message in a new buffer." @@ -1229,7 +1269,7 @@ matching this search term are shown if non-nil. " (define-key map "p" 'notmuch-search-previous-thread) (define-key map "n" 'notmuch-search-next-thread) (define-key map "r" 'notmuch-search-reply-to-thread) - (define-key map "m" 'message-mail) + (define-key map "m" 'compose-mail) (define-key map "s" 'notmuch-search) (define-key map "o" 'notmuch-search-toggle-order) (define-key map "=" 'notmuch-search-refresh-view) @@ -1651,7 +1691,7 @@ current search results AND that are tagged with the given tag." (define-key map "?" 'notmuch-help) (define-key map "x" 'kill-this-buffer) (define-key map "q" 'kill-this-buffer) - (define-key map "m" 'message-mail) + (define-key map "m" 'compose-mail) (define-key map "e" 'notmuch-folder-show-empty-toggle) (define-key map ">" 'notmuch-folder-last) (define-key map "<" 'notmuch-folder-first) -- 1.7.0