(defun notmuch-show-view-part (message-id nth &optional filename content-type )
(notmuch-with-temp-part-buffer message-id nth
- ;; set mm-inlined-types to nil to force an external viewer
- (let ((handle (mm-make-handle (current-buffer) (list content-type)))
- (mm-inlined-types nil))
- ;; We override mm-save-part as notmuch-show-save-part is better
- ;; since it offers the filename. We need to lexically bind
- ;; everything we need for notmuch-show-save-part to prevent
- ;; potential dynamic shadowing.
- (lexical-let ((message-id message-id)
- (nth nth)
- (filename filename)
- (content-type content-type))
- (flet ((mm-save-part (&rest args) (notmuch-show-save-part
- message-id nth filename content-type)))
- (mm-display-part handle))))))
+ (let* ((disposition (if filename `(attachment (filename . ,filename))))
+ (handle (mm-make-handle (current-buffer) (list content-type)
+ nil nil disposition))
+ ;; Set the default save directory to be consistent with
+ ;; `notmuch-show-save-part'.
+ (mm-default-directory (or mailcap-download-directory "~/"))
+ ;; set mm-inlined-types to nil to force an external viewer
+ (mm-inlined-types nil))
+ (mm-display-part handle))))
(defun notmuch-show-interactively-view-part (message-id nth &optional filename content-type)
(notmuch-with-temp-part-buffer message-id nth
(defun notmuch-show-insert-part-text/x-vcalendar (msg part content-type nth depth declared-type)
(notmuch-show-insert-part-text/calendar msg part content-type nth depth declared-type))
-(defun notmuch-show-insert-part-application/octet-stream (msg part content-type nth depth declared-type)
+(defun notmuch-show-get-mime-type-of-application/octet-stream (part)
;; If we can deduce a MIME type from the filename of the attachment,
- ;; do so and pass it on to the handler for that type.
+ ;; we return that.
(if (plist-get part :filename)
(let ((extension (file-name-extension (plist-get part :filename)))
mime-type)
(setq mime-type (mailcap-extension-to-mime extension))
(if (and mime-type
(not (string-equal mime-type "application/octet-stream")))
- (notmuch-show-insert-bodypart-internal msg part mime-type nth depth content-type)
+ mime-type
nil))
nil))))
;; Handler for wash generated inline patch fake parts.
(defun notmuch-show-insert-part-inline-patch-fake-part (msg part content-type nth depth declared-type)
- (notmuch-show-insert-part-*/* msg part "text/x-diff" nth depth "inline patch"))
+ (notmuch-show-insert-part-*/* msg part content-type nth depth declared-type))
(defun notmuch-show-insert-part-text/html (msg part content-type nth depth declared-type)
;; text/html handler to work around bugs in renderers and our
"Insert the body part PART at depth DEPTH in the current thread.
If HIDE is non-nil then initially hide this part."
- (let ((content-type (downcase (plist-get part :content-type)))
- (nth (plist-get part :id))
- (beg (point)))
-
- (notmuch-show-insert-bodypart-internal msg part content-type nth depth content-type)
+ (let* ((content-type (downcase (plist-get part :content-type)))
+ (mime-type (or (and (string= content-type "application/octet-stream")
+ (notmuch-show-get-mime-type-of-application/octet-stream part))
+ (and (string= content-type "inline patch")
+ "text/x-diff")
+ content-type))
+ (nth (plist-get part :id))
+ (beg (point)))
+
+ (notmuch-show-insert-bodypart-internal msg part mime-type nth depth content-type)
;; Some of the body part handlers leave point somewhere up in the
;; part, so we make sure that we're down at the end.
(goto-char (point-max))