Rod> Jamie, do you intend to include the second part of the patch Rod> in BBDB distribution (the part that allows the STRING field Rod> of the auto-notes-alist record to be a string, integer or Rod> function) ? Jamie> Sure, looks fine. Joe> Here is a small suggestion. If the item is a function, the Joe> function should be called with a buffer and region rather Joe> than with a string, to avoid making strings. My intention is to allow the user to either: 1/ Munge the string returned from the field before it is stored in the BBDB record (i.e. add spaces after the commas in a `Newsgroups:' field). 2/ Generate a completely new string to be stored in the BBDB record (i.e. extract the value of an `Archive-name:' auxiliary header). As `fieldval' is already available as a string (it is made on line 345 of bbdb-hooks.el), why is it better to pass a buffer and region ? Jamie, here is a reworked patch for bbdb-hooks (against virgin 1.48) which adds the new function calling stuff (I fixed a few bugs), and also defines a function that can be used to extract auxiliary headers (i.e. the `Archive-name:' header): =================================================================== RCS file: /home/bing/rwhitby/src/elib/bbdb/RCS/bbdb-hooks.el,v retrieving revision 1.1.1.2 diff -c -r1.1.1.2 /home/bing/rwhitby/src/elib/bbdb/bbdb-hooks.el *** 1.1.1.2 1993/04/07 01:08:35 --- /home/bing/rwhitby/src/elib/bbdb/bbdb-hooks.el 1993/08/05 05:45:19 *************** *** 114,119 **** --- 114,136 ---- done)) + (defun bbdb-extract-auxiliary-field-value (field-name) + "Given the name of a auxiliary field (like \"Archive-name\") this returns + the value of that field in the current message, or nil. This works whether + you're in GNUS, Rmail, or VM. This works on multi-line fields, but if more + than one auxiliary field of the same name is present, only the last is + returned. It is expected that the current buffer has a message in it, and + that (point) is at the beginning of the message headers." + ;; Skip to the start of the body + (re-search-forward "\n\n" (point-max) 'move) + ;; Skip any extra empty lines + (while (looking-at "^$") + (forward-line 1)) + ;; Extract the auxiliary field + (bbdb-extract-field-value field-name) + ) + + (defvar bbdb-ignore-most-messages-alist '() "*An alist describing which messages to automatically create BBDB records for. This only works if bbdb/news-auto-create-p or *************** *** 226,236 **** --- 243,260 ---- (\"Organization\" (\".*\" company \"\\\\&\")) \(Note you need two \\ to get a single \\ into a lisp string literal.\) + If STRING is an integer N, the N'th matching subexpression is used, so the above example could be written more efficiently as (\"Organization\" (\".*\" company 0)) + If STRING is neither a string or an integer, it should be a function + which is called with the contents of the field, and the result of the + function call is used. So the above example could also be written as + + (\"Organization\" (\".*\" company '(lambda (fieldval) fieldval))) + If REPLACE-P is t, the string replaces the old contents instead of being appended to it. *************** *** 340,354 **** (not (string-match re fieldval)) t))))) ;; An integer as STRING is an index into match-data: (if did-match (setq string ! (if (integerp string) ; backward compat ! (substring fieldval ! (match-beginning string) ! (match-end string)) ! (bbdb-auto-expand-newtext fieldval string)))) ;; need expanded version of STRING here: (if (and did-match (not (and notes ;; check that STRING is not already ;; present in the NOTES field --- 364,385 ---- (not (string-match re fieldval)) t))))) ;; An integer as STRING is an index into match-data: + ;; A function as STRING calls the function on fieldval: (if did-match (setq string ! (cond ((integerp string) ; backward compat ! (substring fieldval ! (match-beginning string) ! (match-end string))) ! ((stringp string) ! (bbdb-auto-expand-newtext fieldval string)) ! (t ! (goto-char marker) ! (funcall string fieldval)) ! ))) ;; need expanded version of STRING here: (if (and did-match + string ; A function as STRING may return nil (not (and notes ;; check that STRING is not already ;; present in the NOTES field =================================================================== -- --------------------------------------------- _--_|\ | Rod Whitby ([EMAIL PROTECTED]) / \ | Canon Information Systems Research Australia \_.--._/ | 1 Thomas Holt Drive, North Ryde, N.S.W., 2113. v |