emacs: Simplify and fix `notmuch-mua-prompt-for-sender'

`notmuch-mua-prompt-for-sender' is over-engineered and often wrong.
It attempts to detect when all identities have the same name and
specialize the prompt to just the email address part.  However, to do
this it uses `mail-extract-address-components', which is meant for
displaying email addresses, not general-purpose parsing, and hence
performs many canonicalizations that can interfere with this use.  For
example, configuring notmuch-identities to ("Austin
<austin@example.com>"), will cause `notmuch-mua-prompt-for-sender' to
lose the name part entirely and return " <austin@example.com>".

This patch rewrites `notmuch-mua-prompt-for-sender' to simply prompt
for a full identity when notmuch-identities is configured, or to
prompt for a sender address when it isn't.

The original code also did several strange things, like using `eval'
and specifying that this function was interactive.  As a side-effect,
this patch fixes these problems.  And it adds a docstring.
This commit is contained in:
Austin Clements 2014-02-27 13:10:54 -05:00 committed by David Bremner
parent 7102b8c782
commit ed720f4e6d

View file

@ -286,30 +286,19 @@ the From: header is already filled in by notmuch."
(ad-activate 'ido-completing-read)))
(defun notmuch-mua-prompt-for-sender ()
(interactive)
(let (name addresses one-name-only)
;; If notmuch-identities is non-nil, check if there is a fixed user name.
"Prompt for a sender from the user's configured identities."
(if notmuch-identities
(let ((components (mapcar 'mail-extract-address-components notmuch-identities)))
(setq name (caar components)
addresses (mapcar 'cadr components)
one-name-only (eval
(cons 'and
(mapcar (lambda (identity)
(string-equal name (car identity)))
components)))))
;; If notmuch-identities is nil, use values from the notmuch configuration file.
(setq name (notmuch-user-name)
addresses (cons (notmuch-user-primary-email) (notmuch-user-other-email))
one-name-only t))
;; Now prompt the user, either for an email address only or for a full identity.
(if one-name-only
(let ((address
(ido-completing-read (concat "Sender address for " name ": ") addresses
nil nil nil 'notmuch-mua-sender-history (car addresses))))
(concat name " <" address ">"))
(ido-completing-read "Send mail From: " notmuch-identities
nil nil nil 'notmuch-mua-sender-history (car notmuch-identities)))))
(ido-completing-read "Send mail from: " notmuch-identities
nil nil nil 'notmuch-mua-sender-history
(car notmuch-identities))
(let* ((name (notmuch-user-name))
(addrs (cons (notmuch-user-primary-email)
(notmuch-user-other-email)))
(address
(ido-completing-read (concat "Sender address for " name ": ") addrs
nil nil nil 'notmuch-mua-sender-history
(car addrs))))
(concat name " <" address ">"))))
(put 'notmuch-mua-new-mail 'notmuch-prefix-doc "... and prompt for sender")
(defun notmuch-mua-new-mail (&optional prompt-for-sender)