[PATCH v2] emacs: show: let the user override the mime-type of an attachment
authorMark Walters <markwalters1009@gmail.com>
Mon, 11 Jul 2016 07:49:19 +0000 (08:49 +0100)
committerW. Trevor King <wking@tremily.us>
Sat, 20 Aug 2016 23:22:12 +0000 (16:22 -0700)
84/271ec84bf02c83f06bc153f4bff4bca0ffc468 [new file with mode: 0644]

diff --git a/84/271ec84bf02c83f06bc153f4bff4bca0ffc468 b/84/271ec84bf02c83f06bc153f4bff4bca0ffc468
new file mode 100644 (file)
index 0000000..3d346cb
--- /dev/null
@@ -0,0 +1,177 @@
+Return-Path: <markwalters1009@gmail.com>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+ by arlo.cworth.org (Postfix) with ESMTP id 82B946DE02AC\r
+ for <notmuch@notmuchmail.org>; Mon, 11 Jul 2016 00:49:37 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at cworth.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: 0.155\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=0.155 tagged_above=-999 required=5 tests=[AWL=-0.275,\r
+  DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1,\r
+ FREEMAIL_ENVFROM_END_DIGIT=0.25, FREEMAIL_FROM=0.001, FREEMAIL_REPLY=1,\r
+ RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01,\r
+ SPF_PASS=-0.001] autolearn=disabled\r
+Received: from arlo.cworth.org ([127.0.0.1])\r
+ by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024)\r
+ with ESMTP id kCP5OyYF-XIc for <notmuch@notmuchmail.org>;\r
+ Mon, 11 Jul 2016 00:49:29 -0700 (PDT)\r
+Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com\r
+ [74.125.82.67]) by arlo.cworth.org (Postfix) with ESMTPS id DE3C36DE014D for\r
+ <notmuch@notmuchmail.org>; Mon, 11 Jul 2016 00:49:28 -0700 (PDT)\r
+Received: by mail-wm0-f67.google.com with SMTP id o80so3337933wme.0\r
+ for <notmuch@notmuchmail.org>; Mon, 11 Jul 2016 00:49:28 -0700 (PDT)\r
+DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;\r
+ h=from:to:cc:subject:date:message-id;\r
+ bh=TJTAoj7fv9RZunm5kRybJ2cb/1jKMhHsqDPtuatqut8=;\r
+ b=QTnothJM04P8Gikvna77kl9NqpcfhDifPrUhmFDFoNRF9oJz/ZyUIBNYcMjwO7zKoy\r
+ JxQZfclilj8BahN2OBhCSlCVGs5BiHTE353LUbrtTx2bOqH9CQnbi2jdZeSmgKkSj0nn\r
+ /n9QSMOEb5F7bStIk7GCarQDk/cSSWn2vLNcY55MxBKviRbMHhnJCYGqJ8Zo2DqqxH0M\r
+ iQyLDejKDyRLq5piCiGbSsfL5vL5JJj28VB7pgzpQD4MuunvcJ2Nz2ICVZOCMVef/lFz\r
+ 2tJQ5mjPr7VnBiEFyitn0Ry4ZJ14k2E3FSp3qHlmmO3N7k78S/hgTrR8uQ33SfZPOLhS\r
+ bFQA==\r
+X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\r
+ d=1e100.net; s=20130820;\r
+ h=x-gm-message-state:from:to:cc:subject:date:message-id;\r
+ bh=TJTAoj7fv9RZunm5kRybJ2cb/1jKMhHsqDPtuatqut8=;\r
+ b=U79rJI4jsrBwK4A1ei/aD2xIAEn6T7PzVyD3wvJNoEANmgdTs1JwE7IYhgSWYx78We\r
+ +pOG0sGd9f4uTRGsqygEn0pLwKOhwJXPF0lzS/h+r3cW8ucOtuqqLhct4db8n5qW5x+i\r
+ AVdc35xb8iBXIYnoeE2aYpC30HdAYROCCadevyhQbHPFXX5gqhREmlVuJxwUrA2uzc9g\r
+ IEJgcwVzbVOLqdLE4EAFd95EsjEtMJ6gQuTIFtI5YCTwx0DUuV4TS+/8RqXEFB6ZKjEy\r
+ Ag0pcakiWcGtK1bSIO/say7Sn3mOc1j6Ye6llPZRc5uHWWiPfQP3oAfY1aZvhFkf38/Y\r
+ nlBg==\r
+X-Gm-Message-State:\r
+ ALyK8tIJbzKc5KsBDu+QPxzZpaL6d61xqSPG//sWdNQX8YUCXGzSActE5EWAJHNl1HloHw==\r
+X-Received: by 10.28.142.194 with SMTP id q185mr12554670wmd.6.1468223363883;\r
+ Mon, 11 Jul 2016 00:49:23 -0700 (PDT)\r
+Received: from localhost (5751dfa2.skybroadband.com. [87.81.223.162])\r
+ by smtp.gmail.com with ESMTPSA id 12sm14352548wmj.19.2016.07.11.00.49.22\r
+ (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\r
+ Mon, 11 Jul 2016 00:49:23 -0700 (PDT)\r
+From: Mark Walters <markwalters1009@gmail.com>\r
+To: notmuch@notmuchmail.org\r
+Subject: [PATCH v2] emacs: show: let the user override the mime-type of an\r
+ attachment\r
+Date: Mon, 11 Jul 2016 08:49:19 +0100\r
+Message-Id: <1468223359-16736-1-git-send-email-markwalters1009@gmail.com>\r
+X-Mailer: git-send-email 2.1.4\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.20\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+ <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <https://notmuchmail.org/mailman/options/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch/>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <https://notmuchmail.org/mailman/listinfo/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Mon, 11 Jul 2016 07:49:37 -0000\r
+\r
+This allows the user to override the mime-type of a part in the show\r
+buffer. This takes the simple option of displaying the part with the\r
+specified mime-type in its own buffer (in view mode). This avoids\r
+further complicating the part handling code.\r
+\r
+Bound to ". m" (i.e., m in the part map). Then the user can either\r
+enter a mime-type (with completion to all mime types that mailcap (and\r
+thus notmuch) knows about, or press return for the default choice of\r
+text/plain.\r
+---\r
+\r
+Hi\r
+\r
+This is (a rather delayed) version 2 of the patch\r
+id:1435702585-27363-1-git-send-email-markwalters1009@gmail.com\r
+\r
+I have fixed bremner's review comment on the naming of the function,\r
+and since it was easy I have added completion for mime-types.\r
+\r
+It is not heavily tested but seems to work.\r
+\r
+Best wishes\r
+\r
+Mark\r
+\r
+emacs/notmuch-show.el | 36 ++++++++++++++++++++++++++++++------\r
+ 1 file changed, 30 insertions(+), 6 deletions(-)\r
+\r
+diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el\r
+index 6d3149b..06ba549 100644\r
+--- a/emacs/notmuch-show.el\r
++++ b/emacs/notmuch-show.el\r
+@@ -1403,6 +1403,7 @@ reset based on the original query."\r
+     (define-key map "v" 'notmuch-show-view-part)\r
+     (define-key map "o" 'notmuch-show-interactively-view-part)\r
+     (define-key map "|" 'notmuch-show-pipe-part)\r
++    (define-key map "m" 'notmuch-show-choose-mime-of-part)\r
+     (define-key map "?" 'notmuch-subkeymap-help)\r
+     map)\r
+   "Submap for part commands")\r
+@@ -2337,25 +2338,27 @@ omit --in-reply-to=<Message-Id>."\r
+       (insert (notmuch-get-bodypart-binary msg part process-crypto)))\r
+     buf))\r
\r
+-(defun notmuch-show-current-part-handle ()\r
++(defun notmuch-show-current-part-handle (&optional mime-type)\r
+   "Return an mm-handle for the part containing point.\r
\r
+ This creates a temporary buffer for the part's content; the\r
+-caller is responsible for killing this buffer as appropriate."\r
++caller is responsible for killing this buffer as appropriate.  If\r
++MIME-TYPE is given then set the handle's mime-type to MIME-TYPE."\r
+   (let* ((msg (notmuch-show-get-message-properties))\r
+        (part (notmuch-show-get-part-properties))\r
+        (buf (notmuch-show-generate-part-buffer msg part))\r
+-       (computed-type (plist-get part :computed-type))\r
++       (computed-type (or mime-type (plist-get part :computed-type)))\r
+        (filename (plist-get part :filename))\r
+        (disposition (if filename `(attachment (filename . ,filename)))))\r
+     (mm-make-handle buf (list computed-type) nil nil disposition)))\r
\r
+-(defun notmuch-show-apply-to-current-part-handle (fn)\r
++(defun notmuch-show-apply-to-current-part-handle (fn &optional mime-type)\r
+   "Apply FN to an mm-handle for the part containing point.\r
\r
+ This ensures that the temporary buffer created for the mm-handle\r
+-is destroyed when FN returns."\r
+-  (let ((handle (notmuch-show-current-part-handle)))\r
++is destroyed when FN returns. If MIME-TYPE is given then force\r
++part to be treated as if it had that mime-type."\r
++  (let ((handle (notmuch-show-current-part-handle mime-type)))\r
+     ;; emacs 24.3+ puts stdout/stderr into the calling buffer so we\r
+     ;; call it from a temp-buffer, unless\r
+     ;; notmuch-show-attachment-debug is non-nil in which case we put\r
+@@ -2400,6 +2403,27 @@ is destroyed when FN returns."\r
+   (notmuch-show-apply-to-current-part-handle #'mm-pipe-part))\r
\r
\r
++(defun notmuch-show--mm-display-part (handle)\r
++  "Use mm-display-part to display HANDLE in a new buffer.\r
++\r
++If the part is displayed in an external application then close\r
++the new buffer."\r
++  (let ((buf (get-buffer-create (generate-new-buffer-name\r
++                               (concat " *notmuch-internal-part*")))))\r
++    (switch-to-buffer buf)\r
++    (if (eq (mm-display-part handle) 'external)\r
++      (kill-buffer buf)\r
++      (goto-char (point-min))\r
++      (set-buffer-modified-p nil)\r
++      (view-buffer buf 'kill-buffer-if-not-modified))))\r
++\r
++(defun notmuch-show-choose-mime-of-part (mime-type)\r
++  "Choose the mime type to use for displaying part"\r
++  (interactive\r
++   (list (completing-read "Mime type to use (default text/plain): "\r
++                        (mailcap-mime-types) nil nil nil nil "text/plain")))\r
++  (notmuch-show-apply-to-current-part-handle #'notmuch-show--mm-display-part mime-type))\r
++\r
+ (provide 'notmuch-show)\r
\r
+ ;;; notmuch-show.el ends here\r
+-- \r
+2.1.4\r
+\r