mu4e-message: improve mu4e-fetch-field

Decode the message, so that encoded fields get decoded as expected.
Also add an example to the doc for using mu4e-fetch-field.
This commit is contained in:
Dirk-Jan C. Binnema 2024-01-04 23:12:38 +02:00
parent b19f136700
commit 300ab2b0e1
2 changed files with 28 additions and 17 deletions

View File

@ -222,10 +222,21 @@ If MSG is nil, use `mu4e-message-at-point'."
;; add basic `quit-window' bindings ;; add basic `quit-window' bindings
(view-mode 1))))) (view-mode 1)))))
(defun mu4e-fetch-field (msg hdr) (declare-function mu4e--decoded-message "mu4e-compose")
"Find the value for an arbitrary header field HDR from MSG."
(defun mu4e-fetch-field (msg hdr &optional first)
"Find the value for an arbitrary header field HDR from MSG.
If the header appears multiple times, the field values are
concatenated, unless FIRST is non-nil, in which case only the
first value is returned. See `message-fetch-field' for details.
Note: this loads the full message file such that any available
message header can be used. If the header is part of the MSG
plist, it is much more efficient to get the information from that
plist."
(with-temp-buffer (with-temp-buffer
(insert-file-contents (plist-get msg :path)) (insert (mu4e--decoded-message msg 'headers-only))
(message-fetch-field hdr))) (message-fetch-field hdr)))
;;; ;;;
(provide 'mu4e-message) (provide 'mu4e-message)

View File

@ -1156,25 +1156,25 @@ suppose that our function takes a message-plist as its argument
(length (mu4e-message-field msg :cc)))))))) (length (mu4e-message-field msg :cc))))))))
@end lisp @end lisp
Or, let's get the full mailing-list name: Or, let's get the contents of the Jabber-ID header.
@lisp @lisp
(add-to-list 'mu4e-header-info-custom (add-to-list 'mu4e-header-info-custom
'(:full-mailing-list . '(:jabber-id .
( :name "Mailing-list" ;; long name, as seen in the message-view ( :name "Jabber-ID" ;; long name, as seen in the message-view
:shortname "ML" ;; short name, as seen in the headers view :shortname "JID" ;; short name, as seen in the headers view
:help "Full name for mailing list" ;; tooltip :help "The Jabber ID" ;; tooltip
;; uses mu4e-fetch-field which is rel. slow, so only appropriate
;; for mu4e-view-fields, and _not_ mu4e-headers-fields
:function (lambda (msg) :function (lambda (msg)
(or (mu4e-message-field msg :mailing-list) ""))))) (or (mu4e-fetch-field msg "Jabber-ID") "")))))
@end lisp @end lisp
You can then add the custom header to your @code{mu4e-headers-fields}, You can then add the custom header to your @code{mu4e-headers-fields} or
just like the built-in headers. After evaluation, your headers-view @code{mu4e-view-fields}, just like the built-in headers. However, there is an
should include a new header @t{Recip#} with the number of recipients, important caveat: when your custom header in @code{mu4e-headers-fields}, the
and/or @t{ML} with the full mailing-list name. function is invoked for each of your message headers in search results, and if
it is slow, would dramatically slow down @t{mu4e}.
This function can be used in both the headers-view and the message-view;
if you need something specific for one of these, you can check for the
mode in your function, or create separate functions.
@node HV Actions @node HV Actions
@section Actions @section Actions