Hi Sacha,
I am trying to understand this better and I have a query. How is this functionality different from the mail-alias field. Even that can have multiple tags and you can list all entries containing a certain tag.
regards -- mitra
Sacha Chua wrote:
Hiya, everyone!
I was thinking about contact management with BBDB
(http://sacha.free.net.ph/notebook/wiki/2005.05.06.php#1). Tags seemed
like a neat way to organize my contacts, and I thought I'd share the
results of an hour's fun hacking with you. If you add a tags: field to
your BBDB records and set this to a space-delimited list of tags
(case-sensitive for now), then you can use sacha/bbdb-search-tags to
display all records matching a set of tags.
You can also use sacha/planner-bbdb-insert-tags-alist to insert an index of entries into a PlannerMode page. (Planner is this ultracool personal information manager for Emacs that I'm so totally in love with. http://www.emacswiki.org/cgi-bin/wiki/PlannerMode)
----------------------------------------------------------------
(defun sacha/bbdb-get-tags (record)
"Return the tags for RECORD as a list."
(let ((tags (bbdb-record-getprop record 'tags)))
(when tags (split-string tags))))
(defun sacha/bbdb-test-tags (query tags)
"Return non-nil if QUERY is a subset of TAGS."
(let ((result t))
(while (and result query)
(unless (member (car query) tags)
(setq result nil))
(setq query (cdr query)))
result))
(defun sacha/bbdb-search-tags-internal (records tags)
"Return a list of RECORDS matching TAGS."
(when (stringp tags) (setq tags (split-string tags)))
(let (result)
(while records
(when (sacha/bbdb-test-tags tags
(sacha/bbdb-get-tags (car records)))
(setq result (cons (car records) result)))
(setq records (cdr records)))
result))
(defun sacha/bbdb-search-tags (tags) "Display all the records that match TAGS." (interactive "MTags: ") (bbdb-display-records (sacha/bbdb-search-tags-internal (bbdb-records) tags)))
(defun sacha/planner-bbdb-link (record) "Return a link to RECORD." (or (bbdb-record-getprop record 'plan) ;; From a BBDB entry with a plan page; use that. Yay! (concat "[[bbdb://" (emacs-wiki-replace-regexp-in-string " " "." (bbdb-record-name record)) "][" (or (bbdb-record-getprop record 'nick) (bbdb-record-name record)) "]]")))
(defun sacha/bbdb-get-tags-index () "Return a list of tags and records." (let ((tags-alist '()) (records (bbdb-records)) tags entry list link) (while records (setq tags (sacha/bbdb-get-tags (car records))) (while tags (setq entry (assoc (car tags) tags-alist)) (setq list (cdr entry)) (add-to-list 'list (car records)) (if entry (setcdr entry list) (add-to-list 'tags-alist (cons (car tags) list))) (setq tags (cdr tags))) (setq records (cdr records))) tags-alist))
(defun sacha/planner-bbdb-insert-tags-alist (&optional tag-alist)
"Insert TAG-ALIST into the current buffer."
(interactive)
(unless tag-alist (setq tag-alist (sacha/bbdb-get-tags-index)))
(insert (mapconcat
(lambda (item)
(concat (car item) " | "
(mapconcat
'sacha/planner-bbdb-link
(cdr item)
",")))
tag-alist
"\n")))
----------------------------------------------------------------
I'm going to refine this by making it easier to insert lists for a single tag. I'm also going to tweak the linking function because I'm starting to have problems disambiguating BBDB records. I'm thinking of using a numeric ID field and then letting hippie-expansion and functions convert familiar names into links containing the IDs. Then I'm going to improve the cross-referencing with my wiki pages... =)
I might also just move all of this information into a set of wiki pages (one page per person) but BBDB lets me prototype quickly. It's so cool!
------------------------------------------------------- This SF.Net email is sponsored by: NEC IT Guy Games. Get your fingers limbered up and give it your best shot. 4 great events, 4 opportunities to win big! Highest score wins.NEC IT Guy Games. Play to win an NEC 61 plasma display. Visit http://www.necitguy.com/?r=20 _______________________________________________ bbdb-info@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/bbdb-info BBDB Home Page: http://bbdb.sourceforge.net/