* remove mu4e-raw-view, refactor processing attachments, messages through

pipes a bit. Document it.
This commit is contained in:
djcb
2012-04-18 19:10:48 +03:00
parent 9e58ff96ed
commit 54ce26cc11
5 changed files with 54 additions and 140 deletions

View File

@ -24,13 +24,12 @@ mu4e_TEXINFOS=fdl.texi
lispdir=${prefix}/share/emacs/site-lisp/mu4e/ lispdir=${prefix}/share/emacs/site-lisp/mu4e/
dist_lisp_LISP= \ dist_lisp_LISP= \
mu4e-utils.el \ mu4e-compose.el \
mu4e-hdrs.el \ mu4e-hdrs.el \
mu4e-main.el \ mu4e-main.el \
mu4e-proc.el \ mu4e-proc.el \
mu4e-raw-view.el \
mu4e-compose.el \
mu4e-speedbar.el \ mu4e-speedbar.el \
mu4e-utils.el \
mu4e-vars.el \ mu4e-vars.el \
mu4e-version.el \ mu4e-version.el \
mu4e-view.el \ mu4e-view.el \

View File

@ -1,110 +0,0 @@
;;; mu4e-raw-view.el -- part of mu4e, the mu mail user agent
;;
;; Copyright (C) 2011-2012 Dirk-Jan C. Binnema
;; Author: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
;; Maintainer: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
;; This file is not part of GNU Emacs.
;;
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; In this file we define mu4e-view-mode (+ helper functions), which is used for
;; viewing e-mail messages
;;; Code:
(eval-when-compile (require 'cl))
(require 'mu4e-utils) ;; utility functions
;; raw mode ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; some buffer-local variables
(defconst mu4e-raw-view-buffer-name "*mu4e-raw-view*"
"*internal* Name for the raw message view buffer")
(defvar mu4e-raw-view-buffer nil "*internal* The raw view buffer.")
(defvar mu4e-raw-view-mode-map nil
"Keymap for \"*mu4e-raw-view*\" buffers.")
(unless mu4e-raw-view-mode-map
(setq mu4e-raw-view-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "q" 'mu4e-raw-view-quit-buffer)
(define-key map "." 'mu4e-raw-view-quit-buffer)
;; intra-message navigation
(define-key map (kbd "SPC") 'scroll-up)
(define-key map (kbd "<home>")
'(lambda () (interactive) (goto-char (point-min))))
(define-key map (kbd "<end>")
'(lambda () (interactive) (goto-char (point-max))))
(define-key map (kbd "RET")
'(lambda () (interactive) (scroll-up 1)))
(define-key map (kbd "<backspace>")
'(lambda () (interactive) (scroll-up -1)))
map)))
(fset 'mu4e-raw-view-mode-map mu4e-raw-view-mode-map)
(define-derived-mode mu4e-raw-view-mode special-mode
"mu4e:raw"
"Major mode for viewing of raw e-mail message in mu4e.
\\{mu4e-raw-view-mode-map}.")
(defun mu4e-raw-view-message (msg view-buffer)
"Display the raw contents of message MSG in a new buffer."
(let ((buf (get-buffer-create mu4e-raw-view-buffer-name))
(inhibit-read-only t)
(file (plist-get msg :path)))
(unless (and file (file-readable-p file))
(error "Not a readable file: %S" file))
(with-current-buffer buf
(erase-buffer)
(insert-file-contents file)
;; initialize view-mode
(mu4e-raw-view-mode)
(setq mu4e-raw-view-buffer view-buffer)
(switch-to-buffer buf)
(goto-char (point-min)))))
(defun mu4e-view-shell-command-on-raw-message (msg view-buffer cmd)
"Process the raw message with shell command CMD."
(let ((buf (get-buffer-create mu4e-raw-view-buffer-name))
(inhibit-read-only t)
(file (plist-get msg :path)))
(unless (and file (file-readable-p file))
(error "Not a readable file: %S" file))
(with-current-buffer buf
(erase-buffer)
(process-file-shell-command cmd file buf)
(mu4e-raw-view-mode)
(setq mu4e-raw-view-buffer view-buffer)
(switch-to-buffer buf)
(goto-char (point-min)))))
(defun mu4e-raw-view-quit-buffer ()
"Quit the raw view and return to the message."
(interactive)
(kill-buffer))
(provide 'mu4e-raw-view)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

View File

@ -372,28 +372,31 @@ of mu4e and emacs."
(or mu4e-user-agent (or mu4e-user-agent
(format "mu4e %s; emacs %s" mu4e-mu-version emacs-version))) (format "mu4e %s; emacs %s" mu4e-mu-version emacs-version)))
(defun mu4e-message-at-point (&optional raise-err) (defun mu4e-message-at-point (&optional raise-err)
"Get the message s-expression for the message at point in either "Get the message s-expression for the message at point in either
the headers buffer or the view buffer, or nil if there is no such
message. If optional RAISE-ERR is non-nil, raise an error when
there is no message at point." there is no message at point."
(let ((msg (let ((msg
(cond (cond
((eq major-mode 'mu4e-hdrs-mode) ((eq major-mode 'mu4e-hdrs-mode)
(get-text-property (point) 'msg)) (get-text-property (point) 'msg))
((eq major-mode 'mu4e-view-mode) ((eq major-mode 'mu4e-view-mode)
mu4e-current-msg)))) mu4e-current-msg))))
(unless msg (error "No message at point")) (if (and (null msg) raise-err)
(error "No message at point")
msg))) msg)))
(defun mu4e-field-at-point (field) (defun mu4e-field-at-point (field)
"Get FIELD (a symbol, see `mu4e-header-names') for the message at "Get FIELD (a symbol, see `mu4e-header-names') for the message at
point in eiter the headers buffer or the view buffer." point in eiter the headers buffer or the view buffer."
(plist-get (mu4e-message-at-point t) field)) (plist-get (mu4e-message-at-point t) field))
(defun mu4e-capture-message () (defun mu4e-capture-message ()
"Capture the path of the message at point." "Capture the path of the message at point."
(interactive) (interactive)
(setq mu4e-captured-message (mu4e-message-at-point)) (setq mu4e-captured-message (mu4e-message-at-point t))
(message "Message has been captured")) (message "Message has been captured"))
(defun mu4e-kill-buffer-and-window (buf) (defun mu4e-kill-buffer-and-window (buf)
@ -421,6 +424,18 @@ that has a live window), and vice versa."
(select-window other-win) (select-window other-win)
(message "No window to switch to")))) (message "No window to switch to"))))
(defconst mu4e-output-buffer-name "*mu4e-output"
"*internal* Name of the mu4e output buffer.")
(defun mu4e-process-file-through-pipe (path pipecmd)
"Process file at PATH through a pipe with PIPECMD."
(let ((buf (get-buffer-create mu4e-output-buffer-name)))
(with-current-buffer buf
(let ((inhibit-read-only t))
(erase-buffer)
(call-process-shell-command pipecmd path t t)
(view-mode)))
(switch-to-buffer buf))) (switch-to-buffer buf)))

View File

@ -28,7 +28,6 @@
;;; Code: ;;; Code:
(require 'mu4e-utils) ;; utility functions (require 'mu4e-utils) ;; utility functions
(require 'mu4e-vars) (require 'mu4e-vars)
(require 'mu4e-raw-view)
;; we prefer the improved fill-region ;; we prefer the improved fill-region
(require 'filladapt nil 'noerror) (require 'filladapt nil 'noerror)
@ -38,6 +37,9 @@
(defvar mu4e-hdrs-buffer nil (defvar mu4e-hdrs-buffer nil
"*internal* Headers buffer connected to this view.") "*internal* Headers buffer connected to this view.")
(defconst mu4e-view-raw-buffer-name "*mu4e-raw-view*"
"*internal* Name for the raw message view buffer")
(defun mu4e-view-message-with-msgid (msgid) (defun mu4e-view-message-with-msgid (msgid)
"View message with MSGID. This is meant for external programs "View message with MSGID. This is meant for external programs
wanting to show specific messages - for example, `mu4e-org'." wanting to show specific messages - for example, `mu4e-org'."
@ -245,7 +247,7 @@ is nil, and otherwise open it."
(define-key map "C" 'mu4e-compose-new) (define-key map "C" 'mu4e-compose-new)
(define-key map "E" 'mu4e-compose-edit) (define-key map "E" 'mu4e-compose-edit)
(define-key map "." 'mu4e-raw-view) (define-key map "." 'mu4e-view-raw-message)
(define-key map "|" 'mu4e-view-pipe) (define-key map "|" 'mu4e-view-pipe)
;; (define-key map "I" 'mu4e-inspect-message) ;; (define-key map "I" 'mu4e-inspect-message)
@ -682,6 +684,7 @@ ACTION."
(?e (call-interactively 'mu4e-view-open-attachment-emacs)) (?e (call-interactively 'mu4e-view-open-attachment-emacs))
(otherwise (message "Not yet implemented"))))) (otherwise (message "Not yet implemented")))))
;; handler-function to handle the response we get from the server when we ;; handler-function to handle the response we get from the server when we
;; want to do something with one of the attachments. ;; want to do something with one of the attachments.
(defun mu4e-view-temp-handler (path what param) (defun mu4e-view-temp-handler (path what param)
@ -694,17 +697,12 @@ attachments) in response to a (mu4e-proc-extract 'temp ... )."
(concat param " " path))) (concat param " " path)))
((string= what "pipe") ((string= what "pipe")
;; 'param' will be the pipe command, path the infile for this ;; 'param' will be the pipe command, path the infile for this
(let ((inhibit-read-only t)) (mu4e-process-file-through-pipe path param))
(switch-to-buffer (get-buffer-create "*mu4e-output*"))
(erase-buffer)
(call-process-shell-command param path t t)
(view-mode)))
((string= what "emacs") ((string= what "emacs")
(find-file path) (find-file path)
;; make the buffer read-only since it usually does not make ;; make the buffer read-only since it usually does not make
;; sense to edit the temp buffer; use C-x C-q if you insist... ;; sense to edit the temp buffer; use C-x C-q if you insist...
(setq buffer-read-only t) (setq buffer-read-only t))
)
(t (error "Unsupported action %S" what)))) (t (error "Unsupported action %S" what))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -743,20 +741,28 @@ that execution can only take place in n the header list."
(unless url (error "Invalid number for URL")) (unless url (error "Invalid number for URL"))
(browse-url url))) (browse-url url)))
(defun mu4e-raw-view () (defun mu4e-view-raw-message ()
"Show the the raw text of the current message." "Display the raw contents of message at point in a new buffer."
(interactive) (interactive)
(unless mu4e-current-msg (let ((path (mu4e-field-at-point :path))
(error "No current message")) (buf (get-buffer-create mu4e-view-raw-buffer-name)))
(mu4e-raw-view-message mu4e-current-msg (current-buffer))) (unless (and path (file-readable-p path))
(error "Not a readable file: %S" path))
(with-current-buffer buf
(let ((inhibit-read-only t))
(erase-buffer)
(insert-file-contents path)
(view-mode)
(goto-char (point-min))))
(switch-to-buffer buf)))
(defun mu4e-view-pipe (cmd) (defun mu4e-view-pipe (cmd)
"Pipe the message through shell command CMD, and display the "Pipe the message through shell command CMD, and display the
results." results."
(interactive "sShell command: ") (interactive "sShell command: ")
(unless mu4e-current-msg (let ((path (mu4e-field-at-point :path)))
(error "No current message")) (mu4e-process-file-through-pipe path cmd)))
(mu4e-view-shell-command-on-raw-message mu4e-current-msg
(current-buffer) cmd))
(provide 'mu4e-view) (provide 'mu4e-view)

