From 338dc92f552640a07cd5330f2650a948b96b482d Mon Sep 17 00:00:00 2001 From: Mark Walters Date: Tue, 30 Jun 2015 23:16:25 +0100 Subject: [PATCH] [PATCH] emacs: show: let the user override the mime-type of an attachment --- 7a/0674f00dff2f9691dde0937825f0b2d7b1935c | 164 ++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 7a/0674f00dff2f9691dde0937825f0b2d7b1935c diff --git a/7a/0674f00dff2f9691dde0937825f0b2d7b1935c b/7a/0674f00dff2f9691dde0937825f0b2d7b1935c new file mode 100644 index 000000000..79dd608cb --- /dev/null +++ b/7a/0674f00dff2f9691dde0937825f0b2d7b1935c @@ -0,0 +1,164 @@ +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 + -- 2.26.2