Following `notmuch-show-pipe-message', add a binding 'S' to save
either the current or all open messages, depending on prefix argument.
---
 emacs/notmuch-show.el | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 62c0be6..851e968 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -1285,6 +1285,7 @@ reset based on the original query."
     (define-key map "f" 'notmuch-show-forward-message)
     (define-key map "r" 'notmuch-show-reply-sender)
     (define-key map "R" 'notmuch-show-reply)
+    (define-key map "S" 'notmuch-show-save-message)
     (define-key map "|" 'notmuch-show-pipe-message)
     (define-key map "w" 'notmuch-show-save-attachments)
     (define-key map "V" 'notmuch-show-view-raw-message)
@@ -1769,6 +1770,24 @@ to show, nil otherwise."
     (set-buffer-modified-p nil)
     (view-buffer buf 'kill-buffer-if-not-modified)))

+(put 'notmuch-show-save-message 'notmuch-doc
+     "Save the contents of the current message to a file.")
+(put 'notmuch-show-save-message 'notmuch-prefix-doc
+     "Save the thread as an mbox to a file.")
+(defun notmuch-show-save-message (entire-thread file)
+  "Save the contents of the current message (or thread) to FILE.
+
+If ENTIRE-THREAD is non-nil (or when invoked with a prefix
+argument), FILE will contain all open messages in the current
+thread (formatted as an mbox) rather than only the current
+message."
+  (interactive (let ((prompt (if current-prefix-arg
+                                "Save all open messages to file: "
+                              "Save message to command: ")))
+                (list current-prefix-arg (read-file-name prompt))))
+
+  (notmuch-show-pipe-message-internal entire-thread (concat " > " file)))
+
 (put 'notmuch-show-pipe-message 'notmuch-doc
      "Pipe the contents of the current message to a command.")
 (put 'notmuch-show-pipe-message 'notmuch-prefix-doc
@@ -1789,6 +1808,9 @@ message."
                               "Pipe message to command: ")))
                 (list current-prefix-arg (read-string prompt))))

+  (notmuch-show-pipe-message-internal entire-thread (concat " | " command)))
+
+(defun notmuch-show-pipe-message-internal (entire-thread command-tail)
   (let ((shell-command
         (concat notmuch-command " show"
                 (if entire-thread
@@ -1796,7 +1818,7 @@ message."
                             (mapconcat #'shell-quote-argument 
(notmuch-show-get-message-ids-for-open-messages) " OR "))
                   (concat " --format=raw "
                           (shell-quote-argument 
(notmuch-show-get-message-id))))
-                " | " command))
+                command-tail))
        (cwd default-directory)
        (buf (get-buffer-create (concat "*notmuch-pipe*"))))
     (with-current-buffer buf
-- 
2.0.0.rc0

Reply via email to