branch: externals/ebdb
commit 7662133c0dd8142e03a8a1db786a4a230145503a
Author: Eric Abrahamsen <[email protected]>
Commit: Eric Abrahamsen <[email protected]>
Simplify ebdb-dwim-mail
* ebdb.el: Remove options `ebdb-mail-name-format' and
`ebdb-mail-name'. Re-instate later if people complain. If a
different name is desired for a particular mail address, we can use
the mail-aka slot.
* ebdb-com.el (ebdb-dwim-mail): Don't go to such lengths when matching
the name and mail user. Just a simple check for likely matches, and
move on. This also removes dependency on person record complex
names, which previously would have raised an error for an
organization.
---
ebdb-com.el | 96 ++++++++++++++++++++++++-------------------------------------
ebdb.el | 30 ++++---------------
2 files changed, 43 insertions(+), 83 deletions(-)
diff --git a/ebdb-com.el b/ebdb-com.el
index 6aec6e9..c046d36 100644
--- a/ebdb-com.el
+++ b/ebdb-com.el
@@ -2107,71 +2107,49 @@ the record to be displayed or nil otherwise."
(defun ebdb-dwim-mail (record &optional mail)
;; Do What I Mean!
"Return a string to use as the mail address of RECORD.
-The name in the mail address is formatted obeying `ebdb-mail-name-format'
-and `ebdb-mail-name'. However, if both the first name and last name
-are constituents of the address as in [email protected],
-and `ebdb-mail-avoid-redundancy' is non-nil, then the address is used as is
-and `ebdb-mail-name-format' and `ebdb-mail-name' are ignored.
-If `ebdb-mail-avoid-redundancy' is 'mail-only the name is never included.
-MAIL may be a mail address to be used for RECORD.
-If MAIL is an integer, use the MAILth mail address of RECORD.
-If MAIL is nil use RECORD's primary mail address."
+
+However, if both the first name and last name are constituents of
+the address as in [email protected], and
+`ebdb-mail-avoid-redundancy' is non-nil, then the address is used
+as is. If `ebdb-mail-avoid-redundancy' is 'mail-only the name
+is never included. MAIL may be a mail address to be used for
+RECORD. If MAIL is an integer, use the MAILth mail address of
+RECORD. If MAIL is nil use RECORD's primary mail address."
(unless mail
(let ((mails (ebdb-record-mail record t)))
(setq mail (or (and (integerp mail) (nth mail mails))
(object-assoc 'primary 'priority mails)
(car mails)))))
(unless mail (error "Record has no mail addresses"))
- (let ((mail-aka (slot-value mail 'aka))
- name fn ln)
- (setq mail (slot-value mail 'mail))
- (cond (mail-aka
- (setq name mail-aka))
- ((functionp ebdb-mail-name)
- (setq name (funcall ebdb-mail-name record))
- (if (consp name)
- (setq fn (car name) ln (cdr name)
- name (if (eq ebdb-mail-name-format 'first-last)
- (ebdb-concat 'name-first-last fn ln)
- (ebdb-concat 'name-last-first ln fn)))
- (let ((pair (ebdb-divide-name name)))
- (setq fn (car pair) ln (cdr pair)))))
- ((setq name (ebdb-record-user-field record ebdb-mail-name))
- (let ((pair (ebdb-divide-name name)))
- (setq fn (car pair) ln (cdr pair))))
- (t
- (setq name (if (eq ebdb-mail-name-format 'first-last)
- (ebdb-record-name record)
- (ebdb-name-lf (slot-value record 'name)))
- fn (ebdb-record-firstname record)
- ln (ebdb-record-lastname record))))
- (if (or (not name) (equal "" name)
- (eq 'mail-only ebdb-mail-avoid-redundancy)
- (and ebdb-mail-avoid-redundancy
- (cond ((and fn ln)
- (let ((fnq (regexp-quote fn))
- (lnq (regexp-quote ln)))
- (or (string-match (concat "\\`[^!@%]*\\b" fnq
- "\\b[^!%@]+\\b" lnq "\\b")
- mail)
- (string-match (concat "\\`[^!@%]*\\b" lnq
- "\\b[^!%@]+\\b" fnq "\\b")
- mail))))
- ((or fn ln)
- (string-match (concat "\\`[^!@%]*\\b"
- (regexp-quote (or fn ln)) "\\b")
- mail)))))
- mail
- ;; If the name contains backslashes or double-quotes, backslash them.
- (setq name (replace-regexp-in-string "[\\\"]" "\\\\\\&" name))
- ;; If the name contains control chars or RFC822 specials, it needs
- ;; to be enclosed in quotes. This quotes a few extra characters as
- ;; well (!,%, and $) just for common sense.
- ;; `define-mail-alias' uses regexp "[^- !#$%&'*+/0-9=?A-Za-z^_`{|}~]".
- (format (if (string-match "[][[:cntrl:]\177()<>@,;:.!$%[:nonascii:]]"
name)
- "\"%s\" <%s>"
- "%s <%s>")
- name mail))))
+ (let* ((name-base (or (slot-value mail 'aka) (ebdb-record-name record)))
+ (mail (slot-value mail 'mail))
+ (name
+ (cond
+ ((or (eq 'mail-only ebdb-mail-avoid-redundancy)
+ (and ebdb-mail-avoid-redundancy
+ (string-match-p
+ (regexp-quote
+ (replace-regexp-in-string
+ "\s" "" name-base))
+ (replace-regexp-in-string
+ "[-._]" "" (car (split-string mail "@"))))))
+ nil)
+ (name-base)
+ (t nil))))
+ (if name
+ (progn
+ ;; If the name contains backslashes or double-quotes, backslash them.
+ (setq name (replace-regexp-in-string "[\\\"]" "\\\\\\&" name))
+ ;; If the name contains control chars or RFC822 specials, it needs
+ ;; to be enclosed in quotes. This quotes a few extra characters as
+ ;; well (!,%, and $) just for common sense.
+ ;; `define-mail-alias' uses regexp "[^- !#$%&'*+/0-9=?A-Za-z^_`{|}~]".
+
+ (format (if (string-match "[][[:cntrl:]\177()<>@,;:.!$%[:nonascii:]]"
name)
+ "\"%s\" <%s>"
+ "%s <%s>")
+ name mail))
+ mail)))
(defun ebdb-compose-mail (&rest args)
"Start composing a mail message to send."
diff --git a/ebdb.el b/ebdb.el
index 109dc54..0061706 100644
--- a/ebdb.el
+++ b/ebdb.el
@@ -3602,31 +3602,13 @@ Whether this is used at all depends on the variable
`ebdb-check-postcode'."
-(defcustom ebdb-mail-name-format 'first-last
- "Format for names when sending mail.
-If first-last format names as \"Firstname Lastname\".
-If last-first format names as \"Lastname, Firstname\".
-If `ebdb-mail-name' returns the full name as a single string, this takes
-precedence over `ebdb-mail-name-format'. Likewise, if the mail address itself
-includes a name, this is not reformatted."
- :group 'ebdb-sendmail
- :type '(choice (const :tag "Firstname Lastname" first-last)
- (const :tag "Lastname, Firstname" last-first)))
-
-(defcustom ebdb-mail-name 'mail-name
- "Xfield holding the full name for a record when sending mail.
-This may also be a function taking one argument, a record.
-If it returns the full mail name as a single string, this is used \"as is\".
-If it returns a cons pair (FIRST . LAST) with the first and last name
-for this record, these are formatted obeying `ebdb-mail-name-format'."
- :group 'ebdb-sendmail
- :type '(choice (symbol :tag "xfield")
- (function :tag "mail name function")))
-
(defcustom ebdb-mail-avoid-redundancy nil
- "Mail address to use for EBDB records when sending mail.
-If non-nil do not use full name in mail address when same as mail.
-If value is mail-only never use full name."
+ "How to handle the name part of `ebdb-dwim-mail'.
+
+If nil, always return both name and mail. If value is mail-only
+never use full name. Other non-nil values mean do not use full
+name in mail address when same as mail.
+"
:group 'ebdb-sendmail
:type '(choice (const :tag "Allow redundancy" nil)
(const :tag "Never use full name" mail-only)