diff --git a/mu4e/mu4e-draft.el b/mu4e/mu4e-draft.el index d7053540..367f580a 100644 --- a/mu4e/mu4e-draft.el +++ b/mu4e/mu4e-draft.el @@ -605,9 +605,11 @@ COMPOSE-TYPE and PARENT are as in `mu4e--draft'." ;; now, switch to compose mode (mu4e-compose-mode) - ;; hide some internal headers + ;; hide some internal headers; we use the special mu4e-- version of + ;; message-hide-headers, since older versions of the latter trigger some bug, + ;; #2661. (let ((message-hidden-headers mu4e-draft-hidden-headers)) - (message-hide-headers)) + (mu4e--message-hide-headers)) ;; hooks (add-hook 'before-save-hook #'mu4e--compose-before-save nil t) diff --git a/mu4e/mu4e-helpers.el b/mu4e/mu4e-helpers.el index 9b555e16..01deba0e 100644 --- a/mu4e/mu4e-helpers.el +++ b/mu4e/mu4e-helpers.el @@ -31,6 +31,7 @@ (require 'ido) (require 'cl-lib) (require 'bookmark) +(require 'message) (require 'mu4e-window) (require 'mu4e-config) @@ -576,6 +577,31 @@ This is mu4e's version of Emacs 29's `plistp'." (let ((len (proper-list-p object))) (and len (zerop (% len 2))))) +(defun mu4e--message-hide-headers () + "Hide headers based on the `message-hidden-headers' variable. +This is mu4e's version of the post-emacs-28 `message-hide-headers', +which we need to avoid #2661." + (let ((regexps (if (stringp message-hidden-headers) + (list message-hidden-headers) + message-hidden-headers)) + end-of-headers) + (when regexps + (save-excursion + (save-restriction + (message-narrow-to-headers) + (setq end-of-headers (point-min-marker)) + (goto-char (point-min)) + (while (not (eobp)) + (if (not (message-hide-header-p regexps)) + (message-next-header) + (let ((begin (point))) + (message-next-header) + (let ((header (delete-and-extract-region begin (point)))) + (save-excursion + (goto-char end-of-headers) + (insert-before-markers header)))))))) + (narrow-to-region end-of-headers (point-max))))) + (defun mu4e-key-description (cmd) "Get the textual form of current binding to interactive function CMD. If it is unbound, return nil. If there are multiple bindings,