Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by arlo.cworth.org (Postfix) with ESMTP id F044A6DE0B44 for ; Tue, 30 Jun 2015 15:17:07 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at cworth.org X-Spam-Flag: NO X-Spam-Score: -0.57 X-Spam-Level: X-Spam-Status: No, score=-0.57 tagged_above=-999 required=5 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_PASS=-0.001] autolearn=disabled Received: from arlo.cworth.org ([127.0.0.1]) by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 1mi7kF5JRyST for ; Tue, 30 Jun 2015 15:17:06 -0700 (PDT) Received: from mail-wi0-f177.google.com (mail-wi0-f177.google.com [209.85.212.177]) by arlo.cworth.org (Postfix) with ESMTPS id AF8B06DE0948 for ; Tue, 30 Jun 2015 15:17:05 -0700 (PDT) Received: by wicgi11 with SMTP id gi11so29392380wic.0 for ; Tue, 30 Jun 2015 15:17:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id; bh=v2lE64GRA2/7MEmcMxXlftVLMSo3V0NLETjr6vldIXI=; b=HSGJIFGFKbuEV0HsRB9VwwCcjlg8mFl4IWfzZo3ze+oimT4oFewTKOJXLEopBT7bi8 imQ53vY1ocv4RihqmUMFkSVeZreAamcsC1eDncI1lko1TrnxCs5vdmRpQPIixXiLW6JI aO9/u8XvnVZgxZzT77GfkiJFE2ut+LKXkbi167n3d1N/u3mp57u0YxP0qN86QE6QrRXG ZwGdYPBe8M5kKyibsRAaLrDWgfASkDjaR0fHXKkbN0qJqsFmYiYBU2agPyqaOXGhwBQg XPVEvPWjRqaT766isAJICZ/8RASEij61HAGSqJnmNf362AjD7YK2ruvEEbQFEeCtTBQO 5lcQ== X-Received: by 10.194.82.38 with SMTP id f6mr40203477wjy.16.1435702623246; Tue, 30 Jun 2015 15:17:03 -0700 (PDT) Received: from localhost ([92.54.140.178]) by mx.google.com with ESMTPSA id jy6sm65857417wjc.4.2015.06.30.15.17.02 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 30 Jun 2015 15:17:02 -0700 (PDT) From: Mark Walters To: notmuch@notmuchmail.org Subject: [PATCH] emacs: show: let the user override the mime-type of an attachment Date: Tue, 30 Jun 2015 23:16:25 +0100 Message-Id: <1435702585-27363-1-git-send-email-markwalters1009@gmail.com> X-Mailer: git-send-email 2.1.4 X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 30 Jun 2015 22:17:08 -0000 This allows the user to override the mime-type of a part in the show buffer. This takes the simple option of displaying the part with the specified mime-type in its own buffer (in view mode). This avoids further complicating the part handling code. Bound to ". m" (i.e., m in the part map). Then the user can either enter a mime-type or press return for the default choice of text/plain. --- Jani and dkg suggested something like this on irc. As mentioned in the commit message I have taken the simpler option of displaying the part in its own buffer: the part handling with lazy parts and hidden parts etc is really very complicated and fragile so I do not think it sensible to complicate it further for a relatively uncommon use case. It would be nice to have some completions for the mime-type but that could always be added later. Best wishes Mark emacs/notmuch-show.el | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el index 2a53461..c674e9c 100644 --- a/emacs/notmuch-show.el +++ b/emacs/notmuch-show.el @@ -1354,6 +1354,7 @@ reset based on the original query." (define-key map "v" 'notmuch-show-view-part) (define-key map "o" 'notmuch-show-interactively-view-part) (define-key map "|" 'notmuch-show-pipe-part) + (define-key map "m" 'notmuch-show-choose-mime-of-part) (define-key map "?" 'notmuch-subkeymap-help) map) "Submap for part commands") @@ -2243,25 +2244,27 @@ omit --in-reply-to=." (insert (notmuch-get-bodypart-binary msg part process-crypto))) buf)) -(defun notmuch-show-current-part-handle () +(defun notmuch-show-current-part-handle (&optional mime-type) "Return an mm-handle for the part containing point. This creates a temporary buffer for the part's content; the -caller is responsible for killing this buffer as appropriate." +caller is responsible for killing this buffer as appropriate. If +MIME-TYPE is given then set the handle's mime-type to MIME-TYPE." (let* ((msg (notmuch-show-get-message-properties)) (part (notmuch-show-get-part-properties)) (buf (notmuch-show-generate-part-buffer msg part)) - (computed-type (plist-get part :computed-type)) + (computed-type (or mime-type (plist-get part :computed-type))) (filename (plist-get part :filename)) (disposition (if filename `(attachment (filename . ,filename))))) (mm-make-handle buf (list computed-type) nil nil disposition))) -(defun notmuch-show-apply-to-current-part-handle (fn) +(defun notmuch-show-apply-to-current-part-handle (fn &optional mime-type) "Apply FN to an mm-handle for the part containing point. This ensures that the temporary buffer created for the mm-handle -is destroyed when FN returns." - (let ((handle (notmuch-show-current-part-handle))) +is destroyed when FN returns. If MIME-TYPE is given then force +part to be treated as if it had that mime-type." + (let ((handle (notmuch-show-current-part-handle mime-type))) ;; emacs 24.3+ puts stdout/stderr into the calling buffer so we ;; call it from a temp-buffer, unless ;; notmuch-show-attachment-debug is non-nil in which case we put @@ -2306,4 +2309,24 @@ is destroyed when FN returns." (notmuch-show-apply-to-current-part-handle #'mm-pipe-part)) +(defun notmuch-show-internal-mm-display-part (handle) + "Use mm-display-part to display HANDLE in a new buffer. + +If the part is displayed in an external application then close +the new buffer." + (let ((buf (get-buffer-create (generate-new-buffer-name + (concat " *notmuch-internal-part*"))))) + (switch-to-buffer buf) + (if (eq (mm-display-part handle) 'external) + (kill-buffer buf) + (goto-char (point-min)) + (set-buffer-modified-p nil) + (view-buffer buf 'kill-buffer-if-not-modified)))) + +(defun notmuch-show-choose-mime-of-part (mime-type) + "Choose the mime type to use for displaying part" + (interactive + (list (read-string "Mime type to use (default text/plain): " nil nil "text/plain"))) + (notmuch-show-apply-to-current-part-handle #'notmuch-show-internal-mm-display-part mime-type)) + (provide 'notmuch-show) -- 2.1.4