emacs: Access raw messages via cat subcommand

This patch modifies the following commands to access the messages via
cat subcommand:
- view/save attachments ('v', 'w'),
- view a raw message ('V') and
- pipe a message to a command ('|').

With this patch, it is straightforward to use notmuch emacs interface
with a remote database accessed over SSH. To do this, it is sufficient
to redefine notmuch-command variable to contain the name of a script
containing:

    ssh user@host notmuch "$@"

If the ssh client has enabled connection sharing (ControlMaster option
in OpenSSH), the emacs interface is almost as responsive as when
notmuch is invoked locally.
This commit is contained in:
Michal Sojka 2010-10-22 11:28:04 +02:00 committed by Carl Worth
parent d39d0e55f0
commit fe9e163f19

View file

@ -85,10 +85,10 @@ any given message."
(defmacro with-current-notmuch-show-message (&rest body) (defmacro with-current-notmuch-show-message (&rest body)
"Evaluate body with current buffer set to the text of current message" "Evaluate body with current buffer set to the text of current message"
`(save-excursion `(save-excursion
(let ((filename (notmuch-show-get-filename))) (let ((id (notmuch-show-get-message-id)))
(let ((buf (generate-new-buffer (concat "*notmuch-msg-" filename "*")))) (let ((buf (generate-new-buffer (concat "*notmuch-msg-" id "*"))))
(with-current-buffer buf (with-current-buffer buf
(insert-file-contents filename nil nil nil t) (call-process notmuch-command nil t nil "cat" id)
,@body) ,@body)
(kill-buffer buf))))) (kill-buffer buf)))))
@ -917,7 +917,11 @@ any effects from previous calls to
(defun notmuch-show-view-raw-message () (defun notmuch-show-view-raw-message ()
"View the file holding the current message." "View the file holding the current message."
(interactive) (interactive)
(view-file (notmuch-show-get-filename))) (let ((id (notmuch-show-get-message-id)))
(let ((buf (get-buffer-create (concat "*notmuch-raw-" id "*"))))
(switch-to-buffer buf)
(save-excursion
(call-process notmuch-command nil t nil "cat" id)))))
(defun notmuch-show-pipe-message (entire-thread command) (defun notmuch-show-pipe-message (entire-thread command)
"Pipe the contents of the current message (or thread) to the given command. "Pipe the contents of the current message (or thread) to the given command.
@ -938,7 +942,7 @@ than only the current message."
(mapconcat 'identity (notmuch-show-get-message-ids-for-open-messages) " OR ")) (mapconcat 'identity (notmuch-show-get-message-ids-for-open-messages) " OR "))
" | " command)) " | " command))
(setq shell-command (setq shell-command
(concat command " < " (shell-quote-argument (notmuch-show-get-filename))))) (concat "notmuch cat " (shell-quote-argument (notmuch-show-get-message-id)) " | " command)))
(start-process-shell-command "notmuch-pipe-command" "*notmuch-pipe*" shell-command))) (start-process-shell-command "notmuch-pipe-command" "*notmuch-pipe*" shell-command)))
(defun notmuch-show-add-tags-worker (current-tags add-tags) (defun notmuch-show-add-tags-worker (current-tags add-tags)