Ok, this time I have a patch. Here is what I wanted to do: I wanted two new layouts -- one suitable for printing all the info I would like to carry around and hand to my girlfriend, and one for phone numbers only to keep by the phone.
(add-to-list 'bbdb-display-layout-alist '(printable (order net icq aim irc-nick phones addresses notes www) (indentation . 6) (primary . t) (toggle . t))) (add-to-list 'bbdb-display-layout-alist '(phonebook (order phones) (indentation . 10) (toggle . t) (test and name phones))) This requires a patch to recognize the two new options in bbdb-display-layout-alist entries, primary and test, and for convenience a function to select the display directly without toggling (because if you use a test attribute, some records might disappear, so if you have four displays A B C D and you want to use D and records disappear in C, then there is no way to show those records in D. * lisp/bbdb.el (bbdb-display-layout-alist): Extended custom type to include primary and test, and fixed phone to phones, and address to addresses. (bbdb-format-record-layout-one-line): Take primary into account. (bbdb-format-record-layout-multi-line): Take primary into account. (bbdb-format-record): Take test into account, use multi-line layout function if none was found. * lisp/bbdb-com.el (bbdb-display-record-with-layout): New. (bbdb-toggle-all-records-display-layout): Print layout used. Cheers, Alex. *** bbdb.el.~1.196.~ Mon Dec 2 23:00:45 2002 --- bbdb.el Sun Dec 22 11:41:16 2002 *************** *** 1209,1214 **** --- 1209,1216 ---- (omit . FIELD-LIST) + + nil (name-end . INTEGER) + - 40 (indentation . INTEGER) - + 14 + (primary . BOOL) - + nil + (test . SEXP) + + nil - toggle: controls if this layout is included when toggeling the display layout - order: defines a user specific order for the fields, where `t' is a place *************** *** 1216,1222 **** - omit: is a list of fields which should not be displayed or `t' to exclude all fields except those listed in the order option - name-end: sets the column where the name should end in one-line layout. ! - indentation: sets the level of indentation for multi-line display." :group 'bbdb :type `(repeat --- 1218,1230 ---- - omit: is a list of fields which should not be displayed or `t' to exclude all fields except those listed in the order option - name-end: sets the column where the name should end in one-line layout. ! - indentation: sets the level of indentation for multi-line display. ! - primary: controls wether only the primary net is shown or all are shown. ! - test: a lisp expression controlling wether the record is to be displayed. ! ! When you add a new layout FOO, you can write a corresponding layout ! function bbdb-format-record-layout-FOO. If you do not write your own ! layout function, the multi-line layout will be used." :group 'bbdb :type `(repeat *************** *** 1224,1236 **** (choice :tag "Layout type" (const one-line) (const multi-line) (const full-multi-line) (symbol)) (set :tag "Properties" (cons :tag "Order" (const :tag "List of fields to order by" order) ! (repeat (choice (const phone) ! (const address) (const net) (const AKA) (const notes) --- 1232,1245 ---- (choice :tag "Layout type" (const one-line) (const multi-line) + (const pop-up-multi-line) (const full-multi-line) (symbol)) (set :tag "Properties" (cons :tag "Order" (const :tag "List of fields to order by" order) ! (repeat (choice (const phones) ! (const addresses) (const net) (const AKA) (const notes) *************** *** 1240,1247 **** :value (omit . nil) (cons :tag "List of fields to omit" (const :tag "Fields not to display" omit) ! (repeat (choice (const phone) ! (const address) (const net) (const AKA) (const notes) --- 1249,1256 ---- :value (omit . nil) (cons :tag "List of fields to omit" (const :tag "Fields not to display" omit) ! (repeat (choice (const phones) ! (const addresses) (const net) (const AKA) (const notes) *************** *** 1259,1265 **** (number :tag "Column")) (cons :tag "Toggle" (const :tag "The layout is included when toggling display layout" toggle) ! boolean))))) (defcustom bbdb-display-layout 'multi-line "*The default display layout." --- 1268,1291 ---- (number :tag "Column")) (cons :tag "Toggle" (const :tag "The layout is included when toggling display layout" toggle) ! boolean) ! (cons :tag "Primary Net Only" ! (const :tag "Only the primary net address is included" primary) ! boolean) ! (cons :tag "Test" ! (const :tag "Show only records passing this test" test) ! (choice (const :tag "No test" nil) ! (cons :tag "List of required fields" ! (const :tag "Choose from the attributes in the following set:" and) ! (set ! (const name) ! (const company) ! (const net) ! (const phones) ! (const addresses) ! (const notes))) ! (sexp :tag "Lisp expression"))))))) ! (defcustom bbdb-display-layout 'multi-line "*The default display layout." *************** *** 1459,1464 **** --- 1485,1492 ---- (put-text-property start (point) 'bbdb-field (list 'net net)))) (defun bbdb-format-record-layout-one-line (layout record field-list) + "Record formatting function for the one-line layout. + See `bbdb-display-layout-alist' for more." ;; name and company (bbdb-format-record-name-company record) (let ((name-end (or (bbdb-display-layout-get-option layout 'name-end) *************** *** 1474,1480 **** ;; guarantee one space after name - company (insert " ") (indent-to name-end)) - ;; rest of the fields (let (start field contentfun formatfun values value) (while field-list --- 1502,1507 ---- *************** *** 1484,1489 **** --- 1511,1519 ---- (if (fboundp contentfun) (setq values (eval (list contentfun record))) (setq values (bbdb-record-getprop record field))) + (when (and (eq field 'net) + (bbdb-display-layout-get-option layout 'primary)) + (setq values (list (car values)))) (when values (if (not (listp values)) (setq values (list values))) (setq formatfun (intern (format "bbdb-format-record-%s-%s" *************** *** 1515,1535 **** (insert "\n")) (defun bbdb-format-record-layout-multi-line (layout record field-list) (bbdb-format-record-name-company record) (insert "\n") - (let* ((notes (bbdb-record-raw-notes record)) (indent (or (bbdb-display-layout-get-option layout 'indentation) 14)) (fmt (format " %%%ds: " indent)) start field) - (if (stringp notes) (setq notes (list (cons 'notes notes)))) - (while field-list (setq field (car field-list) start (point)) - (cond ((eq field 'phones) (let ((phones (bbdb-record-phones record)) loc phone) --- 1545,1563 ---- (insert "\n")) (defun bbdb-format-record-layout-multi-line (layout record field-list) + "Record formatting function for the multi-line layout. + See `bbdb-display-layout-alist' for more." (bbdb-format-record-name-company record) (insert "\n") (let* ((notes (bbdb-record-raw-notes record)) (indent (or (bbdb-display-layout-get-option layout 'indentation) 14)) (fmt (format " %%%ds: " indent)) start field) (if (stringp notes) (setq notes (list (cons 'notes notes)))) (while field-list (setq field (car field-list) start (point)) (cond ((eq field 'phones) (let ((phones (bbdb-record-phones record)) loc phone) *************** *** 1571,1577 **** (put-text-property start (point) 'bbdb-field '(net field-name)) (setq start (point)) ! (insert (mapconcat (function identity) net ", ") "\n") (put-text-property start (point) 'bbdb-field '(net))))) ((eq field 'aka) (let ((aka (bbdb-record-aka record))) --- 1599,1607 ---- (put-text-property start (point) 'bbdb-field '(net field-name)) (setq start (point)) ! (if (bbdb-display-layout-get-option layout 'primary) ! (insert (car net) "\n") ! (insert (mapconcat (function identity) net ", ") "\n")) (put-text-property start (point) 'bbdb-field '(net))))) ((eq field 'aka) (let ((aka (bbdb-record-aka record))) *************** *** 1604,1611 **** (insert (make-string indent ?\ ))))) (insert "\n")) (put-text-property start (point) 'bbdb-field ! (list 'property note)))) ! ) (setq field-list (cdr field-list))))) (defalias 'bbdb-format-record-layout-full-multi-line --- 1634,1640 ---- (insert (make-string indent ?\ ))))) (insert "\n")) (put-text-property start (point) 'bbdb-field ! (list 'property note))))) (setq field-list (cdr field-list))))) (defalias 'bbdb-format-record-layout-full-multi-line *************** *** 1616,1638 **** (defun bbdb-format-record (record &optional layout) "Insert a formatted version of RECORD into the current buffer. ! LAYOUT can be `one-line' for one-line layout and ! `multi-line' for multi-line layout. ! For compatibility reasons one might alos write t for one-line and nil for multi-line layout." (bbdb-debug (if (bbdb-record-deleted-p record) (error "plus ungood: formatting deleted record"))) - (setq layout (cond ((eq nil layout) 'multi-line) ! ((eq t layout) 'one-line) ((symbolp layout) layout) (t (error "Unknown layout `%s'" layout)))) - (let* ((layout-spec (assoc layout bbdb-display-layout-alist)) (omit-list (bbdb-display-layout-get-option layout-spec 'omit)) (order-list (bbdb-display-layout-get-option layout-spec 'order)) (all-fields (append '(phones addresses net aka) --- 1645,1667 ---- (defun bbdb-format-record (record &optional layout) "Insert a formatted version of RECORD into the current buffer. ! ! LAYOUT can be a symbol describing a layout in ! `bbdb-display-layout-alist'. For compatibility reasons, LAYOUT can ! also be nil or t, where t stands for the one-line, and nil for the multi-line layout." (bbdb-debug (if (bbdb-record-deleted-p record) (error "plus ungood: formatting deleted record"))) (setq layout (cond ((eq nil layout) 'multi-line) ! ((eq t layout) 'one-line) ((symbolp layout) layout) (t (error "Unknown layout `%s'" layout)))) (let* ((layout-spec (assoc layout bbdb-display-layout-alist)) + (test (bbdb-display-layout-get-option layout-spec 'test)) (omit-list (bbdb-display-layout-get-option layout-spec 'omit)) (order-list (bbdb-display-layout-get-option layout-spec 'order)) (all-fields (append '(phones addresses net aka) *************** *** 1641,1683 **** '(notes) (mapcar (lambda (r) (car r)) raw-notes))))) format-function field-list) ! ! (if (functionp omit-list) ! (setq omit-list (funcall omit-list record layout))) ! (if (functionp order-list) ! (setq order-list (funcall order-list record layout))) ! ! ;; first omit unwanted records ! (when (and omit-list (or (not order-list) (memq t order-list))) ! (if (not (listp omit-list)) ! ;; t => show nothing ! (setq all-fields nil) ! ;; listp => show all fields except those listed here ! (while omit-list ! (setq all-fields (delete (car omit-list) all-fields) ! omit-list (cdr omit-list))))) ! ! ;; then order them ! (if (not order-list) ! (setq field-list all-fields) ! (if (not (memq t order-list)) ! (setq field-list order-list) ! (setq order-list (reverse order-list)) ! (setq all-fields (delete nil (mapcar (lambda (f) ! (if (memq f order-list) nil f)) ! all-fields))) ! (while order-list ! (if (eq t (car order-list)) ! (setq field-list (append all-fields field-list)) ! (setq field-list (cons (car order-list) field-list))) ! (setq order-list (cdr order-list))))) ! ! ;; call the actual format function ! (setq format-function ! (intern (format "bbdb-format-record-layout-%s" layout))) ! (if (functionp format-function) ! (funcall format-function layout record field-list) ! (error "No format function for layout `%s'!" layout)))) (defun bbdb-frob-mode-line (n) (setq mode-line-buffer-identification --- 1670,1720 ---- '(notes) (mapcar (lambda (r) (car r)) raw-notes))))) format-function field-list) ! (when (or (not test) ! ;; bind some variables for the test ! (let ((name (bbdb-record-name record)) ! (company (bbdb-record-company record)) ! (net (bbdb-record-net record)) ! (phones (bbdb-record-phones record)) ! (addresses (bbdb-record-addresses record)) ! (notes (bbdb-record-raw-notes record))) ! ;; this must evaluate to non-nil if the record is to be shown ! (eval test))) ! (if (functionp omit-list) ! (setq omit-list (funcall omit-list record layout))) ! (if (functionp order-list) ! (setq order-list (funcall order-list record layout))) ! ;; first omit unwanted fields ! (when (and omit-list (or (not order-list) (memq t order-list))) ! (if (not (listp omit-list)) ! ;; t => show nothing ! (setq all-fields nil) ! ;; listp => show all fields except those listed here ! (while omit-list ! (setq all-fields (delete (car omit-list) all-fields) ! omit-list (cdr omit-list))))) ! ;; then order them ! (if (not order-list) ! (setq field-list all-fields) ! (if (not (memq t order-list)) ! (setq field-list order-list) ! (setq order-list (reverse order-list)) ! (setq all-fields (delete nil (mapcar (lambda (f) ! (if (memq f order-list) ! nil ! f)) ! all-fields))) ! (while order-list ! (if (eq t (car order-list)) ! (setq field-list (append all-fields field-list)) ! (setq field-list (cons (car order-list) field-list))) ! (setq order-list (cdr order-list))))) ! ;; call the actual format function ! (setq format-function ! (intern (format "bbdb-format-record-layout-%s" layout))) ! (if (functionp format-function) ! (funcall format-function layout record field-list) ! (bbdb-format-record-layout-multi-line layout record field-list))))) (defun bbdb-frob-mode-line (n) (setq mode-line-buffer-identification *************** *** 1763,1770 **** (setq records (cdr records)))) (and (not bbdb-gag-messages) (not bbdb-silent-running) ! (message "Formatting...done.")) ! ) (set-buffer bbdb-buffer-name) (if (and append first) (let ((cons (assq first bbdb-records)) --- 1800,1806 ---- (setq records (cdr records)))) (and (not bbdb-gag-messages) (not bbdb-silent-running) ! (message "Formatting...done."))) (set-buffer bbdb-buffer-name) (if (and append first) (let ((cons (assq first bbdb-records)) *** bbdb-com.el.~1.154.~ Mon Sep 23 13:07:34 2002 --- bbdb-com.el Sun Dec 22 11:51:33 2002 *************** *** 1498,1503 **** --- 1498,1504 ---- (caar layout-alist)) (t (caadr (memq desired-state layout-alist))))) + (message "Using %S layout" desired-state) (bbdb-change-records-state-and-redisplay desired-state records))) ;;;###autoload *************** *** 1548,1553 **** --- 1549,1567 ---- arg (if (not (bbdb-do-all-records-p)) (list (assq (bbdb-current-record) bbdb-records))))) + + ;;;###autoload + (defun bbdb-display-record-with-layout (layout &optional records) + "Show all the fields of the current record using LAYOUT." + (interactive (list (completing-read "Layout: " + (mapcar (lambda (i) + (list (symbol-name (car i)))) + bbdb-display-layout-alist)))) + (when (stringp layout) + (setq layout (intern layout))) + (when (null records) + (setq records bbdb-records)) + (bbdb-change-records-state-and-redisplay layout records)) ;;;###autoload (defun bbdb-omit-record (n) ------------------------------------------------------- This sf.net email is sponsored by:ThinkGeek Welcome to geek heaven. http://thinkgeek.com/sf _______________________________________________ [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/bbdb-info BBDB Home Page: http://bbdb.sourceforge.net/