mu4e: avoid some errors when flipping through messages

Use special-mode for the loading buffer, and explicitly ignore n/p.

Fixes #1443.
Fixes #1217.
This commit is contained in:
Dirk-Jan C. Binnema 2020-02-27 23:10:02 +02:00
parent 3e272ba82f
commit 6b2bdf4f6d
2 changed files with 35 additions and 19 deletions

View File

@ -1659,23 +1659,6 @@ _not_ refresh the last search with the new setting for threading."
(defvar mu4e~headers-loading-buf nil
"A buffer for loading a message view.")
(defun mu4e~headers-get-loading-buf ()
"Get a buffer to give feedback while loading a message view."
(unless (buffer-live-p mu4e~headers-loading-buf)
(setq mu4e~headers-loading-buf
(get-buffer-create " *mu4e-loading*")))
(with-current-buffer mu4e~headers-loading-buf
(read-only-mode)
(let ((inhibit-read-only t))
(erase-buffer)
(local-set-key (kbd "q")
(if (eq mu4e-split-view 'single-window)
'kill-buffer
'kill-buffer-and-window))
(insert (propertize "Waiting for message..."
'face 'mu4e-system-face 'intangible t))))
mu4e~headers-loading-buf)
(defun mu4e~decrypt-p (msg)
"Should we decrypt this message?"
(and (member 'encrypted (mu4e-message-field msg :flags))
@ -1701,7 +1684,13 @@ window. "
(unless (window-live-p viewwin)
(mu4e-error "Cannot get a message view"))
(select-window viewwin)
(switch-to-buffer (mu4e~headers-get-loading-buf))
(unless (buffer-live-p mu4e~headers-loading-buf)
(setq mu4e~headers-loading-buf (get-buffer-create " *mu4e-loading*"))
(with-current-buffer mu4e~headers-loading-buf
(mu4e-loading-mode)))
(switch-to-buffer mu4e~headers-loading-buf)
;; Note, ideally in the 'gnus' case, we don't need to call the server to get
;; the body etc., we only need the path which we already have.
;;

View File

@ -1771,6 +1771,33 @@ other windows."
(when (buffer-live-p (mu4e-get-headers-buffer))
(switch-to-buffer (mu4e-get-headers-buffer))))))))
;;; _
;;
;; Loading messages
;;
(defvar mu4e-loading-mode-map nil "Keymap for *mu4e-loading* buffers.")
(unless mu4e-loading-mode-map
(setq mu4e-loading-mode-map
(let ((map (make-sparse-keymap)))
(define-key map "n" 'ignore)
(define-key map "p" 'ignore)
(define-key map "q"
(lambda()(interactive)
(if (eq mu4e-split-view 'single-window)
'kill-buffer
'kill-buffer-and-window)))
map)))
(fset 'mu4e-loading-mode-map mu4e-loading-mode-map)
(define-derived-mode mu4e-loading-mode special-mode
"mu4e:loading"
(use-local-map mu4e-loading-mode-map)
(make-local-variable 'global-mode-string)
(let ((inhibit-read-only t))
(erase-buffer)
(insert (propertize "Loading message..."
'face 'mu4e-system-face 'intangible t))))
;;;
(provide 'mu4e-view)
;;; mu4e-view.el ends here