From 7d831184b79e7c9f75b9eafa602b2124dafc2ae4 Mon Sep 17 00:00:00 2001 From: djcb Date: Wed, 26 Sep 2012 12:25:38 +0300 Subject: [PATCH] * mu4e: abstract access to the mu4e-message plist --- mu4e/Makefile.am | 1 + mu4e/mu4e-compose.el | 5 +- mu4e/mu4e-headers.el | 21 +++--- mu4e/mu4e-message.el | 164 +++++++++++++++++++++++++++++++++++++++++++ mu4e/mu4e-utils.el | 104 ++------------------------- mu4e/mu4e-view.el | 52 +++++++------- 6 files changed, 210 insertions(+), 137 deletions(-) create mode 100644 mu4e/mu4e-message.el diff --git a/mu4e/Makefile.am b/mu4e/Makefile.am index 36b205ac..14d7cea0 100644 --- a/mu4e/Makefile.am +++ b/mu4e/Makefile.am @@ -30,6 +30,7 @@ dist_lisp_LISP= \ mu4e-headers.el \ mu4e-main.el \ mu4e-mark.el \ + mu4e-message.el \ mu4e-meta.el \ mu4e-proc.el \ mu4e-speedbar.el \ diff --git a/mu4e/mu4e-compose.el b/mu4e/mu4e-compose.el index 1ae7b162..4fa3c989 100644 --- a/mu4e/mu4e-compose.el +++ b/mu4e/mu4e-compose.el @@ -99,7 +99,6 @@ forwarded or edited) in `mu4e-compose-pre-hook.") "message/rfc822" (or (plist-get mu4e-captured-message :subject) "No subject") "attachment"))) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun mu4e~compose-user-agent-construct () @@ -137,8 +136,8 @@ comma-separated string. Normally, this the concatenation of the existing References (which may be empty) and the message-id. If the message-id is empty, returns the old References. If both are empty, return nil." - (let ((refs (plist-get msg :references)) - (old-msgid (plist-get msg :message-id))) + (let ((refs (mu4e-message-field msg :references)) + (old-msgid (mu4e-message-field msg :message-id))) (when old-msgid (setq refs (append refs (list old-msgid))) (mapconcat diff --git a/mu4e/mu4e-headers.el b/mu4e/mu4e-headers.el index 5322881f..c6234b8b 100644 --- a/mu4e/mu4e-headers.el +++ b/mu4e/mu4e-headers.el @@ -39,6 +39,7 @@ (require 'mu4e-mark) (require 'mu4e-compose) (require 'mu4e-actions) +(require 'mu4e-message) ;; the headers view (defgroup mu4e-headers nil @@ -197,7 +198,7 @@ in the database. This function will update the current list of headers." (when (buffer-live-p mu4e~headers-buffer) (with-current-buffer mu4e~headers-buffer - (let* ((docid (plist-get msg :docid)) + (let* ((docid (mu4e-message-field msg :docid)) (point (mu4e~headers-docid-pos docid))) (when point ;; is the message present in this list? @@ -316,27 +317,27 @@ display may be different)." `mu4e-user-mail-address-regexp', show the To address; otherwise show the from address; prefixed with the appropriate `mu4e-headers-from-or-to-prefix'." - (let ((addr (cdr-safe (car-safe (plist-get msg :from))))) + (let ((addr (cdr-safe (car-safe (mu4e-message-field msg :from))))) (if (and addr (string-match mu4e-user-mail-address-regexp addr)) (concat (cdr mu4e-headers-from-or-to-prefix) - (mu4e~headers-contact-str (plist-get msg :to))) + (mu4e~headers-contact-str (mu4e-message-field msg :to))) (concat (car mu4e-headers-from-or-to-prefix) - (mu4e~headers-contact-str (plist-get msg :from)))))) + (mu4e~headers-contact-str (mu4e-message-field msg :from)))))) ;; note: this function is very performance-sensitive (defun mu4e~headers-header-handler (msg &optional point) "Create a one line description of MSG in this buffer, at POINT, if provided, or at the end of the buffer otherwise." - (let ((docid (plist-get msg :docid)) (line "")) + (let ((docid (mu4e-message-field msg :docid)) (line "")) (dolist (f-w mu4e-headers-fields) (let ((field (car f-w)) (width (cdr f-w)) - (val (plist-get msg (car f-w))) (str)) + (val (mu4e-message-field msg (car f-w))) (str)) (setq str (case field (:subject (concat ;; prefix subject with a thread indicator - (mu4e~headers-thread-prefix (plist-get msg :thread)) - ;; "["(plist-get (plist-get msg :thread) :path) "] " + (mu4e~headers-thread-prefix (mu4e-message-field msg :thread)) + ;; "["(plist-get (mu4e-message-field msg :thread) :path) "] " val)) ((:maildir :path) val) ((:to :from :cc :bcc) (mu4e~headers-contact-str val)) @@ -356,7 +357,7 @@ if provided, or at the end of the buffer otherwise." (truncate-string-to-width str width 0 ?\s t)) " "))))) ;; now, propertize it. (setq line (propertize line 'face - (case (car-safe (plist-get msg :flags)) + (case (car-safe (mu4e-message-field msg :flags)) ('draft 'mu4e-draft-face) ('trash 'mu4e-trashed-face) ((unread new) 'mu4e-unread-face) @@ -875,7 +876,7 @@ matching messages with that mark." (defun mu4e~headers-get-thread-info (msg what) "Get WHAT (a symbol, either path or thread-id) for MSG." - (let* ((thread (or (plist-get msg :thread) + (let* ((thread (or (mu4e-message-field msg :thread) (mu4e-error "No thread info found"))) (path (or (plist-get thread :path) (mu4e-error "No threadpath found")))) diff --git a/mu4e/mu4e-message.el b/mu4e/mu4e-message.el new file mode 100644 index 00000000..ad1365d7 --- /dev/null +++ b/mu4e/mu4e-message.el @@ -0,0 +1,164 @@ +;;; mu4e-message.el -- part of mu4e, the mu mail user agent +;; +;; Copyright (C) 2012 Dirk-Jan C. Binnema + +;; Author: Dirk-Jan C. Binnema +;; Maintainer: Dirk-Jan C. Binnema + +;; 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 . + +;;; Commentary: + +;; Functions to get data from mu4e-message plist structure + +;;; Code: +(eval-when-compile (byte-compile-disable-warning 'cl-functions)) +(require 'cl) +(require 'html2text) + + +(defcustom mu4e-html2text-command nil + "Shell command that converts HTML from stdin into plain text on +stdout. If this is not defined, the emacs `html2text' tool will be +used when faced with html-only message. If you use htmltext, it's +recommended you use \"html2text -utf8 -width 72\"." + :type 'string + :group 'mu4e-view + :safe 'stringp) + +(defcustom mu4e-view-prefer-html nil + "Whether to base the body display on the HTML-version of the +e-mail message (if there is any." + :type 'boolean + :group 'mu4e-view) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defsubst mu4e-message-field (msg field) + "Retrieve FIELD from message plist MSG. FIELD is one +of :from, :to, :cc, :bcc, :subject, :data, :message-id, :path, :maildir, +:priority, :attachments, :references, :in-reply-to, :body-txt, :body-html + +A message plist looks something like: +\(:docid 32461 + :from ((\"Nikola Tesla\" . \"niko@example.com\")) + :to ((\"Thomas Edison\" . \"tom@example.com\")) + :cc ((\"Rupert The Monkey\" . \"rupert@example.com\")) + :subject \"RE: what about the 50K?\" + :date (20369 17624 0) + :size 4337 + :message-id \"6BDC23465F79238C8233AB82D81EE81AF0114E4E74@123213.mail.example.com\" + :path \"/home/tom/Maildir/INBOX/cur/133443243973_1.10027.atlas:2,S\" + :maildir \"/INBOX\" + :priority normal + :flags (seen) + :attachments + ((:index 2 :name \"photo.jpg\" :mime-type \"image/jpeg\" :size 147331) + (:index 3 :name \"book.pdf\" :mime-type \"application/pdf\" :size 192220)) + :references (\"6BDC23465F79238C8384574032D81EE81AF0114E4E74@123213.mail.example.com\" + \"6BDC23465F79238203498230942D81EE81AF0114E4E74@123213.mail.example.com\") + :in-reply-to \"6BDC23465F79238203498230942D81EE81AF0114E4E74@123213.mail.example.com\" + :body-txt \"Hi Tom, ...\" +\)). +Some notes on the format: +- The address fields are lists of pairs (NAME . EMAIL), where NAME can be nil. +- The date is in format emacs uses in `current-time' +- Attachments are a list of elements with fields :index (the number of + the MIME-part), :name (the file name, if any), :mime-type (the + MIME-type, if any) and :size (the size in bytes, if any). +- Messages in the Headers view come from the database and do not have + :attachments. :body-txt or :body-html fields. Message in the + Message view use the actual message file, and do include these fields." + ;; after all this documentation, the spectacular implementation + (plist-get msg field)) + + + + + +(defun mu4e-message-for-each (msg field func) + "Call FUNC for each element in the field FIELD (which must be a +lists-type field). FUNC takes the element as its arg." + (let ((lst (mu4e-message-field msg field))) + (unless (listp lst) + (error "Not a list type")) + (dolist (elm (mu4e-message-field msg field)) + (funcall func elm)))) + +(defun mu4e-message-for-each-contact-field (msg field func) + "Call FUNC for each element of contact +FIELD (:to, :cc, :bcc, :from). FUNC takes two args, strings +name (possibly nil) and an email address." + (unless (member field '(:to :from :bcc :cc)) + (error "Not a contacts field")) + (mu4e-message-for-each msg field + (lambda (contact) + (funcall func (car contact) (cdr contact))))) + + +(defun mu4e-message-body-text (msg) + "Get the body in text form for this message, which is either :body-txt, +or if not available, :body-html converted to text. By default, it +uses the emacs built-in `html2text'. Alternatively, if +`mu4e-html2text-command' is non-nil, it will use that. Normally, +function prefers the text part, but this can be changed by setting +`mu4e-view-prefer-html'." + (let* ((txt (mu4e-message-field msg :body-txt)) + (html (mu4e-message-field msg :body-html)) + (body + (cond + ;; does it look like some text? ie., 10x the length of the text + ;; should be longer than the html, an heuristic to guard against + ;; 'This messages requires html' text bodies. + ((and (> (* 10 (length txt)) (length html)) + ;; use html if it's prefered, unless there is no html + (or (not mu4e-view-prefer-html) (not html))) + txt) + ;; otherwise, it there some html? + (html + (with-temp-buffer + (insert html) + ;; if defined, use the external tool + (if mu4e-html2text-command + (shell-command-on-region (point-min) (point-max) + mu4e-html2text-command nil t) + ;; otherwise... + (html2text)) + (buffer-string))) + (t ;; otherwise, an empty body + "")))) + ;; and finally, remove some crap from the remaining string; it seems + ;; esp. outlook lies about its encoding (ie., it says 'iso-8859-1' but + ;; really it's 'windows-1252'), thus giving us these funky chars. here, we + ;; either remove them, or replace with 'what-was-meant' (heuristically) + (with-temp-buffer + (insert body) + (goto-char (point-min)) + (while (re-search-forward "[  ’]" nil t) + (replace-match + (cond + ((string= (match-string 0) "’") "'") + (t "")))) + (buffer-string)))) + + + +(defsubst mu4e-message-part-field (msgpart field) + "Get some field in a message part; a part would look something like: + (:index 2 :name \"photo.jpg\" :mime-type \"image/jpeg\" :size 147331)." + (plist-get msgpart field)) + +(provide 'mu4e-message) diff --git a/mu4e/mu4e-utils.el b/mu4e/mu4e-utils.el index 420feef4..5cef9ff2 100644 --- a/mu4e/mu4e-utils.el +++ b/mu4e/mu4e-utils.el @@ -28,25 +28,11 @@ (eval-when-compile (byte-compile-disable-warning 'cl-functions)) (require 'cl) -(require 'html2text) +(require 'mu4e-message) (require 'mu4e-vars) (require 'mu4e-about) (require 'doc-view) -(defcustom mu4e-html2text-command nil - "Shell command that converts HTML from stdin into plain text on -stdout. If this is not defined, the emacs `html2text' tool will be -used when faced with html-only message. If you use htmltext, it's -recommended you use \"html2text -utf8 -width 72\"." - :type 'string - :group 'mu4e-view - :safe 'stringp) - -(defcustom mu4e-view-prefer-html nil - "Whether to base the body display on the HTML-version of the -e-mail message (if there is any." - :type 'boolean - :group 'mu4e-view) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -377,52 +363,8 @@ http://cr.yp.to/proto/maildir.html " (t (propertize "?" 'face 'mu4e-system-face)))) - -(defun mu4e-body-text (msg) - "Get the body in text form for this message, which is either :body-txt, -or if not available, :body-html converted to text. By default, it -uses the emacs built-in `html2text'. Alternatively, if -`mu4e-html2text-command' is non-nil, it will use that. Normally, -function prefers the text part, but this can be changed by setting -`mu4e-view-prefer-html'." - (let* ((txt (plist-get msg :body-txt)) - (html (plist-get msg :body-html)) - (body - (cond - ;; does it look like some text? ie., 10x the length of the text - ;; should be longer than the html, an heuristic to guard against - ;; 'This messages requires html' text bodies. - ((and (> (* 10 (length txt)) (length html)) - ;; use html if it's prefered, unless there is no html - (or (not mu4e-view-prefer-html) (not html))) - txt) - ;; otherwise, it there some html? - (html - (with-temp-buffer - (insert html) - ;; if defined, use the external tool - (if mu4e-html2text-command - (shell-command-on-region (point-min) (point-max) - mu4e-html2text-command nil t) - ;; otherwise... - (html2text)) - (buffer-string))) - (t ;; otherwise, an empty body - "")))) - ;; and finally, remove some crap from the remaining string; it seems - ;; esp. outlook lies about its encoding (ie., it says 'iso-8859-1' but - ;; really it's 'windows-1252'), thus giving us these funky chars. here, we - ;; either remove them, or replace with 'what-was-meant' (heuristically) - (with-temp-buffer - (insert body) - (goto-char (point-min)) - (while (re-search-forward "[  ’]" nil t) - (replace-match - (cond - ((string= (match-string 0) "’") "'") - (t "")))) - (buffer-string)))) - +(defalias 'mu4e-body-text 'mu4e-message-body-text) ;; backward compatibility + (defun mu4e-display-manual () "Display the mu4e manual page for the current mode, or go to the @@ -435,44 +377,8 @@ top level if there is none." (t "mu4e")))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defsubst mu4e-msg-field (msg field) - "Retrieve FIELD from message plist MSG. FIELD is one -of :from, :to, :cc, :bcc, :subject, :data, :message-id, :path, :maildir, -:priority, :attachments, :references, :in-reply-to, :body-txt, :body-html - -A message plist looks something like: -\(:docid 32461 - :from ((\"Nikola Tesla\" . \"niko@example.com\")) - :to ((\"Thomas Edison\" . \"tom@example.com\")) - :cc ((\"Rupert The Monkey\" . \"rupert@example.com\")) - :subject \"RE: what about the 50K?\" - :date (20369 17624 0) - :size 4337 - :message-id \"6BDC23465F79238C8233AB82D81EE81AF0114E4E74@123213.mail.example.com\" - :path \"/home/tom/Maildir/INBOX/cur/133443243973_1.10027.atlas:2,S\" - :maildir \"/INBOX\" - :priority normal - :flags (seen) - :attachments - ((:index 2 :name \"photo.jpg\" :mime-type \"image/jpeg\" :size 147331) - (:index 3 :name \"book.pdf\" :mime-type \"application/pdf\" :size 192220)) - :references (\"6BDC23465F79238C8384574032D81EE81AF0114E4E74@123213.mail.example.com\" - \"6BDC23465F79238203498230942D81EE81AF0114E4E74@123213.mail.example.com\") - :in-reply-to \"6BDC23465F79238203498230942D81EE81AF0114E4E74@123213.mail.example.com\" - :body-txt \"Hi Tom, ...\" -\)). -Some notes on the format: -- The address fields are lists of pairs (NAME . EMAIL), where NAME can be nil. -- The date is in format emacs uses in `current-time' -- Attachments are a list of elements with fields :index (the number of - the MIME-part), :name (the file name, if any), :mime-type (the - MIME-type, if any) and :size (the size in bytes, if any). -- Messages in the Headers view come from the database and do not have - :attachments. :body-txt or :body-html fields. Message in the - Message view use the actual message file, and do include these fields." - ;; after all this documentation, the spectacular implementation - (plist-get msg field)) - +(defalias 'mu4e-msg-field 'mu4e-message-field) ;; backward compatibility + (defun mu4e-message-at-point (&optional raise-err) "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 diff --git a/mu4e/mu4e-view.el b/mu4e/mu4e-view.el index 0b0d25a6..ce4a3ba0 100644 --- a/mu4e/mu4e-view.el +++ b/mu4e/mu4e-view.el @@ -32,6 +32,7 @@ (require 'mu4e-proc) (require 'mu4e-compose) (require 'mu4e-actions) +(require 'mu4e-message) (require 'longlines) (require 'comint) @@ -144,7 +145,7 @@ plist." (concat (mapconcat (lambda (field) - (let ((fieldval (plist-get msg field))) + (let ((fieldval (mu4e-message-field msg field))) (case field (:subject (mu4e~view-construct-header field fieldval)) (:path (mu4e~view-construct-header field fieldval)) @@ -159,7 +160,7 @@ plist." ;; if we (`user-mail-address' are the From, show To, otherwise, ;; show From (:from-or-to - (let* ((from (plist-get msg :from)) + (let* ((from (mu4e-message-field msg :from)) (from (and from (cdar from)))) (if (and from (string-match mu4e-user-mail-address-regexp from)) (mu4e~view-construct-contacts-header msg :to) @@ -180,7 +181,7 @@ plist." (t (mu4e-error "Unsupported field: %S" field))))) mu4e-view-fields "") "\n" - (mu4e-body-text msg) + (mu4e-message-body-text msg) ;; ;; decrypt maybe; depends on whether there are any such parts ;; ;; and the value of `mu4e-view-decrypt-parts' ;; (mu4e~decrypt-parts-maybe msg) @@ -204,7 +205,8 @@ REFRESH is for re-showing an already existing message. As a side-effect, a message that is being viewed loses its 'unread' marking if it still had that." (let* ((embedded ;; is it registered as an embedded msg? - (when (gethash (plist-get msg :path) mu4e~path-parent-docid-map) t)) + (when (gethash (mu4e-message-field msg :path) + mu4e~path-parent-docid-map) t)) (buf (if embedded (mu4e~view-embedded-winbuf) @@ -315,7 +317,7 @@ at POINT, or if nil, at (point)." (format "<%s>\n%s\n%s" email "[mouse-1] or [M-RET] to toggle long/short display" "[mouse-2] or C to compose a mail for this recipient")))) - (plist-get msg field) ", ") t)) + (mu4e-message-field msg field) ", ") t)) (defun mu4e~view-construct-flags-header (flags) @@ -331,10 +333,10 @@ at POINT, or if nil, at (point)." (defun mu4e~view-construct-signature-header (msg) "Construct a Signature: header, if there are any signed parts." - (let* ((parts (plist-get msg :parts)) + (let* ((parts (mu4e-message-field msg :parts)) (verdicts (remove-if 'null - (mapcar (lambda (part) (plist-get part :signature)) parts))) + (mapcar (lambda (part) (mu4e-message-part-field part :signature)) parts))) (val (when verdicts (mapconcat (lambda (v) @@ -379,21 +381,21 @@ at POINT, or if nil, at (point)." ;; user-visible numbers and the part indices (remove-if-not (lambda (part) - (let ((mtype (plist-get part :mime-type)) - (isattach (member 'attachment (plist-get part :type)))) + (let ((mtype (mu4e-message-part-field part :mime-type)) + (isattach (member 'attachment (mu4e-message-part-field part :type)))) (or ;; remove if it's not an attach *or* if it's an ;; image/audio/application type (but not a signature) isattach (string-match "^\\(image\\|audio\\)" mtype) (and (string-match "^application" mtype) (not (string-match "signature" mtype)))))) - (plist-get msg :parts))) + (mu4e-message-field msg :parts))) (attstr (mapconcat (lambda (part) - (let ((index (plist-get part :index)) - (name (plist-get part :name)) - (size (plist-get part :size)) + (let ((index (mu4e-message-part-field part :index)) + (name (mu4e-message-part-field part :name)) + (size (mu4e-message-part-field part :size)) (map (make-sparse-keymap))) (incf id) (puthash id index mu4e~view-attach-map) @@ -431,8 +433,8 @@ at POINT, or if nil, at (point)." ;; (let ((str "")) ;; (mu4e-view-for-each-part msg ;; (lambda (msg part) -;; (when (member 'encrypted (plist-get part :type)) -;; (let ((file (plist-get part :temp))) +;; (when (member 'encrypted (mu4e-message-part-field part :type)) +;; (let ((file (mu4e-message-part-field part :temp))) ;; (when (and file (file-exists-p file)) ;; ;; if our mu-server was build with crypto support, we only use EPA ;; ;; to push the password into gpg's memory @@ -730,8 +732,8 @@ browser is called is depending on `browse-url-browser-function' and (when (and (display-images-p) mu4e-show-images) (mu4e-view-for-each-part msg (lambda (msg part) - (when (string-match "^image/" (plist-get part :mime-type)) - (let ((imgfile (plist-get part :temp))) + (when (string-match "^image/" (mu4e-message-part-field part :mime-type)) + (let ((imgfile (mu4e-message-part-field part :temp))) (when (and imgfile (file-exists-p imgfile)) (save-excursion (goto-char (point-max)) @@ -893,8 +895,8 @@ number ATTNUM." (attach (find-if (lambda (part) - (eq (plist-get part :index) partid)) - (plist-get msg :parts)))) + (eq (mu4e-message-part-field part :index) partid)) + (mu4e-message-field msg :parts)))) (or attach (mu4e-error "Not a valid attachment")))) @@ -920,7 +922,7 @@ message-at-point if nil) to disk." (and (file-exists-p path) (not (y-or-n-p (mu4e-format "Overwrite '%s'?" path)))))) (mu4e~proc-extract - 'save (plist-get msg :docid) index path))) + 'save (mu4e-message-field msg :docid) index path))) (defun mu4e-view-save-attachment-multi (&optional msg) "Offer to save multiple email attachments from the current message. @@ -958,7 +960,7 @@ message-at-point if nil)." (mu4e~view-get-attach-num "Attachment to open" msg))) (att (or (mu4e~view-get-attach msg attnum))) (index (plist-get att :index)) - (docid (plist-get msg :docid)) + (docid (mu4e-message-field msg :docid)) (mimetype (plist-get att :mime-type))) (if (and mimetype (string= mimetype "message/rfc822")) ;; special handling for message-attachments; we open them in mu4e. we also @@ -990,7 +992,7 @@ user for it." (mu4e-format "Shell command to open it with: ") nil 'mu4e~view-open-with-hist))) (index (plist-get att :index))) - (mu4e~view-temp-action (plist-get msg :docid) index "open-with" cmd))) + (mu4e~view-temp-action (mu4e-message-field msg :docid) index "open-with" cmd))) (defvar mu4e~view-pipe-hist nil "History list for the pipe argument.") @@ -1006,7 +1008,7 @@ PIPECMD is nil, ask user for it." nil 'mu4e~view-pipe-hist))) (index (plist-get att :index))) - (mu4e~view-temp-action (plist-get msg :docid) index "pipe" pipecmd))) + (mu4e~view-temp-action (mu4e-message-field msg :docid) index "pipe" pipecmd))) (defun mu4e-view-open-attachment-emacs (msg attachnum) @@ -1014,7 +1016,7 @@ PIPECMD is nil, ask user for it." (interactive) (let* ((att (mu4e~view-get-attach msg attachnum)) (index (plist-get att :index))) - (mu4e~view-temp-action (plist-get msg :docid) index "emacs"))) + (mu4e~view-temp-action (mu4e-message-field msg :docid) index "emacs"))) (defun mu4e-view-attachment-action (&optional msg) @@ -1171,7 +1173,7 @@ the results." "Pop-up a little signature verification window for (optional) MSG or message-at-point." (interactive) - (let* ((path (if msg (plist-get msg :path) (mu4e-field-at-point :path))) + (let* ((path (if msg (mu4e-message-field msg :path) (mu4e-field-at-point :path))) (cmd (format "%s verify --verbose %s" mu4e-mu-binary (shell-quote-argument path)))