unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH] emacs: show: let the user override the mime-type of an attachment
@ 2015-06-30 22:16 Mark Walters
  2015-08-01 20:47 ` David Bremner
  0 siblings, 1 reply; 2+ messages in thread
From: Mark Walters @ 2015-06-30 22:16 UTC (permalink / raw)
  To: notmuch

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=<Message-Id>."
       (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

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] emacs: show: let the user override the mime-type of an attachment
  2015-06-30 22:16 [PATCH] emacs: show: let the user override the mime-type of an attachment Mark Walters
@ 2015-08-01 20:47 ` David Bremner
  0 siblings, 0 replies; 2+ messages in thread
From: David Bremner @ 2015-08-01 20:47 UTC (permalink / raw)
  To: Mark Walters, notmuch

Mark Walters <markwalters1009@gmail.com> writes:

> +(defun notmuch-show-internal-mm-display-part (handle)

It's very much a quibble, but I don't understand the naming scheme
here. Is internal meant to denote an privateish function? If so the
convention of using -- (notmuch-show--mm-display-part, I guess) seems
more common in the code base. Or does internal/external refer to viewers
here?

Otherwise, it looks good. The only thing that I really missed was
completion on mime types. But that makes sense as a seperate patch, even
if it is easy, and I have no idea how easy it is.

d

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-08-01 20:48 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-06-30 22:16 [PATCH] emacs: show: let the user override the mime-type of an attachment Mark Walters
2015-08-01 20:47 ` David Bremner

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).