emacs: Allow '|' to operate on multiple messages (by means of prefix argument).

We extend the '|' command so that passing a prefix argument, (for
example, "C-u |"), causes it to pipe all open messages in the current
thread rather than just the single, current message.
This commit is contained in:
Carl Worth 2010-09-16 15:52:12 -07:00
parent 9f0accb6aa
commit 4e77148a4b

View file

@ -774,6 +774,22 @@ All currently available key bindings:
"Mark the current message as read." "Mark the current message as read."
(notmuch-show-remove-tag "unread")) (notmuch-show-remove-tag "unread"))
;; Functions for getting attributes of several messages in the current
;; thread.
(defun notmuch-show-get-message-ids-for-open-messages ()
"Return a list of all message IDs for open messages in the current thread."
(save-excursion
(let (message-ids done)
(goto-char (point-min))
(while (not done)
(if (notmuch-show-message-visible-p)
(setq message-ids (append message-ids (list (notmuch-show-get-message-id)))))
(setq done (not (notmuch-show-goto-message-next)))
)
message-ids
)))
;; Commands typically bound to keys. ;; Commands typically bound to keys.
(defun notmuch-show-advance-and-archive () (defun notmuch-show-advance-and-archive ()
@ -904,16 +920,27 @@ any effects from previous calls to
(interactive) (interactive)
(view-file (notmuch-show-get-filename))) (view-file (notmuch-show-get-filename)))
(defun notmuch-show-pipe-message (command) (defun notmuch-show-pipe-message (entire-thread command)
"Pipe the contents of the current message to the given command. "Pipe the contents of the current message (or thread) to the given command.
The given command will be executed with the raw contents of the The given command will be executed with the raw contents of the
current email message as stdin. Anything printed by the command current email message as stdin. Anything printed by the command
to stdout or stderr will appear in the *Messages* buffer." to stdout or stderr will appear in the *Messages* buffer.
(interactive "sPipe message to command: ")
(apply 'start-process-shell-command "notmuch-pipe-command" "*notmuch-pipe*" When invoked with a prefix argument, the command will receive all
(list command " < " open messages in the current thread (formatted as an mbox) rather
(shell-quote-argument (notmuch-show-get-filename))))) than only the current message."
(interactive "P\nsPipe message to command: ")
(let (shell-command)
(if entire-thread
(setq shell-command
(concat "notmuch show --format=mbox "
(shell-quote-argument
(mapconcat 'identity (notmuch-show-get-message-ids-for-open-messages) " OR "))
" | " command))
(setq shell-command
(concat command " < " (shell-quote-argument (notmuch-show-get-filename)))))
(start-process-shell-command "notmuch-pipe-command" "*notmuch-pipe*" shell-command)))
(defun notmuch-show-add-tag (&rest toadd) (defun notmuch-show-add-tag (&rest toadd)
"Add a tag to the current message." "Add a tag to the current message."