[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/ebdb 4a42233 4/6: Add new ebdb-mail-each command to ebd
From: |
Eric Abrahamsen |
Subject: |
[elpa] externals/ebdb 4a42233 4/6: Add new ebdb-mail-each command to ebdb-mode |
Date: |
Thu, 26 Jul 2018 16:26:06 -0400 (EDT) |
branch: externals/ebdb
commit 4a422338e3472e6c3de8f6a48e8be7b2c009c048
Author: Eric Abrahamsen <address@hidden>
Commit: Eric Abrahamsen <address@hidden>
Add new ebdb-mail-each command to ebdb-mode
* ebdb-com.el (ebdb-mail-each): New command for sending a separate
email to multiple records.
(ebdb-mode-map): Bind to "M".
* ebdb.org: Document.
---
ebdb-com.el | 56 ++++++++++++++++++++++++++++-
ebdb.info | 115 ++++++++++++++++++++++++++++++++++--------------------------
ebdb.org | 14 ++++++++
ebdb.texi | 13 +++++++
4 files changed, 147 insertions(+), 51 deletions(-)
diff --git a/ebdb-com.el b/ebdb-com.el
index 49c282b..76bd59c 100644
--- a/ebdb-com.el
+++ b/ebdb-com.el
@@ -32,7 +32,8 @@
(eval-and-compile
(autoload 'build-mail-aliases "mailalias")
(autoload 'browse-url-url-at-point "browse-url")
- (autoload 'eieio-customize-object "eieio-custom"))
+ (autoload 'eieio-customize-object "eieio-custom")
+ (autoload 'message-goto-body "message"))
(require 'crm)
(defvar ebdb-crm-local-completion-map
@@ -302,6 +303,7 @@ display information."
(define-key km (kbd "o") 'ebdb-omit-records)
(define-key km (kbd "m") 'ebdb-mail)
+ (define-key km (kbd "M") 'ebdb-mail-each)
(define-key km (kbd "M-d") 'ebdb-dial)
(define-key km (kbd "h") 'ebdb-info)
(define-key km (kbd "?") 'ebdb-help)
@@ -2343,6 +2345,58 @@ for `ebdb-field-action'."
(unless (string= "" to)
(ebdb-compose-mail to subject)))))
+;;;###autoload
+(defun ebdb-mail-each (records prompt subject cc bcc body-register)
+ "Compose a separate email to each of the records in RECORDS.
+RECORDS is either the marked records in an *EBDB* buffer, or (if
+no records are marked) all the records in the buffer. If PROMPT
+is non-nil, prompt the user to choose a mail address to use for
+each record that has more than one. SUBJECT is the subject to
+use for each message. CC is a list of address strings to put in
+the Cc field of each message. BCC likewise, for the Bcc field.
+BODY-REGISTER, if given, is a character indicating a register
+holding text to be inserted as the body of each message."
+ (interactive
+ (list (or (seq-filter (lambda (r) (nth 3 r)) ebdb-records)
+ (mapcar #'car ebdb-records))
+ current-prefix-arg
+ (ebdb-with-exit (ebdb-read-string "Subject header (C-g to skip): "))
+ (ebdb-loop-with-exit
+ (ebdb-dwim-mail
+ (ebdb-prompt-for-record
+ nil nil "Add record to Cc (C-g to skip): ")))
+ (ebdb-loop-with-exit
+ (ebdb-dwim-mail
+ (ebdb-prompt-for-record
+ nil nil "Add record to Bcc (C-g to skip): ")))
+ (let ((usable-registers
+ (seq-filter (lambda (pair) (stringp (cdr pair)))
+ register-alist)))
+ (when usable-registers
+ (ebdb-with-exit
+ (read-char-choice
+ "Register to use for body text (C-g to skip): "
+ (mapcar #'car usable-registers)))))))
+ (let ((cc (when cc (mapconcat #'identity cc ", ")))
+ (bcc (when bcc (mapconcat #'identity bcc ", ")))
+ (body (let ((reg (get-register body-register)))
+ (when (stringp reg)
+ reg)))
+ headers)
+ (when cc
+ (push (cons "Cc" cc) headers))
+ (when bcc
+ (push (cons "Bcc" bcc) headers))
+ (dolist (rec records)
+ (funcall #'ebdb-field-mail-compose
+ rec (ebdb-record-one-mail rec prompt)
+ subject headers)
+ (when body
+ (message-goto-body)
+ (save-excursion
+ ;; `register-val-insert' is too new.
+ (insert-for-yank body))))))
+
;;; Citing
(defun ebdb-cite-records-ebdb (arg records style)
diff --git a/ebdb.info b/ebdb.info
index 3ad612a..10bf542 100644
--- a/ebdb.info
+++ b/ebdb.info
@@ -1030,6 +1030,17 @@ keybindings apply.
Begin composing a message to the record under point (‘ebdb-mail’).
With a prefix arg, prompt for the mail address to use; otherwise
use the record’s primary address.
+‘M’
+ Begin composing a separate message to each marked record in the
+ current {{{buf(EBDB)}} buffer, or all records in the buffer if none
+ are marked. In addition, prompt for a common subject header line
+ to use for each message, as well as records to add to the “Cc” and
+ “Bcc” headers. Then optionally prompt for a character, interpreted
+ as the name of a register. If that register contains text, insert
+ the text as the body of each message.
+
+ This function works as a sort of poor-man’s mail merge; it lacks
+ the ability to interpolate variables in the body text.
‘t’
Toggle between a multi-line and one-line display (see *note
@@ -2029,7 +2040,7 @@ Index
* ; t: Interactive Commands.
(line 42)
* ?: The Basics of ebdb-mode.
- (line 103)
+ (line 114)
* ^: Searching. (line 55)
* Article snarfing: Snarfing. (line 36)
* Article snarfing <1>: Article snarfing. (line 6)
@@ -2090,14 +2101,14 @@ Index
(line 12)
* ebdb-cite-records: Citing Records. (line 11)
* ebdb-cite-records-ebdb: The Basics of ebdb-mode.
- (line 77)
+ (line 88)
* ebdb-clone-buffer: EBDB Buffers. (line 19)
* ebdb-copy-fields-as-kill: The Basics of ebdb-mode.
- (line 84)
+ (line 95)
* ebdb-copy-mail-as-kill: The Basics of ebdb-mode.
- (line 93)
+ (line 104)
* ebdb-copy-records-as-kill: The Basics of ebdb-mode.
- (line 89)
+ (line 100)
* ebdb-create-record: Creating Records. (line 6)
* ebdb-create-record <1>: The Basics of ebdb-mode.
(line 22)
@@ -2134,7 +2145,7 @@ Index
* ebdb-delete-record-or-field: Deleting Records and Fields.
(line 6)
* ebdb-display-records-completely: The Basics of ebdb-mode.
- (line 66)
+ (line 77)
* ebdb-edit-field: Editing Existing Fields.
(line 6)
* ebdb-edit-field <1>: The Basics of ebdb-mode.
@@ -2156,7 +2167,7 @@ Index
* ebdb-hash-extra-predicates: Fast Lookups. (line 30)
* ebdb-hashtable: Fast Lookups. (line 10)
* ebdb-help: The Basics of ebdb-mode.
- (line 103)
+ (line 114)
* ebdb-i18n-countries: Internationalization.
(line 44)
* ebdb-i18n-countries-pref-scripts: Internationalization.
@@ -2164,7 +2175,7 @@ Index
* ebdb-ignore-header-list: Auto-Updating Records.
(line 44)
* ebdb-info: The Basics of ebdb-mode.
- (line 106)
+ (line 117)
* ebdb-init-field: Init and Delete Methods.
(line 12)
* ebdb-insert-field: Inserting New Fields.
@@ -2176,6 +2187,8 @@ Index
(line 24)
* ebdb-mail: The Basics of ebdb-mode.
(line 56)
+* ebdb-mail-each: The Basics of ebdb-mode.
+ (line 60)
* ebdb-make-buffer-name: Writing Integration For New MUAs.
(line 54)
* ebdb-message-clean-name-function: Sender name display. (line 14)
@@ -2236,7 +2249,7 @@ Index
* ebdb-notice-record-hook: Noticing and Automatic Rules.
(line 11)
* ebdb-omit-records: The Basics of ebdb-mode.
- (line 73)
+ (line 84)
* ebdb-org-agenda-popup: Org Integration. (line 32)
* ebdb-popup-window: Writing Integration For New MUAs.
(line 60)
@@ -2248,10 +2261,10 @@ Index
(line 50)
* ebdb-record-self: Creating Records. (line 21)
* ebdb-reformat-records: The Basics of ebdb-mode.
- (line 70)
+ (line 81)
* ebdb-rename-buffer: EBDB Buffers. (line 23)
* ebdb-save: The Basics of ebdb-mode.
- (line 109)
+ (line 120)
* ebdb-save-on-exit: The EBDB Database. (line 78)
* ebdb-search-invert: Searching. (line 49)
* ebdb-search-pop: Searching. (line 55)
@@ -2264,7 +2277,7 @@ Index
* ebdb-snarf-routines: Snarfing. (line 26)
* ebdb-sources: The EBDB Database. (line 11)
* ebdb-toggle-records-format: The Basics of ebdb-mode.
- (line 61)
+ (line 72)
* ebdb-try-speedups: The EBDB Database. (line 84)
* ebdb-use-diary: Diary Integration. (line 13)
* ebdb-user-name-address-re: Auto-Updating Records.
@@ -2279,15 +2292,15 @@ Index
(line 50)
* Field actions <1>: Actions. (line 6)
* g: The Basics of ebdb-mode.
- (line 100)
+ (line 111)
* h: The Basics of ebdb-mode.
- (line 106)
+ (line 117)
* i: Inserting New Fields.
(line 6)
* i <1>: The Basics of ebdb-mode.
(line 30)
* I: The Basics of ebdb-mode.
- (line 77)
+ (line 88)
* Inserting new fields: Inserting New Fields.
(line 6)
* Internationalization: Internationalization.
@@ -2296,6 +2309,8 @@ Index
* Loading databases: The EBDB Database. (line 84)
* m: The Basics of ebdb-mode.
(line 56)
+* M: The Basics of ebdb-mode.
+ (line 60)
* Mail aliases: Mail Aliases. (line 6)
* Migration from BBDB: Migration from BBDB. (line 6)
* Migration from Org Contacts: Migration from Org Contacts.
@@ -2309,39 +2324,39 @@ Index
* N: The Basics of ebdb-mode.
(line 16)
* o: The Basics of ebdb-mode.
- (line 73)
+ (line 84)
* p: The Basics of ebdb-mode.
(line 13)
* P: The Basics of ebdb-mode.
(line 19)
* q: The Basics of ebdb-mode.
- (line 112)
+ (line 123)
* quit-window: The Basics of ebdb-mode.
- (line 112)
+ (line 123)
* r: The Basics of ebdb-mode.
- (line 70)
+ (line 81)
* read-only of Database: The EBDB Database. (line 20)
* record-class of Database: The EBDB Database. (line 37)
* RET: The Basics of ebdb-mode.
(line 50)
* revert-buffer: The Basics of ebdb-mode.
- (line 100)
+ (line 111)
* s: The Basics of ebdb-mode.
- (line 109)
+ (line 120)
* Saving the database: The EBDB Database. (line 78)
* Search history: Searching. (line 51)
* Searching the EBDB: Searching. (line 6)
* Snarfing text: Snarfing. (line 6)
* t: The Basics of ebdb-mode.
- (line 61)
+ (line 72)
* T: The Basics of ebdb-mode.
- (line 66)
+ (line 77)
* w f: The Basics of ebdb-mode.
- (line 84)
+ (line 95)
* w m: The Basics of ebdb-mode.
- (line 93)
+ (line 104)
* w r: The Basics of ebdb-mode.
- (line 89)
+ (line 100)
@@ -2378,30 +2393,30 @@ Node: EBDB Buffers31129
Node: Searching32342
Node: Changing Search Behavior34004
Node: The Basics of ebdb-mode35251
-Node: Customizing Record Display38944
-Node: Marking43264
-Node: Exporting/Formatting43691
-Node: Completion44640
-Node: Snarfing45838
-Node: Internationalization47855
-Node: Diary Integration50554
-Node: Mail Aliases51419
-Node: vCard Support52133
-Node: Org Integration52632
-Node: Citing Records54530
-Node: Hacking EBDB55288
-Node: Field Classes57607
-Node: Init and Delete Methods60738
-Node: The Labeled Field Class62245
-Node: The Singleton Field Class63099
-Node: Actions63537
-Node: Custom Field Searching64209
-Node: Fast Lookups67076
-Node: Formatting in the EBDB Buffer68886
-Node: Writing Internationalization Libraries70962
-Node: Writing Integration For New MUAs75376
-Node: Article snarfing78823
-Node: Index79541
+Node: Customizing Record Display39566
+Node: Marking43886
+Node: Exporting/Formatting44313
+Node: Completion45262
+Node: Snarfing46460
+Node: Internationalization48477
+Node: Diary Integration51176
+Node: Mail Aliases52041
+Node: vCard Support52755
+Node: Org Integration53254
+Node: Citing Records55152
+Node: Hacking EBDB55910
+Node: Field Classes58229
+Node: Init and Delete Methods61360
+Node: The Labeled Field Class62867
+Node: The Singleton Field Class63721
+Node: Actions64159
+Node: Custom Field Searching64831
+Node: Fast Lookups67698
+Node: Formatting in the EBDB Buffer69508
+Node: Writing Internationalization Libraries71584
+Node: Writing Integration For New MUAs75998
+Node: Article snarfing79445
+Node: Index80163
End Tag Table
diff --git a/ebdb.org b/ebdb.org
index 481fb90..1f46c20 100644
--- a/ebdb.org
+++ b/ebdb.org
@@ -917,6 +917,20 @@ keybindings apply.
Begin composing a message to the record under point
(~ebdb-mail~). With a prefix arg, prompt for the mail address to
use; otherwise use the record's primary address.
+- M ::
+
+ #+KINDEX: M
+ #+FINDEX: ebdb-mail-each
+ Begin composing a separate message to each marked record in the
+ current {{{buf(EBDB)}} buffer, or all records in the buffer if
+ none are marked. In addition, prompt for a common subject header
+ line to use for each message, as well as records to add to the
+ "Cc" and "Bcc" headers. Then optionally prompt for a character,
+ interpreted as the name of a register. If that register contains
+ text, insert the text as the body of each message.
+
+ This function works as a sort of poor-man's mail merge; it lacks
+ the ability to interpolate variables in the body text.
- t ::
diff --git a/ebdb.texi b/ebdb.texi
index 00f62ad..c5c5369 100644
--- a/ebdb.texi
+++ b/ebdb.texi
@@ -1124,6 +1124,19 @@ that mail address
Begin composing a message to the record under point
(@code{ebdb-mail}). With a prefix arg, prompt for the mail address to
use; otherwise use the record's primary address.
address@hidden M
address@hidden M
address@hidden ebdb-mail-each
+Begin composing a separate message to each marked record in the
+current @address@hidden@{buf(EBDB)@address@hidden buffer, or all records in
the buffer if
+none are marked. In addition, prompt for a common subject header
+line to use for each message, as well as records to add to the
+``Cc'' and ``Bcc'' headers. Then optionally prompt for a character,
+interpreted as the name of a register. If that register contains
+text, insert the text as the body of each message.
+
+This function works as a sort of poor-man's mail merge; it lacks
+the ability to interpolate variables in the body text.
@item t
@kindex t
- [elpa] externals/ebdb updated (9218d7c -> 784d669), Eric Abrahamsen, 2018/07/26
- [elpa] externals/ebdb 3f3e7bf 2/6: Add a "prompt" argument to ebdb-prompt-for-record, Eric Abrahamsen, 2018/07/26
- [elpa] externals/ebdb e853b8c 5/6: Quote custom type, Eric Abrahamsen, 2018/07/26
- [elpa] externals/ebdb 77fa3b2 1/6: New option ebdb-mua-default-formatter, Eric Abrahamsen, 2018/07/26
- [elpa] externals/ebdb 4a42233 4/6: Add new ebdb-mail-each command to ebdb-mode,
Eric Abrahamsen <=
- [elpa] externals/ebdb 8f3a331 3/6: Refactor record mail commands, Eric Abrahamsen, 2018/07/26
- [elpa] externals/ebdb 784d669 6/6: New option ebdb-gnus-post-style-function, Eric Abrahamsen, 2018/07/26