View File

@ -535,6 +535,8 @@ u unmark message at point
R,F,C reply/forward/compose R,F,C reply/forward/compose
E edit (only allowed for draft messages) E edit (only allowed for draft messages)
| pipe message through shell command
d mark for moving to the trash folder d mark for moving to the trash folder
DEL,D mark for immediate deletion DEL,D mark for immediate deletion
m mark for moving to another maildir folder m mark for moving to another maildir folder
@ -544,6 +546,7 @@ u unmark message at point
U unmark *all* messages U unmark *all* messages
x execute actions for the marked messages x execute actions for the marked messages
RET open the message at point in the message view RET open the message at point in the message view
H get help H get help
q,z leave the headers buffer q,z leave the headers buffer
@end verbatim @end verbatim
@ -666,7 +669,7 @@ u unmark message at point
R,F,C reply/forward/compose R,F,C reply/forward/compose
E edit (only allowed for draft messages) E edit (only allowed for draft messages)
. show the raw message view. ./q take you back . show the raw message view. 'q' takes you back.
g go to (visit) numbered URL (using `browse-url') g go to (visit) numbered URL (using `browse-url')
(or: <mouse-2> or RET with point on url) (or: <mouse-2> or RET with point on url)
@ -708,7 +711,8 @@ choose from a list with some more actions to perform on attachments:
@itemize @itemize
@item @t{open-with} (@key{w}): open the attachment with some arbitrary @item @t{open-with} (@key{w}): open the attachment with some arbitrary
program. For example, suppose you have received a message with a picture program. For example, suppose you have received a message with a picture
attachment; then, @t{a w 1 RET gimp RET} will open that attachment in The Gimp. attachment; then, @t{a w 1 RET gimp RET} will open that attachment in The
Gimp.
@item @t{pipe} (@key{|}: process the attachment with some Unix shell-pipe and @item @t{pipe} (@key{|}: process the attachment with some Unix shell-pipe and
see the results. Suppose you receive a patch file, and would like to get an see the results. Suppose you receive a patch file, and would like to get an
overview of the changes, using the @t{diffstat} program. You can use something overview of the changes, using the @t{diffstat} program. You can use something