mu4e: support regexp patterns for personal addresses

This commit is contained in:
Dirk-Jan C. Binnema
2020-10-17 10:14:04 +03:00
parent dbff5671dd
commit 5e069d9a6f
8 changed files with 43 additions and 39 deletions

View File

@ -36,7 +36,7 @@
(defcustom mu4e-compose-dont-reply-to-self nil (defcustom mu4e-compose-dont-reply-to-self nil
"If non-nil, don't include self. "If non-nil, don't include self.
\(that is, member of `(mu4e-personal-addresses)') in replies." (as decided by `mu4e-personal-address-p')"
:type 'boolean :type 'boolean
:group 'mu4e-compose) :group 'mu4e-compose)
@ -182,10 +182,7 @@ of the original, we simple copy the list form the original."
(if mu4e-compose-dont-reply-to-self (if mu4e-compose-dont-reply-to-self
(cl-delete-if (cl-delete-if
(lambda (to-cell) (lambda (to-cell)
(cl-member-if (mu4e-personal-address-p (cdr to-cell)))
(lambda (addr)
(string= (downcase addr) (downcase (cdr to-cell))))
(mu4e-personal-addresses)))
reply-to) reply-to)
reply-to))) reply-to)))
@ -246,10 +243,7 @@ REPLY-ALL."
cc-lst cc-lst
(cl-delete-if (cl-delete-if
(lambda (cc-cell) (lambda (cc-cell)
(cl-member-if (mu4e-personal-address-p (cdr cc-cell)))
(lambda (addr)
(string= (downcase addr) (downcase (cdr cc-cell))))
(mu4e-personal-addresses)))
cc-lst)))) cc-lst))))
cc-lst))) cc-lst)))

View File

