`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, but this has several problems. First, 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 at example.com>"), will cause `notmuch-mua-prompt-for-sender' to lose the name part entirely and return " <austin at example.com>". Second, though less serious, the prompt specialization means the user can't enter a different name like they can if their identities have different names.
This patch rewrites `notmuch-mua-prompt-for-sender' to simply prompt for a full identity, where the list of identities is derived from either notmuch-identities or the user's Notmuch configuration. 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. --- emacs/notmuch-mua.el | 33 +++++++++------------------------ 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/emacs/notmuch-mua.el b/emacs/notmuch-mua.el index f2df770..4a485a4 100644 --- a/emacs/notmuch-mua.el +++ b/emacs/notmuch-mua.el @@ -286,30 +286,15 @@ 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. - (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))))) + "Prompt for a sender from the user's configured identities." + (let ((identities (or notmuch-identities + (let ((name (notmuch-user-name))) + (mapcar (lambda (addr) (concat name " <" addr ">")) + (cons (notmuch-user-primary-email) + (notmuch-user-other-email))))))) + (ido-completing-read "Send mail from: " identities + nil nil nil 'notmuch-mua-sender-history + (car identities)))) (put 'notmuch-mua-new-mail 'notmuch-prefix-doc "... and prompt for sender") (defun notmuch-mua-new-mail (&optional prompt-for-sender) -- 1.8.4.rc3