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! -- Sacha Chua <[EMAIL PROTECTED]> - open source geekette http://sacha.free.net.ph/ - PGP Key ID: 0xE7FDF77C interests: emacs, gnu/linux, personal information management, CS ed sachac on irc.freenode.net#emacs . YM: sachachua83 ------------------------------------------------------- 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/