@ -604,7 +604,7 @@ cdr element the To: prefix.")
(defun mu4e~headers-from-or-to (msg) (defun mu4e~headers-from-or-to (msg)
"When the from address for message MSG is one of the the user's addresses, "When the from address for message MSG is one of the the user's addresses,
\(as per `mu4e-personal-addresses'), show the To address; \(as per `mu4e-personal-address-p'), show the To address;
otherwise ; show the from address; prefixed with the appropriate otherwise ; show the from address; prefixed with the appropriate
`mu4e-headers-from-or-to-prefix'." `mu4e-headers-from-or-to-prefix'."
(let ((addr (cdr-safe (car-safe (mu4e-message-field msg :from))))) (let ((addr (cdr-safe (car-safe (mu4e-message-field msg :from)))))

View File

@ -76,8 +76,8 @@
(let* ((handle (car data)) (let* ((handle (car data))
(status (cadr data)) (status (cadr data))
(event (caddr data)) (event (caddr data))
(gnus-icalendar-additional-identities (mu4e-personal-addresses)) (gnus-icalendar-additional-identities (mu4e-personal-addresses 'no-regexp))
(reply (gnus-icalendar-with-decoded-handle (reply (gnus-icalendar-with-decoded-handle1
handle handle
(let ((gnus-icalendar-find-if (lambda(pred seq) nil))) (let ((gnus-icalendar-find-if (lambda(pred seq) nil)))
(gnus-icalendar-event-reply-from-buffer (gnus-icalendar-event-reply-from-buffer

View File

@ -275,11 +275,11 @@ When REFRESH is non nil refresh infos from server."
(mu4e~key-val "personal addresses" (if addrs (mapconcat #'identity addrs ", " ) "none")))) (mu4e~key-val "personal addresses" (if addrs (mapconcat #'identity addrs ", " ) "none"))))
(if mu4e-main-buffer-hide-personal-addresses "" (if mu4e-main-buffer-hide-personal-addresses ""
(when (and user-mail-address (not (member user-mail-address addrs))) (unless (mu4e-personal-address-p user-mail-address)
(mu4e-message (concat (mu4e-message (concat
"Note: `user-mail-address' ('%s') is not part " "Tip: `user-mail-address' ('%s') is not part "
"of mu's addresses; add it with 'mu init --my-address='") "of mu's addresses; add it with 'mu init
user-mail-address))) --my-address='") user-mail-address)))
(mu4e-main-mode) (mu4e-main-mode)
(goto-char pos)))) (goto-char pos))))

View File

@ -275,19 +275,17 @@ expressions, in which case any of those are tried for a match."
(and email (string-match rx email))))) (and email (string-match rx email)))))
(mu4e-message-field msg cfield)))))) (mu4e-message-field msg cfield))))))
(defun mu4e-message-contact-field-matches-me (msg cfield) (defun mu4e-message-contact-field-matches-me (msg cfield)
"Does contact-field CFIELD in MSG match me? "Does contact-field CFIELD in MSG match me? Checks whether any
Checks whether any of the of the contacts in field of the of the contacts in field CFIELD (either :to, :from, :cc or
CFIELD (either :to, :from, :cc or :bcc) of msg MSG matches *me*, :bcc) of msg MSG matches *me*, that is, any of the addresses for
that is, any of the e-mail address in which `mu4e-personal-address-p' return t. Returns the contact
`(mu4e-personal-addresses)'. Returns the contact cell that
cell that matched, or nil." cell that matched, or nil."
(cl-find-if (cl-find-if
(lambda (cc-cell) (lambda (cc-cell)
(cl-member-if (cl-member-if
(lambda (addr) (lambda (addr)
(string= (downcase addr) (downcase (cdr cc-cell)))) (mu4e-personal-address-p (cdr cc-cell)))
(mu4e-personal-addresses)))
(mu4e-message-field msg cfield))))) (mu4e-message-field msg cfield)))))
(defsubst mu4e-message-part-field (msgpart field) (defsubst mu4e-message-part-field (msgpart field)

View File

@ -63,15 +63,22 @@
(kill-new path) (kill-new path)
(mu4e-message "Saved '%s' to kill-ring" path))) (mu4e-message "Saved '%s' to kill-ring" path)))
(defun mu4e-user-mail-address-p (addr) (defun mu4e-personal-address-p (addr)
"If ADDR is one of user's e-mail addresses return t, nil otherwise. "Is ADDR a personal address?
User's addresses are set in `(mu4e-personal-addresses)'. Case Evaluate to nil if ADDR matches any of the personal addresses.
insensitive comparison is used." Uses (mu4e-personal-addresses) for the addresses with both the plain
(when (and addr (mu4e-personal-addresses) addresses and /regular expressions/."
(cl-find addr (mu4e-personal-addresses) (seq-find
:test (lambda (s1 s2) (lambda (m)
(eq t (compare-strings s1 nil nil s2 nil nil t))))) (if (string-match "/\\(.*\\)/" m)
t)) (let ((rx (match-string 1 m))
(case-fold-search t))
(if (string-match rx addr) t nil))
(eq t (compare-strings addr nil nil m nil nil 'case-insensitive))))
(mu4e-personal-addresses)))
(define-obsolete-function-alias 'mu4e-user-mail-address-p
'mu4e-personal-address-p "1.5.5")
(defmacro with~mu4e-context-vars (context &rest body) (defmacro with~mu4e-context-vars (context &rest body)
"Evaluate BODY, with variables let-bound for CONTEXT (if any). "Evaluate BODY, with variables let-bound for CONTEXT (if any).

View File

@ -1049,9 +1049,14 @@ mu4e-compose.")
(mu4e-error "database-path unknown; did you start mu4e?")) (mu4e-error "database-path unknown; did you start mu4e?"))
path)) path))
(defun mu4e-personal-addresses() (defun mu4e-personal-addresses(&optional no-regexp)
"Get the user's personal addresses, if any." "Get the list user's personal addresses, as passed to `mu init --my-address=...'.
(when mu4e~server-props (plist-get mu4e~server-props :personal-addresses))) The address are either plain e-mail address or /regular
expressions/. When NO_REGEXP is non-nil, do not include regexp
address patterns (if any)."
(seq-remove
(lambda(addr) (and no-regexp (string-match-p "^/.*/" addr)))
(when mu4e~server-props (plist-get mu4e~server-props :personal-addresses))))
(defun mu4e-server-version() (defun mu4e-server-version()
"Get the server version, which should match mu4e's." "Get the server version, which should match mu4e's."
@ -1060,7 +1065,6 @@ mu4e-compose.")
(mu4e-error "version unknown; did you start mu4e?")) (mu4e-error "version unknown; did you start mu4e?"))
version)) version))
;;; Handler functions ;;; Handler functions
;; ;;

View File

@ -404,7 +404,8 @@ article-mode."
(gnus-blocked-images ".") ;; don't load external images. (gnus-blocked-images ".") ;; don't load external images.
;; Possibly add headers (before "Attachments") ;; Possibly add headers (before "Attachments")
(gnus-display-mime-function (mu4e~view-gnus-display-mime msg)) (gnus-display-mime-function (mu4e~view-gnus-display-mime msg))
(gnus-icalendar-additional-identities (mu4e-personal-addresses))) (gnus-icalendar-additional-identities
(mu4e-personal-addresses 'no-regexp)))
(gnus-article-prepare-display)) (gnus-article-prepare-display))
(setq mu4e~gnus-article-mime-handles gnus-article-mime-handles) (setq mu4e~gnus-article-mime-handles gnus-article-mime-handles)
(setq mu4e~view-message msg) (setq mu4e~view-message msg)