mu4e-view: use Gnus' article mode (experimental)

Add a defcustom `mu4e-view-use-gnus`, which, when `t', use Gnus'
article-mode for displaying messages instead of mu4e's built-in mode.

This is experimental, and a view messages do not display
correctly yet (base64-encoded bodies).
This commit is contained in:
djcb 2018-04-24 14:21:15 +03:00
parent cc34705930
commit 260a8bb629
1 changed files with 57 additions and 11 deletions

View File

@ -1,6 +1,6 @@
;;; mu4e-view.el -- part of mu4e, the mu mail user agent ;;; mu4e-view.el -- part of mu4e, the mu mail user agent
;; ;;
;; Copyright (C) 2011-2017 Dirk-Jan C. Binnema ;; Copyright (C) 2011-2018 Dirk-Jan C. Binnema
;; Author: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl> ;; Author: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
;; Maintainer: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl> ;; Maintainer: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
@ -34,6 +34,7 @@
(require 'mu4e-actions) (require 'mu4e-actions)
(require 'mu4e-message) (require 'mu4e-message)
(require 'gnus-art)
(require 'comint) (require 'comint)
(require 'browse-url) (require 'browse-url)
(require 'button) (require 'button)
@ -45,12 +46,17 @@
(eval-when-compile (byte-compile-disable-warning 'cl-functions)) (eval-when-compile (byte-compile-disable-warning 'cl-functions))
(require 'cl) (require 'cl)
;; the message view ;; the message view
(defgroup mu4e-view nil (defgroup mu4e-view nil
"Settings for the message view." "Settings for the message view."
:group 'mu4e) :group 'mu4e)
(defcustom mu4e-view-use-gnus nil
"Whether to (experimentally) use Gnu's article view instead of
mu4e's internal viewer."
:type 'boolean
:group 'mu4e-view)
(defcustom mu4e-view-fields (defcustom mu4e-view-fields
'(:from :to :cc :subject :flags :date :maildir :mailing-list :tags '(:from :to :cc :subject :flags :date :maildir :mailing-list :tags
:attachments :signature :decryption) :attachments :signature :decryption)
@ -297,14 +303,23 @@ found."
(delete-all-overlays) (delete-all-overlays)
(remove-overlays))) (remove-overlays)))
(defun mu4e-view (msg) (defun mu4e-view (msg)
"Display the message MSG in a new buffer, and keep in sync with HDRSBUF. "Display the message MSG in a new buffer, and keep in sync with HDRSBUF.
'In sync' here means that moving to the next/previous message in 'In sync' here means that moving to the next/previous message in
the the message view affects HDRSBUF, as does marking etc. the the message view affects HDRSBUF, as does marking etc.
As a side-effect, a message that is being viewed loses its 'unread' As a side-effect, a message that is being viewed loses its 'unread'
marking if it still had that." marking if it still had that.
Depending on the value of `mu4e-view-use-gnus', either use mu4e's
internal display mode, or a display mode based on Gnu's
article-mode."
(if mu4e-view-use-gnus
(mu4e~view-gnus msg)
(mu4e~view-internal msg)))
(defun mu4e~view-internal (msg)
"Display a message using mu4e's internal view mode."
(let* ((embedded ;; is it as an embedded msg (ie. message/rfc822 att)? (let* ((embedded ;; is it as an embedded msg (ie. message/rfc822 att)?
(when (gethash (mu4e-message-field msg :path) (when (gethash (mu4e-message-field msg :path)
mu4e~path-parent-docid-map) t)) mu4e~path-parent-docid-map) t))
@ -334,6 +349,28 @@ marking if it still had that."
(unless mode-enabled (run-mode-hooks 'mu4e-view-mode-hook))))) (unless mode-enabled (run-mode-hooks 'mu4e-view-mode-hook)))))
(switch-to-buffer buf))) (switch-to-buffer buf)))
(defun mu4e~view-gnus (msg)
"View MSG using Gnu's article mode. Experimental."
(let ((marked-read (mu4e~view-mark-as-read-maybe msg))
(path (mu4e-message-field msg :path))
(inhibit-read-only t))
(switch-to-buffer (get-buffer-create mu4e~view-buffer-name))
(erase-buffer)
(unless marked-read
;; when we're being marked as read, no need to start rendering the messages; just the minimail
;; so (update... ) can find us.
(insert-file-contents path)
(setq gnus-summary-buffer (get-buffer-create " *appease-gnus*"))
(let ((gnu-article-buffer (current-buffer)))
(gnus-article-prepare-display))
(mu4e~view-make-urls-clickable)
(mu4e~view-construct-attachments-header msg))
(mu4e-view-mode)
(setq mu4e~view-msg msg)
(setq gnus-article-buffer (current-buffer))
(set-buffer-modified-p nil)
(read-only-mode)))
(defun mu4e~view-get-property-from-event (prop) (defun mu4e~view-get-property-from-event (prop)
"Get the property PROP at point, or the location of the mouse. "Get the property PROP at point, or the location of the mouse.
The action is chosen based on the `last-command-event'. The action is chosen based on the `last-command-event'.
@ -812,22 +849,32 @@ FUNC should be a function taking two arguments:
:group 'mu4e-view) :group 'mu4e-view)
(defvar mu4e-view-mode-abbrev-table nil) (defvar mu4e-view-mode-abbrev-table nil)
(define-derived-mode mu4e-view-mode special-mode "mu4e:view"
"Major mode for viewing an e-mail message in mu4e.
\\{mu4e-view-mode-map}."
(use-local-map mu4e-view-mode-map)
(defun mu4e~view-mode-body ()
"Body of the mode-function."
(use-local-map mu4e-view-mode-map)
;; show context in mode-string ;; show context in mode-string
(make-local-variable 'global-mode-string) (make-local-variable 'global-mode-string)
(add-to-list 'global-mode-string '(:eval (mu4e-context-label))) (add-to-list 'global-mode-string '(:eval (mu4e-context-label)))
(setq buffer-undo-list t);; don't record undo info (setq buffer-undo-list t);; don't record undo info
;; autopair mode gives error when pressing RET ;; autopair mode gives error when pressing RET
;; turn it off ;; turn it off
(when (boundp 'autopair-dont-activate) (when (boundp 'autopair-dont-activate)
(setq autopair-dont-activate t))) (setq autopair-dont-activate t)))
(if mu4e-view-use-gnus
(define-derived-mode mu4e-view-mode gnus-article-mode "mu4e:view/g"
;; remove some gnus stuff that does not apply
(define-key mu4e-view-mode-map [menu-bar Treatment] nil)
(define-key mu4e-view-mode-map [menu-bar Article] nil)
(define-key mu4e-view-mode-map [menu-bar post] nil)
"Major mode for viewing an e-mail message in mu4e, based on Gnus."
(mu4e~view-mode-body))
(define-derived-mode mu4e-view-mode special-mode "mu4e:view"
"Major mode for viewing an e-mail message in mu4e, using the
mu4e-specific view."
(mu4e~view-mode-body)))
(defun mu4e~view-mark-as-read-maybe (msg) (defun mu4e~view-mark-as-read-maybe (msg)
"Clear the message MSG New/Unread status and set it to Seen. "Clear the message MSG New/Unread status and set it to Seen.
If the message is not New/Unread, do nothing. Evaluates to t if it If the message is not New/Unread, do nothing. Evaluates to t if it
@ -887,7 +934,6 @@ If the url is mailto link, start writing an email to that address."
mu4e-view-image-max-width mu4e-view-image-max-width
mu4e-view-image-max-height))))))))) mu4e-view-image-max-height)))))))))
(defvar mu4e~view-beginning-of-url-regexp (defvar mu4e~view-beginning-of-url-regexp
"https?\\://\\|mailto:" "https?\\://\\|mailto:"
"Regexp that matches the beginning of http:/https:/mailto: "Regexp that matches the beginning of http:/https:/mailto: