diff options
author | Barak A. Pearlmutter <bap@debian.org> | 2010-04-20 15:18:13 -0400 |
---|---|---|
committer | Barak A. Pearlmutter <bap@debian.org> | 2010-04-20 15:18:13 -0400 |
commit | 0960d4900c9bc749cd72e3d928e8cfbe081712ea (patch) | |
tree | a9e6d9f90ba35dd7f1fdb68a96f08808380bfbbe /texinfo/bbdb.texinfo |
Import bbdb_2.36.orig.tar.gz
[dgit import orig bbdb_2.36.orig.tar.gz]
Diffstat (limited to 'texinfo/bbdb.texinfo')
-rw-r--r-- | texinfo/bbdb.texinfo | 3978 |
1 files changed, 3978 insertions, 0 deletions
diff --git a/texinfo/bbdb.texinfo b/texinfo/bbdb.texinfo new file mode 100644 index 0000000..27cfed8 --- /dev/null +++ b/texinfo/bbdb.texinfo @@ -0,0 +1,3978 @@ +\input texinfo @c -*-texinfo-*- -*- coding: iso-latin-1 -*- +@c %**start of header +@setfilename bbdb.info +@settitle Insidious Big Brother Database User Manual +@c %**end of header + +@ifinfo +@dircategory Emacs +@direntry +* BBDB: (bbdb). The Insidious Big Brother Database. +@end direntry + +This file documents the Insidious Big Brother Database + +This is the BBDB User Manual for BBDB version 2.36. + +Copyright (c) 1991-1994 Jamie Zawinski <jwz@@netscape.com> + +Copyright (c) 1997-1999 Matt Simmons <simmonmt@@acm.org> + +Copyright (c) 2000-present The BBDB Development Team +@end ifinfo + +@titlepage +@title BBDB User Manual +@subtitle A phone number and address database program for Emacs + +@author by Jamie Zawinski, Matt Simmons and the BBDB Development Team +@page +Copyright @copyright{} 1991-1994 Jamie Zawinski <jwz@@netscape.com> + +Copyright @copyright{} 1997-1999 Matt Simmons <simmonmt@@acm.org> + +Copyright @copyright{} 2000-present The BBDB Development Team + +@sp 2 + +Permission is granted to make and distribute verbatim copies of this +manual provided the copyright notice and this permission notice are +preserved on fnord all copies. + +Permission is granted to copy and distribute modified versions of +this manual under the conditions for verbatim copying, provided that +the entire resulting derived work is distributed under the terms of a +permission notice identical to this one. + +Permission is granted to copy and distribute translations of this +manual into another language, under the above conditions for modified +versions, except that this permission notice may be stated in a +translation approved by the author. + +@end titlepage +@page + +@node Top, Installation,,_ +@chapter BBDB + +@b{BBDB} is a rolodex-like database program for GNU Emacs. @b{BBDB} stands +for @b{@i{Insidious Big Brother Database}}, and is not, repeat, @emph{not} an +obscure reference to the Buck Rogers TV series. + +It provides the following features: + +@itemize @bullet +@item +Integration with mail and news readers, with little or no +interaction by the user: @refill + +@itemize @bullet +@item +easy (or automatic) display of the record corresponding to the sender of +the current message; @refill + +@item +automatic creation of records based on the contents of the current +message; @refill + +@item +automatic addition of data to arbitrary fields of the record +corresponding to the sender of the current message. @refill +@end itemize + +@item +Listing all records which match a regular expression; + +@item +Listing all records which match a regular expression in a particular +field (@samp{company} or @samp{notes,} for example); @refill +@end itemize + +@menu +* Installation:: Installation +* The BBDB:: Overview +* BBDB Mode:: BBDB Mode +* Interfaces:: Interfaces to various readers +* Reader-specific Features:: Features only available to specific readers +* Other Packages:: Using the BBDB with other packages +* Options:: Options +* Utilities:: Utilities +* Internals:: BBDB Internals +* Mailing Lists:: The BBDB mailing lists +* Changes:: New in this version +* The Latest Version:: Where to Get It +* The Future:: Known Bugs, the TODO list and EOL statements +* Thanks:: to the Ministry of Bugs + +* Concept Index:: Concept Index +* Variable Index:: Variable Index + +@detailmenu + --- The Detailed Node Listing --- + +Installation + +* General Prerequisites:: General @b{BBDB} requirements + +File Installation +* Normal User:: "Normal" Installations +* XEmacs Package:: Installing as an XEmacs package + +Initial Configuration +* Initial Configuration:: How to initially set up the @b{BBDB} + +Manual initialization + +* Gnus Prep:: Initializing @b{BBDB} support for Gnus +* MH-E Prep:: Initializing @b{BBDB} support for MH-E +* RMAIL Prep:: Initializing @b{BBDB} support for RMAIL +* Sendmail Prep:: Initializing @b{BBDB} support for Sendmail +* VM Prep:: Initializing @b{BBDB} support for VM + +Other packages: + +* Message Prep:: Initializing @b{BBDB} support for Message mode +* Reportmail Prep:: Initializing @b{BBDB} support for Reportmail +* Supercite Prep:: Initializing @b{BBDB} support for Supercite +* Web Browser Prep:: Initializing @b{BBDB} support for Web Browsers + +The @b{BBDB} + +* Database Fields:: Description of database fields +* Basic Searching:: Basic database searching commands +* Advanced Searching:: Advanced database searching commands +* Manual Record Addition:: Adding records by hand + +Interfaces + +* Mail Reading Interfaces:: Mail Reading Interfaces +* News Reading Interfaces:: News Reading Interfaces +* Mail Sending Interfaces:: Mail Sending Interfaces + +Reader-specific Features + +* Gnus Features:: Gnus-specific Features +* VM Features:: VM-specific Features + +Gnus-specific Features + +* Gnus Scoring:: Store score adjustments in the @b{BBDB} +* Gnus Summary Buffer:: @b{BBDB} information in the Summary buffer +* GNUS Subject List:: @b{BBDB} information in the Subject List + +VM-specific features + +* VM Message Summary:: @b{BBDB} information in message summary + +Using the @b{BBDB} with other packages + +* Using Message Mode:: Using the @b{BBDB} with Message Mode +* Using Reportmail:: Using the @b{BBDB} with Reportmail +* Using Supercite:: Using the @b{BBDB} with Supercite +* Using Web Browsers:: Using the @b{BBDB} with Web Browsers + +Options + +* Customization Parameters:: Customization Parameters +* Customization Hooks:: Customization Hooks +* Predefined Hooks:: Predefined Hooks + +Utilities + +* bbdb-ftp:: Storing FTP sites in the @b{BBDB} +* bbdb-print:: Print the @b{BBDB} +* bbdb-snarf:: Record generation from raw text +* bbdb-srv:: External control of the @b{BBDB} + +Changes in this Version + +* Major Changes:: Major changes in this version +* Other Changes:: Not-so-major changes + +The Future + +* Known Bugs:: Known Bugs, and how to submit new ones +* TODO List:: The TODO List +* EOL Statements:: EOL (End Of Life) Statements + +_ + +* Top:: + +@end detailmenu +@end menu + +@node Installation, The BBDB, Top, Top +@section Installation +@cindex Installation +@cindex Makefile + +This program consists of several groups of files, organized by +directory: + +@ifinfo +@example + lisp - the main program code for the @b{BBDB} + tex - TeX support files for @xref{bbdb-print}, the @b{BBDB} + printing utility + texinfo - the documentation files for the @b{BBDB} + utils - miscellaneous external utility programs + misc - things that don't fall into the above categories + bits - things that have been written as add-ons for @b{BBDB} + but have not yet been merged with the main codebase +@end example +@end ifinfo +@iftex +@bgroup@tableindent=1.5in +@table @b +@item lisp +the main program code for the BBDB +@item tex +@TeX@ support files for bbdb-print, the BBDB printing utility +@item texinfo +the documentation files for the BBDB +@item utils +miscellaneous external utility programs +@item bits +things that have been written as add-ons for @b{BBDB} but have not yet +been merged with the main codebase +@end table +@egroup +@end iftex + +@menu +* General Prerequisites:: General @b{BBDB} requirements + +File Installation +* Normal User:: "Normal" Installations +* XEmacs Package:: Installing as an XEmacs package + +Initial Configuration +* Initial Configuration:: How to initially set up the @b{BBDB} +@end menu + +@node General Prerequisites, Normal User, Installation, Installation +@subsection General Prerequisites + +Various parts of the @b{BBDB} require extra packages to be available +that are not part of the @b{BBDB} distribution. Please note that with +one exception no extra packages (beyond those which ship with both GNU +Emacs and XEmacs) are required for the use of @b{BBDB} core +functionality.@footnote{"Core Functionality" is defined as the parts of +the @b{BBDB} used to implement basic record creation (@samp{M-x +bbdb-create}) and searching (@samp{M-x bbdb}).} This one exception +applies to XEmacs 20.5 users - the @code{xemacs-base} package must be +installed for the correct operation of the core @b{BBDB} functionality. +The table below lists the requirements of the various portions of the +@b{BBDB}. Please note that the absence of any of the below optional +packages will not affect core @b{BBDB} functionality. + +@multitable {bbdb-reportmail } {Package needed} {GNU 19.34} {GNU 20.2} {XEmacs} {XEmacs} +@item @* BBDB file +@tab @* Package needed +@tab @* GNU 19.34 +@tab @* GNU 20.2 +@tab XEmacs@* @center >=20.4 +@tab XEmacs@* @center 20.5 + +@item @code{bbdb-ftp} +@tab EFS or @* Ange-FTP +@tab @center B +@tab @center B +@tab @center B +@tab @center P + +@item @code{bbdb-gnus} +@tab Gnus[1] +@tab @center B +@tab @center B +@tab @center B +@tab @center P + +@item @code{bbdb-mhe} +@tab MH-E +@tab @center B +@tab @center B +@tab @center B +@tab @center P + +@item @code{bbdb-reportmail} +@tab Reportmail +@tab +@tab +@tab @center B +@tab @center P[2] + +@item @code{bbdb-sc} +@tab Supercite +@tab @center B +@tab +@tab @center B +@tab @center P + +@item @code{bbdb-srv} +@tab @code{gnuserv} and @* @code{itimer} +@tab +@tab +@tab @center B +@tab @center B + +@item @code{bbdb-vm} +@tab VM[4] +@tab +@tab +@tab @center B +@tab @center P + +@item @code{bbdb-w3} +@tab @code{browse-url} +@tab @center B +@tab @center B +@tab @center B +@tab @center P[3] +@end multitable + +@* +@noindent +@b{NOTES:} +@enumerate +@item +The old GNUS mail/newsreader should still work. Please keep in mind +that you have a relatively recent Emacs (GNU 19.34 or later, XEmacs +19.15 or later), you are probably using Gnus. +@item +As of this writing, Reportmail is available as +part of the @code{edit-utils} package. +@item +As of this writing, @code{browse-url} is +available as part of the @code{mail-lib} package. +@item +The source release of VM is currently required due to the use of macros +from the VM codebase in @b{BBDB}'s VM integration. +@end enumerate + +Please also note that the XEmacs package locations are as of this +writing. As the XEmacs 20.5 package system is still in development, the +locations may change without warning. + +@node Normal User, XEmacs Package, General Prerequisites, Installation +@subsection Normal User Installation +@cindex Normal User Installation + +@subheading Configuring the compilation process + +First of all, you should run the @code{configure} script at the toplevel +of the distribution. This script will perform a number of checks on +your system and generate the @file{Makefile}'s accordingly. + +The @code{configure} script also comes with a number of options that +lets you customize the compilation process. These options are described +below where appropriate. + +@subheading Byte Compiling the Lisp files + +First, you need to byte-compile the appropriate @b{BBDB} Lisp files. +While this is in theory an optional step, it is virtually required in +practice due to speed reasons. + +In order to byte-compile the lisp files, an Emacs of some sort must be +used. By default (at @code{configure} time), @code{emacs} and +@code{xemacs} will be tried in that order. If you want to use a special +Emacs flavor (or if you want to use @code{xemacs} at the first place), +you should pass the @code{--with-emacs=PROG} option to @code{configure}. + +In order to successfully compile the @b{BBDB}, the build process also +needs to know the location of the various optional packages. If the +directories containing these optional packages are in the default Emacs +search path (the @code{load-path} variable), no other changes need be +made for the build process to complete successfully. + +If the optional packages are not in the default search path, the build +process will not find them unless explicitly told of their location(s). +To tell the build process where to find Gnus, MH-E, and/or VM, use the +@code{configure} options @code{--with-gnus-dir=DIR}, +@code{--with-mhe-dir=DIR}, and/or @code{--with-vm-dir=DIR} variables +respectively. To tell the build process where to find any other +package(s), pass the directories containing the lisp files for the +package(s) to the @code{configure} option @code{--with-other-dirs=DIRS}. +If multiple directories are to be added, they should be separated by +spaces or colons, and should @b{not} be quoted. For example, to +add the @file{/p/local/elisp/footnote} and @file{/p/local/elisp/sc} +directories, call the @code{configure} script as follows: + +@example + @code{configure --with-other-dirs=/p/local/elisp/footnote:/p/local/elisp/sc} +@end example + +After configuring, run one of the following commands: + +@ifinfo +@example + @code{make bbdb} - Build the core, mailer independent, components + @code{make gnus} - Core components plus @code{Gnus} support + @code{make mhe} - Core components plus @code{MH-E} support + @code{make rmail} - Core components plus @code{RMAIL} support + @code{make vm} - Build the core components with @code{VM} support + @code{make all} - Core components plus support for all mailers + listed above +@end example +@end ifinfo +@iftex +@bgroup@tableindent=1.5in +@table @b +@item @code{make bbdb} +Build the core, mailer independent, components +@item @code{make gnus} +Core components plus @code{Gnus} support +@item @code{make mhe} +Core components plus @code{MH-E} support +@item @code{make rmail} +Core components plus @code{RMAIL} support +@item @code{make vm} +Build the core components with @code{VM} support +@item @code{make all} +Core components plus support for all mailers listed above +@end table +@egroup +@end iftex + +You can also combine the above @code{make} commands. For example, to +build the @b{BBDB} with support for @code{Gnus} and @code{VM}, you can +do so by typing: + +@example +make gnus vm +@end example + +@subheading Moving the files to their final destination + +@subsubheading Lisp files + +As stated above, the @file{lisp} subdirectory contains the Emacs Lisp source +files for the @b{BBDB}. Therefore, these files must be in the Emacs +@code{load-path}. There are several ways of doing this, three of which are +described below: + +@itemize @bullet +@item +Add the @file{lisp} directory from the source distribution to the +@code{load-path}. This will allow you to run the @b{BBDB} in-place. This +method is recommended for normal users or @b{BBDB} developers, especially if +disk usage is an issue. It is @b{not} recommended for site-wide +installations. @refill + +@item +Link the @file{lisp} directory into your @file{site-lisp} directory. This is +for a site-wide installation, but it is subject to the following caveat. If you +link the @file{lisp} directory into @file{site-lisp}, you will make life more +difficult for yourself down the road, as you will not be able to make changes to +the source directory (new versions, patches, etc) without having an effect on +other users who now depend on it. This directory will automatically be added to +the @code{load-path} when Emacs starts. @refill + +@item +Make a directory whose sole purpose in life is containing the production copies +of the @b{BBDB} source and byte-compiled source files. Either put this +directory under @file{site-lisp} (or put it somewhere else and link it into +@file{site-lisp}). This directory will automatically be added to the +@code{load-path} when Emacs starts. This is the best of the three listed here, +as it allows for a degree of separation between the (possibly changing) source +tree and the production code. +@end itemize + +@ifinfo +@subsubheading TeX files + +The @file{tex} subdirectory contains the TeX support files for +bbdb-print, the @b{BBDB} printing utility (@xref{bbdb-print}.). The +three support files, @file{bbdb-cols.tex}, @file{bbdb-print.tex}, and +@file{bbdb-print-brief.tex}, must be placed in a directory that is +either on the default TeX search path or is listed in the +@code{TEXINPUTS} environment variable. If neither of these two options +is taken, TeX will not be able to process the file output by +@code{bbdb-print}. +@end ifinfo +@iftex +@subsubheading @TeX files + +The @file{tex} subdirectory contains the @TeX support files for +bbdb-print, the @b{BBDB} printing utility (@xref{bbdb-print}). The three +support files, @file{bbdb-cols.tex}, @file{bbdb-print.tex}, and +@file{bbdb-print-brief.tex}, must be placed in a directory that is +either on the default @TeX search path or is listed in the +@code{TEXINPUTS} environment variable. If neither of these two options +is taken, @TeX will not be able to process the file output by +@code{bbdb-print}. +@end iftex + +@subsubheading texinfo files + +The @file{bbdb.info} file in this directory contains the documentation +for the @b{BBDB}. This file should either be linked or copied to a +directory on the default path for the @code{info} program or listed in +the @code{INFOPATH} environment variable. + +@node XEmacs Package, Initial Configuration, Normal User, Installation +@subsection XEmacs Package Installation +@cindex XEmacs Package Installation + +@noindent +@b{NOTE:} XEmacs packages are currently supported only under XEmacs +versions after and including 20.5. If you are not running such a version +of XEmacs, you should install the @b{BBDB} according to the instructions +in @ref{Normal User}. + +@subheading Configuring / Byte Compiling + +The configuration and byte-compilation procedures are the same as in the +Normal User installation. See @ref{Normal User}. + +@subheading Moving the files to their final destination + +Support is provided for the automatic installation of the @b{BBDB} in an +XEmacs package directory. The following @code{configure} options are +available for you: + +@table @b +@item @code{--with-package-dir=DIR} +This option sets the root of the XEmacs package directory. By default, +@file{/usr/local/lib/xemacs/site-packages} is used. +@item @code{--with-symlinks} +If this option is used, the installation will be done by making symbolic +links to the sources instead of copying the files. +@item @code{--with-linkpath=PATH} +Without this option, the installation process uses the output of +@code{pwd} to determine the current directory. If something else should +be used, you should provide an alternate name for the BBDB toplevel +directory by using @code{--with-linkpath}. If, for example, @code{pwd} +returns @file{/p/local/elisp/bbdb}, but you prefer to use +@file{/usr/local/elisp/bbdb/...} for the links, usr this: +@code{configure --with-linkpath=/usr/local/elisp/bbdb}. This option is +ignored if @code{--with-symlinks} is not used. +@end table + +To perform the (un)installation, use the command @code{make (un)install-pkg}. +This will compile the @file{lisp/auto-autoloads.el} file and will +install the appropriate files to the appropriate places. The final +installation tree will take the following form: + +@table @code +@item $(PACKAGEDIR)/ +@table @code +@item lisp/ +@table @code +@item bbdb/ + @i{@b{BBDB} lisp source files. This directory contains a copy of all +@code{.el} and @code{.elc} files from the @file{lisp} source directory, +or is a symbolic link to it.} +@end table +@item info/ +@table @code +@item bbdb.info* + @i{@b{BBDB} documentation files. These are either copies of the info +files from the @file{texinfo} source directory, or are symbolic links to +them.} +@end table +@item etc/ +@table @code +@item bbdb/ +@table @code +@item tex/ + @i{@b{BBDB} support files for bbdb-print. This directory contains a +copy of the appropriate files from the @file{tex} source directory, or +is a symbolic link to it.} +@item utils/ + @i{@b{BBDB} miscellaneous utilities. This directory contains a copy +of the appropriate files from the @file{utils} source directory, or is a +symbolic link to it.} +@end table +@end table +@end table +@end table + +@node Initial Configuration, , XEmacs Package, Installation +@subsection Initial Configuration +@cindex Initial Configuration +@findex bbdb-initialize + +The simplest way to configure the @b{BBDB} is to include the following +forms in your Emacs configuration file: + +@example +@code{(require 'bbdb)} +@code{(bbdb-initialize)} +@end example + +@b{Note:} The forms above replace the autoloads needed for previous +versions of the @b{BBDB}. + +This will set up the @b{BBDB} for basic querying and record manipulation +(the Core Functionality referred to in the Prerequisites section). It +will not enable any of the mailreader-, newsreader- or other +package-specific @b{BBDB} features. To enable some or all of these +features, the @code{(bbdb-initialize)} form can be enable as shown +below. Alternatively, the features can be enabled manually as described +in the following sections. + +@subheading Modifying @code{(bbdb-initialize)} + +The @code{bbdb-initialize} function can be used to enable the various +package-specific @b{BBDB} functions. This feature activation is +accomplished through the passing of symbols which tell the function +which features to activate. These symbols are outlined below and in the +Emacs documentation for the @code{bbdb-initialize}@footnote{This +documentation can be accessed by typing @kbd{C-h f bbdb-initialize RET}.} + +@subsubheading Initialization symbols for mail and news readers + +@table @code +@item gnus + Initialize support for Gnus@footnote{If you are using GNUS (not Gnus), + and if your GNUS version is 3.14 or older, use the @code{Gnus} (note + the capitalization) symbol.}. If you pass the @code{gnus} symbol, you should + probably also pass the @code{message} symbol. +@item mh-e + Initialize support for the MH-E mail reader. +@item rmail + Initialize support for the RMAIL mail reader. +@item sendmail + Initialize support for sendmail (@kbd{M-x mail}) +@item vm + Initialize support for the VM mail reader.@footnote{For the VM + initialization to work properly, you must either call + @code{bbdb-initialize} with the @code{vm} symbol from within your VM + initialization file (@file{~/.vm}), or you must call + @code{bbdb-insinuate-vm} manually from within your VM initialization + file.} +@end table + +@subsubheading Initialization symbols for other packages + +@table @code +@item message + Initialize support for Message mode (the mail composition program + included with Gnus). +@item reportmail + Initialize support for the Reportmail mail notification package. +@item sc + Initialize support for the Supercite message citation package. + Additional initialization is required for Supercite to work with the + @b{BBDB}. @xref{Supercite Prep}. +@item w3 + Initialize support for Web browsers. +@end table + +@subsubheading Initialization example + +To initialize support for Gnus 5.5, Message mode, Supercite, and Web +browsers, the following forms would be used: + +@example +(require 'bbdb) +(bbdb-initialize 'gnus 'message 'sc 'w3) +@end example + +@subsubheading Manual initialization + +If your initialization needs exceed those provided by +@code{bbdb-initialize}, refer to the following sections for a +description of the procedures necessary for enabling @b{BBDB} support +for the packages listed above. The procedures described are the same as +those carried out by the @code{bbdb-initialize} function when passed the +appropriate symbols. That is, the procedure listed in the RMAIL Prep +section below is the same as than executed by @code{bbdb-initialize} +when the @code{rmail} symbol is passed. + +@menu +Mail and News readers: + +* Gnus Prep:: Initializing @b{BBDB} support for Gnus +* MH-E Prep:: Initializing @b{BBDB} support for MH-E +* RMAIL Prep:: Initializing @b{BBDB} support for RMAIL +* Sendmail Prep:: Initializing @b{BBDB} support for Sendmail +* VM Prep:: Initializing @b{BBDB} support for VM + +Other packages: + +* Message Prep:: Initializing @b{BBDB} support for Message mode +* Reportmail Prep:: Initializing @b{BBDB} support for Reportmail +* Supercite Prep:: Initializing @b{BBDB} support for Supercite +* Web Browser Prep:: Initializing @b{BBDB} support for Web Browsers +@end menu + +@node Gnus Prep, MH-E Prep, Initial Configuration, Initial Configuration +@subsubsection Initializing @b{BBDB} support for Gnus + +To take advantage of the @b{Gnus} features of the @b{BBDB}, add one of +the following forms to your Emacs configuration file: @refill + +@noindent +For Gnus 3.14 or older: + +@code{(add-hook 'gnus-Startup-hook 'bbdb-insinuate-gnus)} + +@noindent +For Gnus 3.15 or newer: + +@code{(add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus)} + +@code{bbdb-insinuate-gnus} adds bindings for the default keys to +@b{Gnus} and configures @b{Gnus} to notify the @b{BBDB} when new +messages are loaded. This notification is required if the @b{BBDB} is +to be able to display @b{BBDB} entries for messages displayed in +@b{Gnus}. + +@node MH-E Prep, RMAIL Prep, Gnus Prep, Initial Configuration +@subsubsection Initializing @b{BBDB} support for MH-E + +To take advantage of the @b{MH-E} features of the @b{BBDB}, add the +following form to your Emacs configuration file: @refill + +@example +(add-hook 'mh-folder-mode-hook 'bbdb-insinuate-mh) +@end example + +@code{bbdb-insinuate-mh} adds bindings for the default keys to +@b{MH-E} and configures @b{MH-E} to notify the @b{BBDB} when new +messages are loaded. This notification is required if the @b{BBDB} is +to be able to display @b{BBDB} entries for messages displayed in +@b{MH-E}. + +@node RMAIL Prep, Sendmail Prep, MH-E Prep, Initial Configuration +@subsubsection Initializing @b{BBDB} support for RMAIL + +To take advantage of the @b{RMAIL} features of the @b{BBDB}, add the +following form to your Emacs configuration file: @refill + +@example +(add-hook 'rmail-mode-hook 'bbdb-insinuate-rmail) +@end example + +@code{bbdb-insinuate-rmail} adds bindings for the default keys to +@b{RMAIL} and configures @b{RMAIL} to notify the @b{BBDB} when new +messages are loaded. This notification is required if the @b{BBDB} is +to be able to display @b{BBDB} entries for messages displayed in +@b{RMAIL}. + +@node Sendmail Prep, VM Prep, RMAIL Prep, Initial Configuration +@subsubsection Initializing @b{BBDB} support for Sendmail + +To take advantage of send-mail-mode (the one invoked with @code{M-x +mail}) features of the @b{BBDB}, add the following form to your Emacs +configuration file: @refill + +@example +(add-hook 'mail-setup-hook 'bbdb-insinuate-sendmail) +@end example + +@code{bbdb-insinuate-sendmail} enables auto-completion in +send-mail-mode. + +@node VM Prep, Message Prep, Sendmail Prep, Initial Configuration +@subsubsection Initializing @b{BBDB} support for VM + +To take advantage of the @b{VM} features of the @b{BBDB}, either add +@code{'vm} to the parameters of the @code{(bbdb-initialize)} form, or +add the following form to your @file{~/.vm} file: + +@example +@code{(bbdb-insinuate-vm)} +@end example + +@code{bbdb-insinuate-vm} adds bindings for the default keys to @b{VM} +and configures @b{VM} to notify the @b{BBDB} when new messages are +loaded. This notification is required if the @b{BBDB} is to be able to +display @b{BBDB} entries for messages displayed in @b{VM}. + +@node Message Prep, Reportmail Prep, VM Prep, Initial Configuration +@subsubsection Initializing @b{BBDB} support for Message mode + +To allow the @b{BBDB} to be used in Message mode, add the following form +to your Emacs initialization file: + +@example +@code{(bbdb-insinuate-message)} +@end example + +@code{bbdb-insinuate-message} adds a binding for @kbd{M-TAB} to Message +mode. This will enable completion of addressees based on @b{BBDB} +records. See @ref{Using Message Mode} for more details on the operation +of Message mode @b{BBDB} record completion. + +@node Reportmail Prep, Supercite Prep, Message Prep, Initial Configuration +@subsubsection Initializing @b{BBDB} support for Reportmail + +To allow the Reportmail package to report information from @b{BBDB} +records for new mail, add the following form to your Emacs +initialization file: + +@example +@code{(bbdb-insinuate-reportmail)} +@end example + +@code{bbdb-insinuate-reportmail} adds to the +@code{display-time-get-field} function to allow access to @b{BBDB} +records during new mail information display. See @ref{Using Reportmail} +for more details on the operation of Reportmail with the @b{BBDB}. + +@node Supercite Prep, Web Browser Prep, Reportmail Prep, Initial Configuration +@subsubsection Initializing @b{BBDB} support for Supercite + +To allow the @b{BBDB} to assist in the storage of Supercite citations, +add the following form to your Emacs initialization file: + +@example +@code{(bbdb-insinuate-sc)} +@end example + +@code{bbdb-insinuate-sc} adds @b{BBDB} functions to two Supercite hooks +- @code{sc-post-hook} and @code{sc-attribs-postselect-hook}. See +@ref{Using Supercite} for more details on the operation of Supercite +citation management using the @b{BBDB}. + +Three other Supercite variables must be set/modified to allow the +@b{BBDB} to work with it. These variables are not automatically set as +it would be impossible to reliably set them without interfering with +other user customizations. The modifications are: + +@table @code +@item sc-preferred-attribution-list +@code{"sc-consult"} should be added to the list. An example +configuration is: + +@example +(setq sc-preferred-attribution-list + '("sc-lastchoice" "x-attribution" "sc-consult" + "initials" "firstname" "lastname")) +@end example + +@item sc-attrib-selection-list +The following form should be added to @code{sc-attrib-selection-list}: + +@example + '(("sc-from-address" + ((".*" . (bbdb/sc-consult-attr + (sc-mail-field "sc-from-address")))))) +@end example + +@item sc-mail-glom-frame +The following form should be added to @code{sc-mail-glom-frame}, to +allow the retrieval of the name of a person who is a) in the @b{BBDB} +and b) has only included their net address in the message in question. + +@example + ("^$" (progn (bbdb/sc-default) + (list 'abort '(step . 0)))) +@end example + +An example configuration is as follows: + +@example +@exdent @code{(setq sc-mail-glom-frame} +@exdent @code{ '((begin (setq sc-mail-headers-start (point)))} +@exdent @code{ ("^x-attribution:[ \t]+.*$" (sc-mail-fetch-field t) nil t)} +@exdent @code{ ("^\\S +:.*$" (sc-mail-fetch-field) nil t)} +@exdent @code{ ("^$" (progn (bbdb/sc-default)} +@exdent @code{ (list 'abort '(step . 0))))} +@exdent @code{ ("^[ \t]+" (sc-mail-append-field))} +@exdent @code{ (sc-mail-warn-if-non-rfc822-p (sc-mail-error-in-mail-field))} +@exdent @code{ (end (setq sc-mail-headers-end (point)))))} +@end example +@end table + +The above is also documented in @file{bbdb-sc.el}. The +@code{bbdb/sc-setup-variables} function has been provided as an example for +Supercite variable initialization. Please note that while +@code{bbdb/sc-setup-variables} makes every attempt to safely configure +the Supercite variables, it will not always work. Specifically, the +variables @code{sc-attrib-selection-list} and @code{sc-mail-glom-frame} +will not be overridden if they have already been defined. + +@node Web Browser Prep, , Supercite Prep, Initial Configuration +@subsubsection Initializing @b{BBDB} support for Web Browsers + +To allow URLs to be added to @b{BBDB} records, add the following form to +your Emacs initialization file: + +@example +@code{(bbdb-insinuate-w3)} +@end example + +@code{bbdb-insinuate-w3} adds the definition of @kbd{:} to the W3 +keymap. + +The other @code{bbdb-w3} functions, specifically the passing of URLs +from @b{BBDB} records to Web browsers, do not require initialization +within the @b{BBDB}. They do, however, require the configuration of the +@code{browse-url} package so it knows to which Web browser URLs are to +be passed. For more details on the operation of @code{bbdb-w3}, see +@ref{Using Web Browsers}. + +@node The BBDB, BBDB Mode, Installation, Top +@section The @b{BBDB} + +This section discusses the basics of the @b{BBDB} - an overview of the +database's layout, and a discussion of the basic @b{BBDB} manipulation +commands. + +The database itself lives in a file which is named by the variable +@code{bbdb-file}. If this variable is not set, the database is assumed +to be in @file{~/.bbdb}. + +@menu +* Database Fields:: Description of database fields +* Basic Searching:: Basic database searching commands +* Advanced Searching:: Advanced database searching commands +* Manual Record Addition:: Adding records by hand +@end menu + +@node Database Fields, Basic Searching, The BBDB, The BBDB +@subsection Database Fields + +The database is organized as a set of records, where each record +corresponds to one person or organization. Each record has several +fields, and each field is of one of several types. Below, the built-in +types are listed, followed by a description of how and why some types +can be used more than once in a single record: @refill +@cindex Builtin field types + +@multitable @columnfractions .1 .5 .4 +@item Type +@tab Description +@tab Notes + +@item @code{name} +@tab The name of this person, or none if the record corresponds to an +organization. +@tab Single value, single instance. + +@item @code{company} +@tab The name of this person's organization, or none. +@tab Single value, single instance. + +@item @code{AKA} +@tab A list of other names for this person. +@tab Multiple values through commas. + +@item @code{net} +@tab A list of this person's network addresses. +@tab Multiple values through commas. + +@item @code{address} +@tab A list of postal (physical) addresses for this person. +@tab Multiple values through multiple occurences. + +@item @code{phone} +@tab A list of telephone numbers for this person. +@tab Multiple values through multiple occurences. + +@item @code{notes} +@tab Random commentary. +@tab Multiple values through multiple occurences. + +@end multitable + +The field types listed above can be classified into four categories, as +indicated by the comments in the `Notes' column. + +Field types marked as "Single value, single occurrence" may only occur +once per record. Each occurrence can only have a single value. For +example, there will be only one field of type @code{name} in a record. +It will be named @code{name}, and will contain a single value (the +person's name). + +The types marked as "Multiple values through commas" are essentially the +same as the single value, single occurrence field types, but with one +crucial difference: they can contain multiple values in the form of a +comma-separated list. So, for example, while a @code{name} field with a +value of "foo, bar" would be treated as if it contained the single value +"foo, bar", a @code{net} field with the same data would be thought of as +having two separate values - "foo" and "bar". As in the single +occurrence, single value field types, there will be only one occurrence +of each "Multiple values through commas" field type, and the occurrence +will have the same name as the type. + +The "Multiple values through multiple occurrences" field type is the +most flexible of the four listed here. There can be multiple +occurrences of each type. This type necessarily does not have the name +restriction imposed by the previous two types. For example, there can +be multiple fields of the @code{address} type, none of which have to be +named @code{address}. One could be named @code{home}, and the other +could be named @code{work}. + +Special properties of the @code{notes} field type: All user-defined +fields that don't fit into the other predefined field types +(@code{name}, @code{company}, @code{AKA}, @code{net}, @code{address}, +and @code{phone}) will be created as a @code{notes}-type field. In +addition, several of the user-defined field names are "special". That +is, the @b{BBDB} treats the values of these "special" fields differently +than it does other user-defined fields. The "special" fields are: + +@cindex Special Field Names +@table @code +@item attribution +@vindex bbdb/sc-attribution-field +@i{(Available only when the Supercite-specific @b{BBDB} functions have been +enabled)} Used for the storage of Supercite attributions. For initialization +details, see @ref{Supercite Prep}. For usage details, see @ref{Using +Supercite}. The field used can be changed by changing the value of +@code{bbdb/sc-attribution-field}. +@item aka +Used to store non-primary names associated with a given record. +@item face +@i{(XEmacs only)} Used for the storage of image data. This data is to be +in the format output by @code{compface}, and commonly found in +@code{X-Face:} headers in messages. If face support has been compiled +into XEmacs, the image contained in the @code{face} header will be +displayed when the record is viewed. +@item finger-host +@vindex bbdb-finger-host-field +Address used in place of the listed net address for fingering the entity +indicated by the record. @xref{BBDB Mode}. The field used can be changed by +changing the value of @code{bbdb-finger-host-field}. +@item gnus-score +@vindex bbdb/gnus-score-field +@b{Gnus} scoring adjustment for this person. For initialization details, see +@ref{Gnus Prep}. For usage details, see @ref{Gnus Features}. The field used +can be changed by changing the value of @code{bbdb/gnus-score-field}. +@item mail-alias +@cindex mail-alias definition +Value used instead of @code{name} for completion. @xref{Mail Sending +Interfaces}. +@item mail-name +Used for the storage of non-default names to be used as name in email +addresses. See also @ref{Reportmail Prep} and see @ref{Using Reportmail}. +@item mark-char +The field containing the character to be used for marking a given poster +in the Gnus Summary Buffer. For usage details, see @ref{Gnus Summary Buffer}. +@item title +The field containing the title of a person. +@item tex-name +@cindex Printing records in the database +@findex bbdb-print +The value of this field is used in place of the @code{name} field when +printing the database using @code{bbdb-print}. @xref{bbdb-print}. +@item www +This field contains the URL associated with the @b{BBDB} record. Common uses +are with @code{bbdb-snarf} (@pxref{bbdb-snarf}) and the @b{BBDB}/Web Browser +functionality (for initialization details, see @ref{Web Browser Prep}. For +usage details, see @ref{Using Web Browsers}). +@end table + +@node Basic Searching, Advanced Searching, Database Fields, The BBDB +@subsection Basic searching commands + +You can list the contents of the database with the command +@w{@kbd{M-x bbdb}}. You will be prompted for a regular expression, and all +records which match that regexp in the name, company, network address, +or any notes fields will be displayed.@refill +@cindex Searching the database +@findex bbdb +@findex bbdb-name +@findex bbdb-company +@findex bbdb-net +@findex bbdb-notes + +A narrower search may be made by using the commands @kbd{bbdb-name}, +@kbd{bbdb-company,} @kbd{bbdb-net,} or @kbd{bbdb-notes}. These commands +limit their searches to the name, company, email address, and notes +fields, respectively. If these commands are given a prefix argument, +the listing displayed will be one line per entry; otherwise, the full +database entry will be shown on multiple lines. + +The functions described above are predefined to certain keys in the +@code{*BBDB*} buffer. @xref{BBDB Mode}. for more details. + +@cindex User-defined fields +The @code{bbdb-notes} command will prompt for the notes field to search +(@kbd{RET} for all). In this way you can limit your searches to the +contents of one particular user-defined notes field. (You can add +user-defined fields with the @code{bbdb-insert-new-field} command; +@xref{BBDB Mode}.)@refill + +@cindex Elided display +@cindex One-line display + +@node Advanced Searching, Manual Record Addition, Basic Searching, The BBDB +@subsection Advanced searching commands + +The following functions can be used to search for records based on +creation and/or modification dates. These functions will match records +that have @code{timestamp} and/or @code{creation-date} fields (as +appropriate. @xref{Predefined Hooks}. for more information on these +fields, which are created by default. + +@table @code +@findex bbdb-timestamp-older +@item bbdb-timestamp-older +Display all records modified before a given date. If this function is +called interactively, it will prompt for a date. If it is being called +non-interactively, the date should be provided as a string in +@samp{yyyy-mm-dd} format. + +@findex bbdb-timestamp-newer +@item bbdb-timestamp-newer +Display all records modified after a given date. If this function is +called interactively, it will prompt for a date. If it is being called +non-interactively, the date should be provided as a string in +@samp{yyyy-mm-dd} format. + +@findex bbdb-creation-older +@item bbdb-creation-older +Display all records created before a given date. If this function is +called interactively, it will prompt for a date. If it is being called +non-interactively, the date should be provided as a string in +@samp{yyyy-mm-dd} format. + +@findex bbdb-creation-newer +@item bbdb-creation-newer +Display all records created after a given date. If this function is +called interactively, it will prompt for a date. If it is being called +non-interactively, the date should be provided as a string in +@samp{yyyy-mm-dd} format. + +@findex bbdb-creation-no-change +@item bbdb-creation-no-change +Display all records that have not been changed since creation. +@end table + +@node Manual Record Addition, , Advanced Searching, The BBDB +@subsection Manual record addition + +There are several ways to add new entries to the Insidious Big Brother +Database; the most straightforward is to use @w{@kbd{M-x bbdb-create}}, +which will prompt you for all relevant information. However, the +easiest way is to allow them to be added automatically by one of the +mail or news-reading interfaces (@xref{Interfaces}.). @refill + +@cindex Creating new records +@cindex Adding new records + +There is also @w{@kbd{bbdb-snarf}} (@pxref{bbdb-snarf}.), which will +attempt to create a record from a text block. Note that this depends +on particular formatting and may not do exactly what you want. + +@node BBDB Mode, Interfaces, The BBDB, Top +@section BBDB Mode + +@subsection Functions bound to keys in @b{BBDB} Mode + +When the @samp{*BBDB*} buffer is active (either summoned by one of the +commands in the previous section [@xref{The BBDB}.] or by your mail +or news program), a variety of commands become available for database +manipulation. Some of the commands listed below take numeric arguments. +These arguments can be generated by entering the number before pressing +the key(s) corresponding to the desired command. The output (if any) of +the listed commands will be displayed in the @samp{*BBDB*} buffer, and +can be navigated through using the usual cursor motion commands. +@cindex BBDB Mode +@cindex *BBDB* buffer + +@table @kbd +@item e +@findex bbdb-edit-current-field +@cindex Editing fields +@cindex Changing fields +(@code{bbdb-edit-current-field}) Edit the field on the current line. If +the cursor is in the middle of a multi-line field, such as an address or +comments section, then the entire field is edited, not just the current +line. @refill + +@item ; +@findex bbdb-edit-notes +(@code{bbdb-edit-notes}) A shortcut for editing the @var{notes} field. @refill + +@item d, C-k +@findex bbdb-delete-current-field-or-record +@cindex Deleting fields +@cindex Removing fields +(@code{bbdb-delete-current-field-or-record}) Delete the field on the +current line. If the current line is the first line of a record, the +@b{BBDB} will, after prompting the user, delete the entire record from +the database. This may also be applied to multiple records at once by +@kbd{*}. + +@item C-o +@findex bbdb-insert-new-field +@cindex Adding new fields +@cindex Inserting new fields +@cindex User-defined fields +(@code{bbdb-insert-new-field}) Inserts a new field into the current +record. You are prompted (with completion) for the type of field to +insert (@b{phone}, @b{address}, @b{notes}, etc); if the string you type +is not a known field type, you will be asked whether to add a new field +with the entered name of type @code{notes}. + +@cindex Phone numbers +@cindex North American phone numbers +@cindex European phone numbers +If you are inserting a new phone-number field, you can control whether +it is a North American or European phone number by providing a prefix +argument. A prefix arg of @kbd{^U} means it's to be a euronumber, and +any other prefix arg means it's to be a a structured North American +number. If no prefix argument is supplied, the style used is controlled +by the variable @code{bbdb-north-american-phone-numbers-p}. @refill + +@item C-x C-t +@findex bbdb-transpose-fields +@cindex Reordering fields +@cindex Transposing fields +(@code{bbdb-transpose-fields}) This is like the @code{transpose-lines} +command, but it is for @b{BBDB} fields. If the cursor is on a field of +a @b{BBDB} record, that field and the previous field will be +transposed.@refill + +With non-zero numeric argument @var{ARG}, the previous field is moved +past @var{ARG} fields. With argument 0, the field indicated by +@i{point} is interchanged with the one indicated by @i{mark}. + +Both fields must be in the same record, and must be of the same basic type +(that is, you can use this command to change the order in which phone-number +fields are listed, but you can't use it to make an address appear before a +phone number; the order of field types is fixed.)@refill + +@item n, p +@findex bbdb-next-record +@findex bbdb-prev-record +(@code{bbdb-next-record}, @code{bbdb-prev-record}) Move to the next and +previous displayed record, respectively. @refill + +@item t +@findex bbdb-toggle-records-display-layout +(@code{bbdb-toggle-records-display-layout}) Toggles the display layout of a +record. With a numeric argument +of 0, the current record will be made displayed in one line layout; with any +other argument, the current record will be shown in multi-line layout. @refill + +If @kbd{*t} is used instead of simply @kbd{t}, then the state of all +records will be changed instead of just the one at point. In this case, +a numeric argument of 0 means that all records will unconditionally be +made one-line layout; any other numeric argument means that all of the records +will unconditionally be shown expanded; and no numeric argument means +that the records are made to be in the opposite state of the record +under point. @refill + +@item T +@findex bbdb-display-record-completely +(@code{bbdb-display-record-completely}) +Show all the fields of the current record. +The display layout `full-multi-line' is used for this. +@refill + +@item o +@findex bbdb-omit-record +(@code{bbdb-omit-record}) Removes the current record from the display, +but does not delete it from the database; it merely makes it seem as if +the most recent search had not matched this record. With a numeric +argument, omit the next N records. With a negative argument, go +backwards. @refill + +@item m +@findex bbdb-send-mail +@cindex Sending mail +@vindex bbdb-send-mail-style +(@code{bbdb-send-mail}) Begin composing mail to the person represented +by the current record. The first email address is used. Normally, the +mail-sending package which is used is determined by which mail-reading +package is loaded; that is, if @b{MH-E} is loaded, then @code{mh-send} +will be used; if @b{VM} is loaded, then @code{vm-mail} is used; if +@b{message} is loaded, then it is used; otherwise, @code{mail} is used. +You can override this by setting the variable +@code{bbdb-send-mail-style} to one of the symbols @code{vm}, @code{mh}, +@code{message}, or @code{mail}. @refill + +If @kbd{*m} is used instead of simply @kbd{m}, then mail will be sent to +all of the folks listed in the @samp{*BBDB*} buffer instead of just the +person under point. @refill + +This function does not at present use the facility provided by +@code{compose-mail} and @code{mail-user-agent}. In a future version of +the @b{BBDB}, it will. + +@item s, C-x C-s +@findex bbdb-save-db +@cindex Saving your changes +(@code{bbdb-save-db}) Saves the @b{BBDB} file to disk. + +@item r +@findex bbdb-refile-record +@cindex Fixing mistakes +@cindex Merging records +(@code{bbdb-refile-record}) Merge the current record into some other record; +that is, delete the record under point after copying all of the data +within it into some other record. this is useful if you realize that +somehow a redundant record has gotten into the database, and you want to +merge it with another. @refill + +If both records have names and/or companies, you are asked which to use. +Phone numbers, addresses, and network addresses are simply concatenated. +The first record is the record under the point; the second is prompted +for. Completion behavior is as dictated by the variable +@code{bbdb-completion-type}. @refill + +@item M-d +@findex bbdb-dial +@cindex Dialling phone numbers +(@code{bbdb-dial}) This command will attempt to dial the phone number +currently at point, or if point is at the start of a record, the first +phone number in the record. An extension, if present, is disregarded. +@refill + +The method of dialling is controlled by @code{bbdb-modem-dial}. If this +variable is nil, the @b{BBDB} will play touchtones corresponding to the +number to be dialled. Otherwise, this variable is treated as a modem +command string to be prepended to the number prior to feeding it to +@code{bbdb-modem-device}. @refill + +The @b{BBDB} plays touchtones using @code{bbdb-sound-player} to play the +sounds and the elements of @code{bbdb-sound-files} as the audio to be +played. The first ten elements of @code{bbdb-sound-files} correspond to +the touchtones for the digits @samp{0} to @samp{9}, while the eleventh +and twelfth elements correspond to @samp{#} and @samp{*} +respectively. The default configuration assumes a Solaris[tm] +installation with the demonstration sound files in +@code{/usr/demo/SOUND/sounds}. @refill + +The actual number dialled depends on the following variables: + +@table @code +@item bbdb-dial-local-prefix-alist +@vindex bbdb-dial-local-prefix-alist +This is a list of (SEXPR REPLACEMENT) pairs. SEXPR is evaluated to +produce a regular expression which is then applied to the number. If it +matches, whatever it matches is replaced by REPLACEMENT. The match and +replace is performed using each item in the list that matches, in +sequence, so that the output from one item may become input to another. +The default value for this variable is to remove +@code{(bbdb-default-area-code)} (i.e. the value of that variable, in +parenthesis) from the start of the number to be dialled.@refill + +@b{Note:} If this procedure produces a transformed number then no +further modifications (such as prefix additions, below) will be made to +the number before dialling.@refill + +Using a prefix argument to @code{bbdb-dial} disables the processing of +this variable. The other modifiers, below, are not affected by +this.@refill + +@item bbdb-dial-local-prefix +@vindex bbdb-dial-local-prefix +If the number to be dialled starts with a zero, it is deemed to be a +local number, and @code{bbdb-dial-local-prefix} is prepended to it (see +note above concerning @code{bbdb-dial-local-prefix-alist} processing, +however).@refill + +@item bbdb-dial-long-distance-prefix +@vindex bbdb-dial-long-distance-prefix +If the number to be dialled starts with a plus sign (+), it is deemed to +be a long distance number, and @code{bbdb-dial-long-distance-prefix} is +prepended to it (see note above concerning +@code{bbdb-dial-local-prefix-alist} processing, however).@refill + +@end table + +@item f +@findex bbdb-finger +@cindex Finger interface +(@code{bbdb-finger}) This command fingers the network address of a +@b{BBDB} record. If this command is executed from the @samp{*BBDB*} buffer, +it fingers the network address of the record which is at point; otherwise, +it prompts in the minibuffer (with completion) for a user to finger. With a +numeric prefix argument, it fingers the @i{N}th network address of the +current record; with a prefix argument of @kbd{^U}, it fingers all of them. +The @samp{*finger*} buffer is filled asynchronously, meaning that you don't +have to wait around for it to finish; but fingering another user before +the first finger has finished could have unpredictable results.@refill + +If this command is executed from the @samp{*BBDB*} buffer, it may be prefixed +with @kbd{*} (as in @kbd{*f} instead of simply @kbd{f}), meaning to +finger all of the users currently listed instead of just the one under +point. The numeric prefix argument has the same interpretation. @refill + +@vindex bbdb-finger-host-field +You can define a special network address to ``finger'' by defining a field +@code{finger-host}. The name of the field to be fingered can be changed +by setting @code{bbdb-finger-host-field}. + +@item q +@findex bbdb-bury-buffer +(@code{bbdb-bury-buffer}) Hides the @samp{*BBDB*} buffer. @b{Note:} +This command does @b{not} kill the @samp{*BBDB*} buffer. + +@item ? +@findex bbdb-help +(@code{bbdb-help}) This displays a one-line help message in the +minibuffer, showing some of the most common bbdb-mode commands. + +@item i +@findex bbdb-info +(@code{bbdb-info}) This documentation is displayed. Please note that +either @file{bbdb} or @file{bbdb.info} must be installed in one of the +info directories known to Emacs for this command to work. + +@table @code +@item bbdb-info-file +@vindex bbdb-info-file +If this documentation is not installed in the standard Info directory, +then you should set this variable to the name of the texinfo-formatted +version of this file; the @code{bbdb-info} command will use this file +instead.@refill +@end table + +@item W +@cindex Browsing the Web page for the current record +@findex bbdb-www +(@code{bbdb-www}) Displays the Web page listed in the @code{www} field +of the current record. @xref{Using Web Browsers}. + +@item P +@cindex Printing records in the database +@findex bbdb-print +(@code{bbdb-print}) Creates a TeX file that contains a pretty-printed version +of @b{BBDB} records. If prefixed by @kbd{*}, only the records currently +displayed will print. @xref{bbdb-print}. + +@item h +@cindex Changing windows +Moves point to another window via the @code{other-window} function. + +@item c +@cindex Creating new records +@findex bbdb-create +(@code{bbdb-create}) Create a new database record from information +supplied by the user. + +@item C +@cindex Displaying changed records +@findex bbdb-changed +(@code{bbdb-changed}) Display all records that have been changed since +the last time the database was saved. + +@item b +@cindex Searching the database +@findex bbdb +(@code{bbdb}) Begin a new database search. The results of the new +search will be displayed in place of the results of the old search. + +@item S a, S c, S o, S n +@cindex Searching the database +@findex bbdb-net +@findex bbdb-company +@findex bbdb-notes +@findex bbdb-name +(@code{bbdb-net}, @code{bbdb-company}, @code{bbdb-notes}, +@code{bbdb-name})@* +Begin a new database search. This search will be +limited to the net address, company, notes, or name fields, +respectively, of database records. @xref{Basic Searching}. for more +details. + +@item * +@findex bbdb-append-records +@code{bbdb-append-records} will make the next display/search +command to append its results to the BBDB buffer instead of replacing its +content. + +With an prefix arg (C-u) toggle between always append and no append. +With an prefix arg that is a positive number append will be enabled for that +many times. +With any other argument append will be enabled once."@refill + +@end table + +@subsection Other database manipulation functions + +@table @code +@findex bbdb-kill-older +@item bbdb-kill-older +If called interactively (or with a single argument - a date in +@samp{yyyy-mm-dd} format), it will kill all records that were last +modified before the given date as determined by the @code{timestamp} +field. @xref{Predefined Hooks}. If called non-interactively with a +date (in @samp{yyyy-mm-dd} format), a comparison function and an action +function, the comparison function is applied to the @code{timestamp} +field of all records, and the action function applied to those for whom +the comparison function returns true. If @samp{nil} is supplied as the +comparison function, @code{string-lessp} is used. + +@end table + +@node Interfaces, Reader-specific Features, BBDB Mode, Top +@section Interfaces + +The @b{BBDB} interfaces itself with several message-handling packages, but +certain parameters control its behavior depending on whether it is +being used from within a mail reader or a news reader. @refill + +In all of these packages, two new keybindings will be added: + +@table @kbd +@item : +@cindex Showing the sender of the current message +@findex bbdb/vm-show-sender +@findex bbdb/rmail-show-sender +@findex bbdb/mh-show-sender +@findex bbdb/gnus-show-sender +(@code{bbdb/@i{package}-show-sender}) Displays the @b{BBDB} entry corresponding +to the author of the current message. If there is none, you will be +asked whether to create one. The function called is +@code{bbdb/@i{package}-show-sender}, where @code{@i{package}} is either +@code{gnus}, @code{mh}, @code{rmail}, or @code{vm}, depending on the +mail or news program being used when the command is invoked. + +@item ; +@cindex Annotating the sender of the current message +@findex bbdb/vm-annotate-sender +@findex bbdb/rmail-annotate-sender +@findex bbdb/mh-annotate-sender +@findex bbdb/gnus-annotate-sender +(@code{bbdb/@i{package}-annotate-sender}) Lets you edit the @samp{notes} +field of the @b{BBDB} record corresponding to the sender of the current +message. If there is no record for the current author, you will be +asked whether to create one. The function called is +@code{bbdb/@i{package}-annotate-sender}, where @code{@i{package}} is +either @code{gnus}, @code{mh}, @code{rmail}, or @code{vm}, depending on +the mail or news program being used when the command is invoked. +@end table + +These keybindings (and several other features) will not be +available unless you call the appropriate ``insinuation'' +function; @xref{Installation}.@refill + +It is possible to configure @b{BBDB} so that it automatically creates a +record when it sees a message from a person who is not in the database. +It is also possible to have text automatically added to the notes field +of the corresponding record depending on the contents of the message +headers. @xref{Customization Hooks}.@refill + +@menu +* Mail Reading Interfaces:: Mail Reading Interfaces +* News Reading Interfaces:: News Reading Interfaces +* Mail Sending Interfaces:: Mail Sending Interfaces +@end menu + +@node Mail Reading Interfaces, News Reading Interfaces, Interfaces, Interfaces +@subsection Mail Reading Interfaces + +There are BBDB interfaces for the following mail readers: + +@itemize @bullet +@item +@b{Gnus}, a news- and email- reader written by Lars Magne Ingebrigtsen +(based on @b{GNUS} by Mansanobu Umeda). +@item +@b{MH-E}, the Emacs interface to @b{Mail Handler} (@b{MH}), from the +standard emacs library, but packaged separately from XEmacs since +version 20.4.@refill +@item +@b{RMAIL}, from the standard emacs library (packaged separately for +XEmacs users as of 20.4); +@item +@b{View Mail}, by Kyle Jones, version 5.31 or newer; +@end itemize + +@node News Reading Interfaces, Mail Sending Interfaces, Mail Reading Interfaces, Interfaces +@subsection News Reading Interfaces + +There are BBDB interfaces for the following news readers: + +@itemize @bullet +@item +@b{GNUS}, a newsreader written by Masanobu Umeda. @refill +@item +@b{Gnus}, the modern news- and email-reading incarnation of @b{GNUS}. +@b{Gnus} is written by Lars Magne Ingebrigtsen.@refill +@end itemize + +@node Mail Sending Interfaces, , News Reading Interfaces, Interfaces +@subsection Mail Sending Interfaces + +@findex bbdb-complete-name +@vindex bbdb-dwim-net-address-allow-redundancy +@vindex bbdb-dwim-net-address-title-field +@cindex Name completion +@cindex Mail address completion +@cindex Address completion +@cindex Format of completed address +When sending mail, the keystroke @kbd{M-TAB} is bound to the +function @code{bbdb-complete-name}. This will take the string that +you have typed (from point back to the preceding colon, comma, or +the beginning of the line) and will complete that against the +contents of the database. What you have typed may be an initial +subsequence of a person's full name or network address; if it +completes ambiguously, then what you have typed will be replaced +with the common portion of the matches. Typing @kbd{M-TAB} again will +show a list of possible completions. If it completes unambiguously, +then an address will be inserted. The variable +@code{bbdb-completion-type} controls whether completion is done on real +names, or network addresses, or both. The address inserted is normally +of the form @w{@code{User Name <email-address>}}; however, if +@code{User Name} has an address of the form +@code{<user.name@@somedomain>}, only the @code{<email-address>} portion +is inserted. This can be overridden by setting +@code{bbdb-dwim-net-address-allow-redundancy} to @code{t}. +If @code{User name} has the field configured by +@code{bbdb-dwim-net-address-title-field} it will be prepended. +@refill + +This binding is automatically set by the various insinuation functions +documented earlier in this manual. (@xref{Initial Configuration}.) +Briefly, the forms for these functions are: + +@table @b +@item Gnus +@code{(add-hook 'gnus-Startup-hook 'bbdb-insinuate-gnus)} @i{for Gnus 3.14 or older}@* +@code{(add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus)} @i{for Gnus 3.15 or newer} +@item MH-E +@code{(add-hook 'mh-folder-mode-hook 'bbdb-insinuate-mh)} +@item RMAIL +@code{(add-hook 'rmail-mode-hook 'bbdb-insinuate-rmail)} +@item sendmail +@code{(add-hook 'mail-setup-hook 'bbdb-insinuate-sendmail)} +@item VM +@code{(bbdb-insinuate-vm)} @i{Add to @file{~/.vm} file} +@end table + +@noindent +The above forms should be added to your Emacs initialization file, +except where otherwise noted. + +You can control what ``real name'' is inserted with the +@code{mail-alias} field: if a record has a @code{mail-alias} +field, then that is used instead of their @code{name} field. + +@vindex bbdb-completion-display-record +If the variable @code{bbdb-completion-display-record} is true (the +default) then when you successfully complete an address with +@kbd{M-TAB}, the corresponding record will be appended to +the @samp{*BBDB*} buffer. The buffer will not be displayed if it +is not already visible, but the record will be displayed there. + +@findex bbdb-yank-addresses +@cindex Sending mail +When sending mail, you can use the command @code{bbdb-yank-addresses} +to CC the current message to the people currently displayed in +the @samp{*BBDB*} buffer. This is useful if you are in the midst of +sending or replying to a message, and you decide to add some recipients. +You can use one of the @kbd{M-x bbdb} commands to display the set of +people that you want to CC the message to, and then execute this command +to add them to the list. + +@unnumberedsubsec Mailing Lists and Mail Aliases + +@cindex Mailing lists +@cindex Mail Aliases +@cindex mail-alias usage +@findex bbdb-define-all-aliases +@findex bbdb-add-or-remove-mail-alias +@findex define-mail-alias + +If you are using Jamie Zawinski's @file{mail-abbrevs.el} package, which +uses the word-abbrev mechanism for mail aliases, then you can store your +mail aliases in the BBDB instead of duplicating the information +elsewhere.@refill + +If you want a mail alias to be defined for a person, simply add a +@code{mail-alias} field to their record. You may have multiple aliases +for the same person; simply separate them with commas.@refill + +For convenience there is the function @code{bbdb-add-or-remove-mail-alias} +bound to @kbd{a} which adds an alias to one or multiple records when prefixed +by a @kbd{*}. Called with a prefix argument @kbd{C-u} it will remove +the given alias.@refill + +If more than one person has the same mail-alias, then that alias expands +to the addresses of all of those people; in this way you can maintain +mailing lists within the BBDB.@refill + +When you want to group aliases as in @code{.mailrc} you may just +retained the group aliases in your @code{.mailrc}. + +To actually define the aliases which are stored in the BBDB, call the +function @code{bbdb-define-all-aliases} from your +@code{mail-setup-hook} (or @code{message-setup-hook} if you use +Message mode coming with Gnus). This will search the database, and +call @code{define-mail-alias} to define each of the resulting +aliases.@refill + +@node Reader-specific Features, Other Packages, Interfaces, Top +@section Reader-specific Features + +There are features of the @b{BBDB} that are available only for specific +mail- and news-readers. These features are described below. + +The headers which are parsed for email addresses and what records are +displayed can be controlled by the following variables: +@vindex bbdb-get-addresses-from-headers +@vindex bbdb-get-addresses-to-headers +@vindex bbdb-get-addresses-headers +@vindex bbdb-get-only-first-address-p +@code{bbdb-get-addresses-from-headers} controls which headers are parsed +for sender addresses when calling the show-sender function of your MUA. +@code{bbdb-get-addresses-to-headers} controls which headers are parsed +for recipients addresses when calling the show-all-recipients function +of your MUA. When using the pop up feature it will search for the +addresses in @code{bbdb-get-addresses-headers} and display them. By +default it will list only the first address, but by setting +@code{bbdb-get-only-first-address-p} to @code{nil} one will will get +records for all addresses. + +If there is no MUA specific variable for ignoring certain addresses then +those addresses matching @code{bbdb-user-mail-names} will be ignored. + +@b{BBDB} adds the bindings @kbd{:} for showing all senders and @kbd{;} +for editing the notes of the sender. + +@menu +* Gnus Features:: Gnus-specific Features +* VM Features:: VM-specific Features +@end menu + +@node Gnus Features, VM Features, Reader-specific Features, Reader-specific Features +@subsection Gnus-specific Features + +The @b{BBDB} can be used to provide score information, or to integrate +database information into the @b{Gnus} Summary buffer or the @b{GNUS} +Subject List. + +@menu +* Gnus Scoring:: Store score adjustments in the @b{BBDB} +* Gnus Summary Buffer:: @b{BBDB} information in the Summary buffer +* GNUS Subject List:: @b{BBDB} information in the Subject List +@end menu + +@node Gnus Scoring, Gnus Summary Buffer, Gnus Features, Gnus Features +@subsubsection Scoring +@vindex bbdb/gnus-score-field +@vindex bbdb/gnus-score-default +@vindex gnus-score-find-score-files-function + +The @b{BBDB} can provide scoring information to @b{Gnus} in one of two +ways. + +@enumerate +@item +Articles whose authors appear in the @b{BBDB} and who have +@code{gnus-score} fields will have their scores adjusted by the value +contained in that field. +@item +Articles whose authors appear in the @b{BBDB} but who do not have +@code{gnus-score} fields will have their scores adjusted by +@code{bbdb/gnus-score-default}. If @code{bbdb/gnus-score-default} is +@code{nil}, no score adjustment will be made. +@end enumerate + +The @b{BBDB} by default searches the field contained in +@code{bbdb/gnus-score-field} for score values. To have the @b{BBDB} use +a different field, change the value of this variable. + +To enable @b{BBDB}-assisted scoring, add the @code{bbdb/gnus-score} +function to @code{gnus-score-find-score-files-function}. Assuming that +you want to preserve the default value of this variable, use a form +similar to the following: + +@example +(setq gnus-score-find-score-files-function + '(gnus-score-find-bnews bbdb/gnus-score)) +@end example + +@b{Note:} The default value in @b{Gnus} 5.5 is @code{gnus-score-find-bnews}. +Check your configuration before using the above code, as your values may +be different. + +@node Gnus Summary Buffer, GNUS Subject List, Gnus Scoring, Gnus Features +@subsubsection Gnus Summary Buffer Enhancements + +@b{Gnus} can use the @b{BBDB} to do one of two things: + +@itemize @bullet +@item +Mark authors in the Summary Buffer who have records in the @b{BBDB} with +a user-defined mark character. See Marking Posters, below. +@item +For authors in the Summary Buffer who also have records in the @b{BBDB}, +replace their name as listed in the Summary Buffer with their name as +stored in the @b{BBDB}. See Using Names from the @b{BBDB}, below. +@end itemize + +@subsubheading Marking Posters + +Authors with records in the @b{BBDB} can be marked either with a +user-defined mark character, or with a default one. The marking is +enabled by the use of a Gnus user format code, as determined by +@code{bbdb/gnus-summary-in-bbdb-format-letter}. This variable, which +defaults to @samp{b}, is used to create a format code which is intended +for use in @code{gnus-summary-line-format}. The format code is created +by concatenating @samp{%u} with the value of +@code{bbdb/gnus-summary-in-bbdb-format-letter}. In the default case +this results in the creation of the format code @samp{%ub}. + +Posts are marked as follows: If the record for the poster has the field +indicated in @code{bbdb-message-marker-field} (the default is +@code{mark-char}), the value of that field is used as the mark +character.@footnote{While it is possible to put a multi-character mark +in @code{bbdb-message-marker-field} and/or in +@code{bbdb/gnus-summary-known-poster-mark}, the resulting summary buffer +will be misaligned as a result. This misalignment will result from fact +that at this time the character used to indicate posts whose authors are +not in the @b{BBDB} is always a single character, and cannot be +changed.} If no such field is present, the value of +@code{bbdb/gnus-summary-known-poster-mark} will be used instead. If the +author is not in the @b{BBDB}, a space will be used as the mark character. + +@subsubheading Using Names from the @b{BBDB} + +The names reported for authors of posts in the Summary buffer can be +altered to conform to the values present in their respective @b{BBDB} +records (if any). This rewriting is enabled by the use of a Gnus user +format code, as determined by +@code{bbdb/gnus-summary-user-format-letter}. This variable, which +defaults to @samp{B}, is used to create a format code which is intended +for use in @code{gnus-summary-line-format}. The format code is created +by concatenating @samp{%u} with the value of +@code{bbdb/gnus-summary-user-format-letter}. In the default case this +results in the creation of the format code @samp{%uB}. This format code +is intended to @b{replace} the format code previously used in the Summary +buffer format line to indicate the author and/or net address (usually +@samp{%a}, @samp{%n}, and/or @samp{$N}). + +The effects of this format code are in two independent parts - the +marking of known posters, and the rewriting of posters names. The +first, the marking of posters, occurs only when +@code{bbdb/gnus-summary-mark-known-posters} is @code{t} (the default) +and the posters have entries in the @b{BBDB}. When this variable is +true, the marking occurs as described in the previous section, Marking +Posters, above. + +The poster name rewriting is done for all posters - not just for those +with records in the @b{BBDB}. That said, rewriting rules for posters in +the @b{BBDB} are more flexible than for those not listed. The rewriting is +governed by two variables, as described below. + +@code{bbdb/gnus-summary-prefer-real-names} can have one of three values - +@samp{t}, @samp{bbdb}, or @code{nil}. In general, this variable governs +the preference between net addresses and names. If it is @samp{t}, the +name (if any) will be used. If @samp{nil}, the net address will be +used. The third value, @samp{bbdb}, can be used as a method for +distinguishing between authors with records in the @b{BBDB} and those +without. If the variable is set to @samp{bbdb}, the name from the +@b{BBDB} record will be used if the author has a record in the +@b{BBDB}. If the author is not in the @b{BBDB}, the net address from +the message will be printed. This variable makes little sense if +@code{bbdb/gnus-summary-prefer-bbdb-data} is @samp{nil}, as no names +will be printed in the Summary buffer in this case - only net addresses. + +@code{bbdb/gnus-summary-prefer-bbdb-data} is used to (dis)allow use of +the @b{BBDB} for author data retrieval. If it is @samp{t}, data from +the @b{BBDB} will be used if available. If it is @samp{nil}, data from +the @b{BBDB} will not be used. + +@noindent +In the following examples, assume the following: + +@enumerate +@item +Message: @code{From: Jamie <jwz@@netscape.com>}@* +@b{BBDB}: No record +@item +Message: @code{From: Matt <simmonmt@@acm.org>}@* +@b{BBDB}: Name: @samp{Matthew}, Net: @samp{simmonmt@@purdue.edu} +@end enumerate + +@multitable @columnfractions .47 .17 .18 .18 +@item @code{bbdb/gnus-summary-prefer-bbdb-data} +@tab @center @code{t} +@tab @center @code{t} +@tab @center @code{nil} +@item @code{bbdb/gnus-summary-prefer-real-names} +@tab @center @code{t} +@tab @center @code{bbdb} +@tab @center @code{t} +@item Printed in Summary buffer for +@tab +@tab +@tab +@item @center Case 1 +@tab @center Jamie +@tab @center jwz@@netscape.com +@tab @center Jamie +@item @center Case 2 +@tab @center Matthew +@tab @center Matthew +@tab @center Matt +@end multitable + +@node GNUS Subject List, , Gnus Summary Buffer, Gnus Features +@subsubsection GNUS Summary Buffer Enhancements + +@i{This section is remarkably terse, as I don't have a copy of @b{GNUS}. +If anybody can provide more descriptive information, please let me +know.} + +@example +(autoload 'bbdb/gnus-lines-and-from "bbdb-gnus") +(setq gnus-optional-headers 'bbdb/gnus-lines-and-from) +@end example + +@table @code +@item bbdb/gnus-mark-known-posters +@vindex bbdb/gnus-mark-known-posters +@cindex GNUS Subject-buffer +If @code{t} (the default), then the @b{GNUS} subject list will contain an +indication of those messages posted by people who have entries in +the Insidious Big Brother Database (they will be marked with an +asterisk.) @refill + +@cindex mark-char +You can change the character used to mark records on a record-by-record +basis by adding a @code{mark-char} property to the record, whose value +is be the string to display (preferably one character.) @refill + +@item bbdb/gnus-header-prefer-real-names +@vindex bbdb/gnus-header-prefer-real-names +Default: @code{nil}. if @code{t}, then the @b{GNUS} subject list will +display real names instead of network addresses. @refill + +@item bbdb/gnus-header-show-bbdb-names +@vindex bbdb/gnus-header-show-bbdb-names +Default: @code{t}. If both this variable and +the @code{bbdb/gnus-header-prefer-real-names} variable are true, then +for news messages from people who are in your database, the name displayed +will be the primary name from the database, rather than the one from +the @samp{From:} line of the message. This doesn't affect the names of +people who aren't in the database, of course.@refill + +@item bbdb/gnus-lines-and-from-length +@vindex bbdb/gnus-lines-and-from-length +Default: 18. The number of characters used to display @samp{From:} info in +@b{GNUS}, if you have set @code{gnus-optional-headers} to +@code{bbdb/gnus-lines-and-from}. @refill +@end table + +@node VM Features, , Gnus Features, Reader-specific Features +@subsection VM-specific features + +The @b{BBDB} can be used to integrate database information into the +message summary. + +@menu +* VM Message Summary:: @b{BBDB} information in message summary +* VM what records are displayed:: +* VM automatic setup of vm-set-auto-folder-alist:: +* VM automatic adding of labels:: +@end menu + +@node VM Message Summary, VM what records are displayed, VM Features, VM Features +@subsubsection VM Message Summary Enhancements + +@vindex vm-summary-format +@findex vm-summary-function-B +@cindex %F +@cindex %UB +VM users can cause their summary buffer to display the name of the +message sender according to @b{BBDB} data, instead of according to the +contents of the current message's headers. In VM 5.40 or later, use +the summary format control @code{%UB"} instead of @code{"%F"}, and the +current record name will be shown there if available. If no entry is +found it behaves like @code{"%F"}. See the documentation for +@code{vm-summary-format} for more details. Warning, this may +significantly slow down summary generation for large folders. + +@node VM what records are displayed, VM automatic setup of vm-set-auto-folder-alist, VM Message Summary, VM Features +@subsubsection VM configuration of what records the @b{BBDB} buffer shows + +@vindex vm-summary-uninteresting-senders + +Email addresses which match @code{vm-summary-uninteresting-senders} are +ignored. + +The records in the @b{BBDB} buffer are listed in the same order as found. + +@node VM automatic setup of vm-set-auto-folder-alist, VM automatic adding of labels, VM what records are displayed, VM Features +@subsubsection VM automatic setup of @code{vm-set-auto-folder-alist} + +@vindex bbdb/vm-set-auto-folder-alist-field +VM users can setup the @code{vm-set-auto-folder-alist} automatically by +calling @code{bbdb/vm-set-auto-folder-alist}. This adds for each @b{BBDB} +record containing a @code{bbdb/vm-set-auto-folder-alist-field} an entry +to @code{vm-set-auto-folder-alist}. + +The record field can contain a string which is used as folder name or +if it starts with a @code{'} it is treated as lisp expression returning +a folder name. + +@node VM automatic adding of labels, , VM automatic setup of vm-set-auto-folder-alist, VM Features +@subsubsection VM automatic adding of labels + +@vindex bbdb/vm-auto-add-label-list +@vindex bbdb/vm-auto-add-label-field +@findex bbdb/vm-auto-add-label + +@code{bbdb/vm-auto-add-label-list} is a +List used by @code{bbdb/vm-auto-add-label} to automatically label messages. +Each element in the list is either a string or a list of two strings. +If a single string then it is used as both the field value to check for +and the label to apply to the message. If a list of two strings, the first +is the field value to search for and the second is the label to apply. + +@code{bbdb/vm-auto-add-label-field bbdb-define-all-aliases-field} is the +field used by @code{bbdb/vm-auto-add-label} to automatically label messages. +Value is either a single symbol or a list of symbols of bbdb fields that +@code{bbdb/vm-auto-add-label} uses to check for labels to apply to messages. +Defaults to @code{bbdb-define-all-aliases-field} which is typically +@code{mail-alias}. + +@code{bbdb/vm-auto-add-label} automatically adds labels to messages +based on the @code{bbdb/vm-auto-add-label-field +bbdb-define-all-aliases-field} field. Add this to +@code{bbdb-notice-hook} and if using VM each message that bbdb notices +will be checked. If the sender has a value in the +@code{bbdb/vm-auto-add-label-field} in their BBDB record that matches a +value in @code{bbdb/vm-auto-add-label-list} then a VM label will be +added to the message. + +This works great when `bbdb-user-mail-names' is set. As a result mail +that you send to people (and copy yourself on) is labeled as well. + +@node Other Packages, Options, Reader-specific Features, Top +@section Using the @b{BBDB} with other packages + +The @b{BBDB} adds functionality to several packages. The following sections +detail these augmentations. + +@menu +* Using Message Mode:: Using the @b{BBDB} with Message Mode +* Using Reportmail:: Using the @b{BBDB} with Reportmail +* Using Supercite:: Using the @b{BBDB} with Supercite +* Using Web Browsers:: Using the @b{BBDB} with Web Browsers +@end menu + +@node Using Message Mode, Using Reportmail, Other Packages, Other Packages +@subsection Using the @b{BBDB} with Message Mode + +At this time, the only feature the @b{BBDB} adds to Message mode is the binding +to @kbd{M-TAB} which allows for @b{BBDB} record completion. + +@node Using Reportmail, Using Supercite, Using Message Mode, Other Packages +@subsection Using the @b{BBDB} with Reportmail + +The @b{BBDB} can modify the @file{reportmail.el} package to use information +from @b{BBDB} records when identifying the senders or recipients of e-mail +messages. + +In normal operation, Reportmail displays the name and net address sender and +recipient of incoming messages. The @b{BBDB} can be configured to intercept +and rewrite this information before it appears in the Emacs mode-line. It +first attempts to rewrite the sender and/or recipient information by +substituting those addresses with information from the @b{BBDB}. Replacement +information is first sought from the @code{mail-name} field in the respective +@b{BBDB} records. If no such field is found, the @code{name} field is +returned. If no @b{BBDB} record is found, no rewriting is performed. + +The @b{BBDB}-Reportmail augmentation is accomplished through the advising of +the Reportmail @code{display-time-get-field} function in order to do +a-posteriori modification of the returned value. The augmentation uses the +@code{bbdb/reportmail-alternate-full-name} function to retrieve data from the +@b{BBDB} for use in rewriting. + +@node Using Supercite, Using Web Browsers, Using Reportmail, Other Packages +@subsection Using the @b{BBDB} with Supercite + +@c <rewrite> + +The @b{BBDB} can be used with Supercite to store attributions with @b{BBDB} +records. Normally, when a non-default attribution is entered for a given +message, the entered attribution is used for that message, and is then +discarded. When the @b{BBDB}-Supercite augmentation is enabled, the +non-default attribution will be added to the record (if any) for the entity +being cited. This poor explanation sounds complicated, but it's not. If a +message from @samp{Jamie Zawinski <jwz@@netscape.com>} is being replied to, +Supercite will, by default, suggest the citation @samp{Jamie}. If the +non-default citation @samp{jwz} is entered, Supercite can save it with the +@b{BBDB} record for @samp{Jamie Zawinski} in the @code{attribution} field. + +@c </rewrite> + +The field used can be changed by changing the value of +@code{bbdb/sc-attribution-field}. + +@node Using Web Browsers, , Using Supercite, Other Packages +@subsection Using the @b{BBDB} with Web Browsers + +The @b{BBDB}/Web Browser integration is in two parts, one which is +automatically enabled, and one which must be manually enabled (@pxref{Web +Browser Prep}). The first feature added is the ability to display the URL +associated with a given record in a Web Browser. The second is the ability to +add URLs to @b{BBDB} records from within W3, the Emacs Web Browser. + +Pressing @kbd{W} in the @code{*BBDB*} buffer while the cursor is positioned +over a record with a @code{www} field will cause the first URL in the field to +be loaded in a Web Browser. This functionality uses @code{browse-url} to +display URLs - see the documentation for @code{browse-url} for information on +selecting the browser to be used. + +If W3 is used, and if the @b{BBDB}/W3 functionality has been enabled as +described in @ref{Web Browser Prep}, pressing the @kbd{:} key will add the URL +currently being displayed in W3 to a user-specified @b{BBDB} record. + +@node Options, Utilities, Other Packages, Top +@section Options + +There are many variables which control the behavior of the Insidious Big +Brother Database, and there are many hook-variables which can be used to +modify its behavior in more complex ways. Several pieces of functionality +are included which use the hooks in this way. @refill + +@menu +* Customization Parameters:: Customization Parameters +* Customization Hooks:: Customization Hooks +* Predefined Hooks:: Predefined Hooks +@end menu + +@node Customization Parameters, Customization Hooks, Options, Options +@subsection Customization Parameters + +@table @code +@item bbdb-file +@vindex bbdb-file +The name of the file which contains your personal database. Default: +@file{~/.bbdb}. + +@item bbdb-default-area-code +@vindex bbdb-default-area-code +@cindex Phone numbers +The default area code to use when prompting for a new phone number. +Default: 415. This must be a number, not a string.@refill + +@item bbdb-north-american-phone-numbers-p +@vindex bbdb-north-american-phone-numbers-p +@cindex North American phone numbers +@cindex European phone numbers +Whether syntax-checking of phone numbers should be enforced. Default: +@code{t}. This only works for Bell-system phone numbers. If this is true, +then you can't enter invalid phone numbers, and all phone numbers are +pretty-printed in the same way. European phone numbers don't have as +strict a syntax, however, so this is a harder problem for them (on which +I am punting). @refill + +You can have both styles of phone number in your database by providing a +prefix argument to the @code{bbdb-insert-new-field} command. @refill + +@item bbdb-check-zip-codes-p +@vindex bbdb-check-zip-codes-p +@vindex bbdb-legal-zip-codes +@cindex Zip code checking +@cindex Checking zip codes +@cindex Invalid zip codes +@cindex Not a valid zip code +@cindex List of valid zip codes +@cindex Valid zip codes +Whether syntax-checking of zip codes should be enforced. Default: +@code{t}. If this is true, you can't enter invalid zip codes. A zip +code is valid if it matches one of the regular expressions in the +variable @code{bbdb-legal-zip-codes}. @refill + +@item bbdb-address-formatting-alist +@vindex bbdb-address-formatting-alist +@cindex Formatting addresses +@cindex Display of addresses +@cindex Address display +Controls the display of addresses in the buffer. Each entry in this +list consists of an identifying function and a formatting function. +The identifying function must accept an address and return @code{t} if +the associated formatting function is to be used. The formatting +function must insert the formatted address in the current buffer. +Identifying functions usually base their decision on the zip code +format or on the country name. The default entries will format an +address using continental style if the zip code matches +@code{bbdb-continental-zip-regexp}. If the zip code does not match, +addresses are formatted in US style. + +@item bbdb-continental-zip-regexp +@vindex bbdb-continental-zip-regexp +@cindex Continental addresses +@cindex European addresses +Decides whether an address should be formatted using US or European +style. If the zip code of an address matches the regular expression, +the European style is used. This works only if the expression +@code{(bbdb-address-is-continental . bbdb-format-address-continental)} +is part of @code{bbdb-address-formatting-alist}. + +@item bbdb-electric-p +@vindex bbdb-electric-p +@cindex Electric display +Whether bbdb mode should be @i{``electric''} like @code{electric-buffer-list}. +Default: @code{t}. What this means is that the BBDB buffer which pops +up when you use it can be disposed of by pressing the space bar, at +which point your window configuration will be restored to what it was +before you invoked the db list. (The @code{bbdb-mode} commands still +work as well.) @refill + +There are some problems with electric modes; for example, keyboard +macros and incremental search don't work. (This is not a bug in BBDB, +but in @file{electric.el}.)@refill + +@item bbdb-case-fold-search +@vindex bbdb-case-fold-search +Default: the same as @code{case-fold-search}. @code{case-fold-search} is +bound to this by @w{@kbd{M-x bbdb}} and related commands. This variable lets +the case-sensitivity of @kbd{^S} and of the bbdb searching commands be +different. + +@item bbdb/mail-auto-create-p +@vindex bbdb/mail-auto-create-p +If this is @code{t} (the default), then @b{VM}, @b{MH}, and @b{RMAIL} +will automatically create new bbdb records for people you receive mail +from. If this variable is a function name or lambda expression, then it +is called with no arguments to decide whether an entry should be +automatically created. You can use this to, for example, not create +records for messages which have reached you through a particular mailing +list, or to only create records automatically if the mail has a +particular subject. See the variables +@code{bbdb-ignore-most-messages-alist} and +@code{bbdb-ignore-some-messages-alist} (@xref{Predefined Hooks}.) @refill + +@item bbdb/news-auto-create-p +@vindex bbdb/news-auto-create-p +@cindex Automatically creating records +If this is @code{t} (default: @code{nil}), then @b{GNUS} will +automatically create new @b{BBDB} records for people you read messages +by. If this is a function name or lambda expression, then it is called +with no arguments to decide whether an entry should be automatically +created. You can use this to, for example, create or not create +messages which have a particular subject. See the variable +@code{bbdb-auto-notes-alist} (@xref{Predefined Hooks}.). @refill + +If you want to autocreate messages based on the current newsgroup, it's +probably a better idea to set this variable to @code{t} or @code{nil} from your +@code{gnus-select-group-hook} instead. @refill + +To automatically remember users in certain groups, you can do something +like @refill +@example +@exdent (setq gnus-select-group-hook +@exdent '(lambda () +@exdent (setq bbdb/news-auto-create-p +@exdent (or (string= "some.news.group" gnus-newsgroup-name) +@exdent (string= "other.news.group" gnus-newsgroup-name))))) +@end example + +@item bbdb-quiet-about-name-mismatches +@vindex bbdb-quiet-about-name-mismatches +If this is false (the default), then @b{BBDB} will prompt you when it notices a +name change, that is, when the ``real name'' in a message doesn't correspond +to a record already in the database with the same network address. As in, +@w{@i{``John Smith <jqs@@frob.com>''}} versus +@w{@i{``John Q. Smith <jqs@@frob.com>''.}} If this is true, then you will +not be asked if you want to change it (and it will not be changed.) +If a number then it is the number of seconds to sit-for while +displaying the name mismatch. +@refill + +@item bbdb-use-alternate-names +@vindex bbdb-use-alternate-names +@cindex Alternate names +@cindex AKA +If this is false, then the @b{BBDB} will not use the @b{AKA} field. +Otherwise (the default) then the mail and news interfaces will ask you +if you want to add an alternate name when a name-change is noticed, and +will ask you whether the new name should be made the primary one. +Note that if @code{bbdb-quiet-about-name-mismatches} is true, you will +not be asked any questions about alternate names. + +@item bbdb-readonly-p +@vindex bbdb-readonly-p +If this is true (default: @code{nil}), then nothing will attempt to change the +database implicitly, and you will be prevented from doing it +explicitly. If you have more than one emacs running at the same time, +you might want to arrange for this to be set to @code{t} in all but one of +them. @refill + +@item bbdb-auto-revert-p +@vindex bbdb-auto-revert-p +If this variable is true (default: @code{nil}) and the @b{BBDB} file is noticed to +have changed on disk, it will be automatically reverted without +prompting you first. Otherwise you will be asked. (But if the file has +changed and you have made changes in memory as well, you will always be +asked.) @refill + +@item bbdb-notice-auto-save-file +@vindex bbdb-notice-auto-save-file +@cindex Auto-save files +If this is true (default: @code{nil}), then the @b{BBDB} will notice when its +auto-save file is newer than the file is was read from, and will offer +to revert. @refill + +@item bbdb-use-pop-up +@vindex bbdb-use-pop-up +@cindex Automatic display of the corresponding record +If true (the default), display a continuously-updating @b{BBDB} +window while in @b{VM}, @b{MH}, @b{RMAIL}, or @b{GNUS}. +Each time a new message is selected, the record corresponding to +that message's sender will be displayed in another window. The +buffer in this other window will be in bbdb-mode, and all +corresponding commands will be available. @refill + +This buffer will be positioned on the screen by finding the tallest +of the windows present, and splitting it such that the bottom +@code{bbdb-pop-up-target-lines} lines of the window display the +@samp{*BBDB*} buffer. With the default configurations of @b{VM}, +@b{MH}, @b{RMAIL}, and @b{GNUS}, this means that the bbdb-list +buffer will be just below the message-body buffer. @refill + +If this is the symbol @code{horiz}, then the @b{BBDB} window will be +stacked horizontally instead of vertically, if there is room to do that +tastefully. @refill + +@item bbdb-pop-up-target-lines +@vindex bbdb-pop-up-target-lines +Desired number of lines in a @b{VM/MH/RMAIL/GNUS} pop-up @b{BBDB} window, +default 5. @refill + +@item bbdb-completion-type +@vindex bbdb-completion-type +@cindex Completion +@cindex Name completion +@cindex Mail address completion +@cindex Address completion +Controls the behavior of the @code{bbdb-complete-name} command. If @code{nil} +(the default), completion is done across the set of all full-names and +user-ids in the database; if the symbol @code{name}, completion is +done on real-names only; if the symbol @code{net}, completion is done +on network addresses only; if it is @code{primary}, then completion is +done only across the set of primary network addresses (the first address +in the list of addresses for a given user). If it is +@code{primary-or-name}, completion is done across primaries and real +names. @refill + +@item bbdb-expand-mail-aliases +@vindex bbdb-expand-mail-aliases +@cindex Completion +@cindex Name completion +@cindex Mail address completion +@cindex Address completion +If non-nil, expand mail aliases in `bbdb-complete-name'. +@refill + +@item bbdb-complete-name-allow-cycling +@vindex bbdb-complete-name-allow-cycling +@cindex Completion +@cindex Name completion +@cindex Mail address completion +@cindex Address completion +Whether to allow cycling of email addresses when calling +`bbdb-complete-name' on a completed address in a composition buffer." +@refill + +@item bbdb-complete-name-full-completion +@vindex bbdb-complete-name-full-completion +@cindex Completion +@cindex Name completion +@cindex Mail address completion +@cindex Address completion +Show full expanded completion rather than partial matches. +If t then do it always, if a number then just is the number of +completions for a specific match is below that number. +@refill + +@item bbdb-user-mail-names +@vindex bbdb-user-mail-names +A regular expression identifying the addresses that belong to you. If a +message from an address matching this is seen, the @b{BBDB} record for the +@samp{To:} line will be shown instead of the one for the @samp{From:} +line. If this is @code{nil}, it will default to the value of +@code{(user-login-name)}. @refill + +@item bbdb-always-add-addresses +@vindex bbdb-always-add-addresses +If this is @code{t}, then whenever the Insidious Big Brother Database +notices a new email address corresponding to a person who is in the +database, it will add it to the database. If this is the symbol +@code{ask} (the default), then whenever a new network address is +noticed for a person in the database, you will be asked whether to add +the address. If this is @code{nil} then new network addresses will +never be automatically added. @refill + +When set to a function name, @b{BBDB} calls the function to decide +whether to add the address or not; it should return one of the above +values. You may find the functions +@code{bbdb-ignore-some-messages-hook} or +@code{bbdb-ignore-most-messages-hook} useful here. @xref{Predefined +Hooks}. +@refill + +@item bbdb-new-nets-always-primary +@vindex bbdb-new-nets-always-primary +If this is @code{t}, then when the Insidious Big Brother Database adds a new +address to a record, it will always add it to the front of the list of +addresses, making it the primary address. If this is @code{nil} (the default), +then you will be asked. If this is the symbol @code{never} (really if +it is not @code{t} and not @code{nil}) then new network addresses will +always be added to the end of the list. @refill + +@item bbdb-canonicalize-redundant-nets-p +@vindex bbdb-canonicalize-redundant-nets-p +If this is non-@code{nil}, redundant network addresses will be ignored. +If a record has an address of the form @code{foo@@baz.com}, setting this +to @code{t} will cause subsequently-noticed addresses +like @code{foo@@bar.baz.com} to be ignored (since we already have a more +general form of that address.) This is similar in function to one of +the possible uses of the variable @code{bbdb-canonicalize-net-hook} +but is somewhat more automatic. (This can't quite be implemented in +terms of the canonicalize-net-hook because it needs access to the +database to determine whether an address is redundant, and the +canonicalize-net-hook is purely a textual manipulation which is +performed before any database access.) + +@item bbdb-message-caching-enabled +@vindex bbdb-message-caching-enabled +Whether caching of the message->bbdb-record association should be +used for the interfaces which support it (@b{VM}, @b{MH}, and +@b{RMAIL}). This can speed things up a lot. One implication of +this variable being true (the default) is that the +@code{bbdb-notice-hook} will not be called each time a message is +selected, but only the first time. Likewise, if selecting a message +would generate a question (whether to add an address, change the +name, etc) you will only be asked that question the very first time +the message is selected. @refill + +@item bbdb-offer-save +@vindex bbdb-offer-save +If @code{t} (the default), then certain actions will cause the @b{BBDB} to +ask you whether you wish to save the database. If @code{nil}, then the +offer to save will never be made. If not @code{t} and not @code{nil}, then +any time it would ask you, it will just save it without asking. @refill + +@end table + +@node Customization Hooks, Predefined Hooks, Customization Parameters, Options +@subsection Customization Hooks + +All of the hooks variables described below may be set to a symbol or +lambda expression, which will be funcalled; or may be set to a list of +symbols or lambda expressions, each of which will be funcalled in turn. +Almost all hooks in Emacs work this way. But notice that some of the +hooks described below are called with arguments. + +@table @code +@item bbdb-list-hook +@vindex bbdb-list-hook +Hook or hooks invoked after the bbdb-list-buffer is filled in. Invoked +with no arguments. @refill + +@item bbdb-create-hook +@vindex bbdb-create-hook +Hook or hooks invoked each time a new bbdb-record is created. Invoked +with one argument, the new record. This is called @emph{before} the record is +added to the database. Note that @code{bbdb-change-hook} will be called as +well. @refill + +@item bbdb-change-hook +@vindex bbdb-change-hook +Hook or hooks invoked each time a bbdb-record is altered. Invoked with +one argument, the record. This is called @emph{before} the database buffer +is modified. Note that if a new bbdb record is created, both this hook and +@code{bbdb-create-hook} will be called. @refill + +@item bbdb-mode-hook +@vindex bbdb-mode-hook +Hook or hooks invoked when the @samp{*BBDB*} buffer is created. + +@item bbdb-notice-hook +@vindex bbdb-notice-hook +Hook or hooks invoked each time a bbdb-record is ``noticed,'' that +is, each time it is displayed by the news or mail interfaces. +Invoked with one argument, the new record. The record need not have +been modified for this to be called - use @code{bbdb-change-hook} for that. +You can use this to, for example, add something to the notes field +based on the subject of the current message. It is up to your hook +to determine whether it is running in @b{GNUS}, @b{VM}, +@b{MH}, or @b{RMAIL}, and to act appropriately. @refill + +Also note that @code{bbdb-change-hook} will @emph{not} be called as a +result of any modifications you may make to the record inside this +hook. @refill + +Beware that if the variable @code{bbdb-message-caching-enabled} is +true (a good idea) then when you are using @b{VM}, @b{MH}, or +@b{RMAIL}, this hook will be called only the first time that +message is selected. (The @b{GNUS} interface does not use caching.) +When debugging the value of this hook, it is a good idea to set +caching-enabled to @code{nil}. @refill + +@item bbdb-after-read-db-hook +@vindex bbdb-after-read-db-hook +Hook or hooks invoked (with no arguments) just after the Insidious Big +Brother Database is read in. Note that this can be called more than once if +the @b{BBDB} is reverted. One possible use for this is to rename the +@file{.bbdb} buffer; for example @refill + +@code{(setq bbdb-after-read-db-hook '(lambda () (rename-buffer " bbdb")))} + +@noindent +will cause the buffer visiting the @code{bbdb-file} to be +called @w{@code{" bbdb"}}. The leading space in its name will prevent +it from showing up in the buffer list. + +@item bbdb-load-hook +@vindex bbdb-load-hook +Hook or hooks invoked (with no arguments) when the Insidious Big Brother +Database code is first loaded. WARNING: Slow functions should not be +put on this hook, as the @b{BBDB} code will, if not loaded before, be +loaded during the first use of @b{BBDB}-related Customization +functions. Slow functions should be put on @code{bbdb-initialize-hook}. + +@item bbdb-initialize-hook +@vindex bbdb-initialize-hook +@findex bbdb-initialize +Hook or hooks invoked (with no arguments) when the +@code{bbdb-initialize} function is called. + +@item bbdb-canonicalize-net-hook +@vindex bbdb-canonicalize-net-hook +If this is non-@code{nil}, it should be a function of one argument: a +network address string. (Note that, unlike the other hook-variables +described above, this may not be a list of functions.) Whenever the +Insidious Big Brother Database ``notices'' a message, the corresponding +network address will be passed to this function first, as a kind of +``filter'' to do whatever transformations upon it you like before it is +compared against or added to the database. For example: it is the case +that @code{CS.CMU.EDU} is a valid return address for all mail +originating at a machine in the @code{.CS.CMU.EDU} domain. So, if you +wanted all such addresses to be canonically hashed as +@code{user@@CS.CMU.EDU}, instead of as @code{user@@somehost.CS.CMU.EDU}, +you might set this variable to a function like this: @refill + +@example +(setq bbdb-canonicalize-net-hook + '(lambda (addr) + (cond ((string-match + "\\`\\([^@@]+@@\\).*\\.\\(CS\\.CMU\\.EDU\\)\\'" + addr) + (concat (substring addr + (match-beginning 1) (match-end 1)) + (substring addr + (match-beginning 2) (match-end 2)))) + (t addr)))) +@end example + +You could also use this function to rewrite UUCP-style addresses into +domain-style addresses, or any number of other things.@refill + +This function will be called repeatedly until it returns a value EQ to the +value passed in. So multiple rewrite rules might apply to a single +address.@refill + +There is an example of the use of this variable in the +file @file{bbdb-hooks.el}: the function +@code{sample-bbdb-canonicalize-net-hook}.@refill +@end table + +@vindex bbdb-change-hook +@findex bbdb-delete-redundant-nets +The @code{bbdb-canonicalize-net-hook} is powerful in that it allows +arbitrary rewriting of addresses, however, in many cases that is +overkill. The function @code{bbdb-delete-redundant-nets} can be +used as a value of @code{bbdb-change-hook} to cause network addresses +which appear to be ``redundant'' to be deleted each time a modification +is made to a record. @refill + +This works as follows: suppose one gets mail from @code{user@@foo.bar.com}, +and then later gets mail from @code{user@@bar.com}. At this point, one +can generally delete the @code{user@@foo.bar.com} address, since the +@code{user@@bar.com} address is more general. (See also the +variable `bbdb-canonicalize-redundant-nets-p', which has the effect of +ignoring subsequent addresses from @code{user@@quux.bar.com} if the +address @code{user@@bar.com} is already known.)@refill + +@node Predefined Hooks, , Customization Hooks, Options +@subsection Predefined Hooks + +@findex bbdb-timestamp-hook +@cindex Timestamping records +If the variable @code{bbdb-change-hook} is set to the symbol +@code{bbdb-timestamp-hook} (the default), then every record in the +database will have a field named @samp{timestamp}, which will always +contain the date and time at which this record was created or last +modified. + +@findex bbdb-creation-date-hook +If the variable @code{bbdb-create-hook} is set to the symbol +@code{bbdb-creation-date-hook} (the default), then every record in the +database will have a field named @samp{creation-date}, which will +contain the date and time at which this record was added to the +database. + +@findex bbdb-ignore-most-messages-hook +@vindex bbdb-ignore-most-messages-alist +@cindex Automatically creating records +If the variable @code{bbdb/mail-auto-create-p} is set to the symbol +@code{bbdb-ignore-most-messages-hook}, then the variable +@code{bbdb-ignore-most-messages-alist} will determine which messages +should have records automatically created for them. The format of this +alist is @refill +@example +(( @var{HEADER-NAME} . @var{REGEXP} ) @dots{} ) +@end example +@noindent +for example, +@example +(("From" . "@@.*\\.maximegalon\\.edu") + ("Subject" . "time travel")) +@end example + +@noindent +will cause @b{BBDB} entries to be made only for messages sent by +people at Maximegalon U., or (that's @emph{or}) people posting +about time travel. @refill + +There may be only one entry per header in this alist: that is, @refill + +@example +(("From" . "addr1\\|addr2") @dots{} ) +@end example + +@noindent +is legal, but + +@example +(("From" . "addr1") ("From" . "addr2") @dots{} ) +@end example + +@noindent +is not. + +@vindex bbdb/mail-auto-create-p +@vindex bbdb/news-auto-create-p +@findex bbdb-ignore-some-messages-hook +@vindex bbdb-ignore-some-messages-alist +If the variable @code{bbdb/mail-auto-create-p} is set to the symbol +@code{bbdb-ignore-some-messages-hook}, then the variable +@code{bbdb-ignore-some-messages-alist} will determine which messages +should have records automatically created for them. This is the exact +inverse of the semantics of the @code{bbdb-ignore-most-messages-alist}: +the alist specifies which messages should @emph{not} have records +automatically created for them, instead of which should. For +example, @refill + +@example +(("From" . "mailer.daemon") + ("To" . "mailing-list-1\\|mailing-list-2") + ("CC" . "mailing-list-1\\|mailing-list-2")) +@end example + +@noindent +will cause @b{BBDB} entries to not be made for messages from any mailer daemon, +or messages sent to or @b{CC}ed to either of two mailing lists. @refill + +The variable @code{bbdb/news-auto-create-p} may be set to either of the +above-mentioned functions as well, to get this behavior for netnews +messages instead of mail messages.@refill + +@vindex bbdb-notice-hook +@vindex bbdb-auto-notes-alist +@cindex Automatically adding text to records +If the variable @code{bbdb-notice-hook} is set to the symbol +@code{bbdb-auto-notes-hook}, then the variable @code{bbdb-auto-notes-alist} +may be used to automatically add text to the notes fields of the records +corresponding to certain messages. The format of this alist is @refill + +@example +(( @var{HEADER-NAME} + (@var{REGEXP} . @var{STRING}) @dots{} ) + @dots{} ) +@end example + +@noindent +for example, + +@example +(("To" ("-vm@@" . "VM mailing list")) + ("Subject" ("sprocket" . "mail about sprockets") + ("you bonehead" . "called me a bonehead"))) +@end example + +@noindent +will cause the text @code{"VM mailing list"} to be added to the notes field of +the record corresponding to anyone you get mail from via one of the @b{VM} +mailing lists. If, that is, @code{bbdb/mail-auto-create-p} is set such +that the record would have been created, or if the record already +existed.@refill + +The format of elements of this list may also be + +@example +(@var{REGEXP} @var{FIELD-NAME} @var{STRING}) +@end example +@noindent +or +@example +(@var{REGEXP} @var{FIELD-NAME} @var{STRING} @var{REPLACE-P}) +@end example + +@noindent +meaning add the given string to the named field. The field-name may not +be @samp{name}, @samp{aka}, @samp{address}, @samp{phone}, or @samp{net} +(builtin fields) but must be either @samp{notes}, @samp{company}, or the +name of a user-defined note-field. @refill + +@example +("pattern" . "string to add") +@end example + +@noindent +is equivalent to + +@example +("pattern" notes "string to add") +@end example + +@noindent +@var{STRING} can contain @code{\&} or @code{\N} escapes like in the function +@code{replace-match}. For example, to automatically add the contents of the +@b{organization} field of a message to the @code{company} field of a @b{BBDB} +record, you can use this: @refill + +@example +("Organization" (".*" company "\\&")) +@end example + +@noindent +(Note you need two \ to get a single \ into a lisp string literal.) + +If STRING is an integer @i{N}, the @i{N}th matching subexpression is +used, so the above example could be written more efficiently as @refill + +@example +("Organization" (".*" company 0)) +@end example + +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. + +If the @var{REPLACE-P} flag is true, then the string replaces the old +contents instead of being appended to it. + +If multiple clauses match the message, all of the corresponding strings +will be added. @refill + +If the string is being appended (@var{REPLACE-P} is false or not +provided) then the new string is appended to the end of the existing +field value, with an intervening newline. So each piece of text +automatically added to this field will go on its own line. @refill + +You can control what the separator is by putting a @code{field-separator} +property on the symbol naming the field. For example, to make text +automatically added to a field named @code{newsgroups} be separated by +commas, you could do @refill + +@example +(put 'newsgroups 'field-separator "; ") +@end example + +This variable works for news as well. You might want to arrange for +this to have a different value when in mail as when in news. @refill + +There may be only one entry per header in this alist: that is,@refill + +@example + (("Subject" ("\\bfoo\\b" . "Foo!!") + ("bar" . "Bar!"))) +@end example + +@noindent +will work, but + +@example + (("Subject" ("\\bfoo\\b" . "Foo!!")) + ("Subject" ("bar" . "Bar!"))) +@end example + +@noindent +will not. + +Here's a more complicated example: some people include bitmaps of +themselves in their mail messages in an @b{X-Face:} header field. +You can capture this field into the @samp{*BBDB*} with the +following: + +@example +(setq bbdb-auto-notes-alist + (append bbdb-auto-notes-alist + (list "x-face" + (list (concat "[ \t\n]*\\([^ \t\n]*\\)" + "\\([ \t\n]+\\([^ \t\n]+\\)\\)?" + "\\([ \t\n]+\\([^ \t\n]+\\)\\)?" + "\\([ \t\n]+\\([^ \t\n]+\\)\\)?" + ) + 'face + "\\1\\3\\5\\7")))) +@end example + +@noindent +(The calls to @code{list} and @code{concat} are just for readability, it +could easily be a constant.) The tricky bit here is that it strips out +the newlines and whitespace used for header continuation, which are not +actually a part of the face data. So though the mail message may have +the face data on multiple lines, the entry in the @samp{*BBDB*} will +be just one line. + +@vindex bbdb-auto-notes-ignore +@code{bbdb-auto-notes-ignore} is an alist of headers and regexps to +ignore in @code{bbdb-auto-notes-hook}. Each element looks like @refill + +@example +(@var{HEADER} . @var{REGEXP}) +@end example + +@noindent +for example, + +@example +("Organization" . "^Gatewayed from\\|^Source only") +@end example + +@noindent +would exclude the phony @code{Organization:} headers in GNU mailing-lists +gatewayed to the @code{gnu.*} newsgroups. Note that this exclusion +applies only to a single field, not to the entire message. For that, +use the variable @code{bbdb-auto-notes-ignore-all}. + +@vindex bbdb-auto-notes-ignore-all +@code{bbdb-auto-notes-ignore-all} is an alist of headers and regexps +which cause the entire message to be ignored in @code{bbdb-auto-notes-hook}. +Each element looks like @refill + +@example +(@var{HEADER} . @var{REGEXP}) +@end example + +@noindent +for example, + +@example +("From" . "BLAT\\.COM") +@end example + +@noindent +would exclude any notes recording for message coming from @code{BLAT.COM}. +Note that this is different from @code{bbdb-auto-notes-ignore}, which +applies only to a particular header field, rather than the entire message. + +@node Utilities, Internals, Options, Top +@section Utilities + +This section describes @b{BBDB} functionality that does not fit neatly into +other sections. + +@menu +* bbdb-ftp:: Storing FTP sites in the @b{BBDB} +* bbdb-print:: Print the @b{BBDB} +* bbdb-snarf:: Record generation from raw text +* bbdb-srv:: External control of the @b{BBDB} +@end menu + +@node bbdb-ftp +@subsection @code{bbdb-ftp} +@cindex Storing FTP sites in the BBDB +@findex bbdb-ftp + +The @code{bbdb-ftp} utility enables the storage of FTP sites as @b{BBDB} +records. The @code{bbdb-create-ftp-site} function is used to create a +@b{BBDB} record for an FTP site. The command will prompt for information +needed to create the record. The FTP site for a given record can be accessed +with the @code{bbdb-ftp} command. + +@node bbdb-print, bbdb-snarf, bbdb-ftp, Utilities +@subsection @code{bbdb-print} +@cindex Printing records in the database +@findex bbdb-print + +@code{bbdb-print} is a utility for pretty-printing entries from the @b{BBDB} +using TeX. It is invoked by pressing @kbd{P} in the @code{*BBDB*} buffer - +this will cause all records in the @b{BBDB} to be printed as governed by the +variables described below. If @kbd{P} is prefixed by a @kbd{*}, only the +currently-displayed records will be printed. Once invoked, @code{bbdb-print} +will generate the TeX output in a buffer named @file{~/bbdb.tex} (controlled +by @code{bbdb-print-file-name}). The generated output will be shown, and must +be @b{manually} saved. + +For each record printed, @code{bbdb-print} will look for the presence of the +@code{tex-name} field. If this field is found, its value will be printed +instead of the @code{name} field for the record in question. This field is +intended to allow the storage of names with accents or other characters that +would be illegal in the address portion of a message. While other fields have +special characters quoted by @code{bbdb-print} as described below, the +contents of the @code{tex-name} field (if present) are used verbatim. + +The following variables govern the printing of records (and of the printing of +the fields therein): + +@table @code +@item bbdb-print-omit-fields +@vindex bbdb-print-omit-fields +This variable should be set to a list of the fields that are not to be printed +by @code{bbdb-print}. It defaults to:@* +@center @code{(omit tex-name aka mail-alias)} + +@item bbdb-print-file-name +@vindex bbdb-print-file-name +The name of the file where generated TeX output is to be stored. The default +is @file{~/bbdb.tex}. + +@item bbdb-print-require +@vindex bbdb-print-require +The fields required for printing a record. This allows, for example, only +records with phone numbers to be printed. The value of the value of the +variable will be evaluated once for each record, and the record will be +printed only if the evaluation returns a non-nil value. The symbols +@code{name}, @code{company}, @code{net}, @code{phone}, @code{address}, and +@code{notes} will be set to the appropriate values during evaluation; they +will be nil if the field does not exist or is elided. + +The value of this variable can be any lisp expression, but typically +it will be used for a boolean combination of the field variables, as +in the following simple examples: + +@itemize @bullet +@item Print only people whose phone numbers are known:@* +@center @code{(setq bbdb-print-require 'phone)} +@item Print people whose names AND companies are known:@* +@center @code{(setq bbdb-print-require '(and name company))} +@item Print people whose names, and either addresses OR phone numbers are +known:@* +@center @code{(setq bbdb-print-require '(and name (or address phone))).} + +The default value is:@* +@center @code{(or address phone)} +@end itemize + +@item bbdb-print-alist +@vindex bbdb-print-alist +Formatting options for all formats of @code{bbdb-print}. The value is an +alist of the form@* +@center @code{((@var{OPTION} . @var{VALUE}) (@var{OPTION} . @var{VALUE}) ...)} + +Separate settings can be configured using @code{bbdb-print-brief-alist} and +@code{bbdb-print-full-alist}. Settings in these variables will override the +ones in @code{bbdb-print-alist}. + +The possible options and legal settings are: +@table @code +@item columns +@code{1}, @code{2}, @code{3}, @code{4}, @code{quad} (4 little +2-column pages per sheet) or @code{grid} (12 credit-card-sized pages per +sheet). + +@item separator +@code{0}-@code{7}, the style of heading for each letter. @code{0}=none, +@code{1}=line, @code{2}=boxed letters, @code{3}=large boxed letters, +@code{4}=large letters, @code{5}=letters with lines, @code{6}=letters with +suits, @code{7}=boxed letters with suits. + +@item omit-area-code +A regular expression matching area codes to omit. + +@item phone-on-first-line +If @code{t}, the first phone number will be put on the same line as the name. +If @code{nil}, the name will be the only text on the line. If set to a +string, the field of type @code{phone} whose name matches the string will be +used. The string should be a valid regular expression. + +@item n-phones +Maximum number of phone numbers to include. + +@item n-addresses +Maximum number of addresses to include. + +@item include-files +List of TeX files to @code{\input}. If the filenames are not absolute, the +files must be located somewhere in the TeX input path. + +@item ps-fonts +Postscript fonts (TimesNewRoman and Courier) will be used if the value +is non-@code{nil}. Standard TeX fonts (ec-fonts) will be used +otherwise. + +@item font-size +The integer point size of the font to be used. + +@item hsize +The horizontal dimension of the pages. The value must be a string, and must +be a valid TeX dimension. Alternatively, the TeX default will be used if the +value is @code{nil}. + +@item vsize +The vertical dimension of the pages. The value must be a string, and must +be a valid TeX dimension. Alternatively, the TeX default will be used if the +value is @code{nil}. + +@item hoffset +The TeX output will be offset to the right by the value of this option. The +value must be either a string containing a valid TeX dimension or @code{nil} +or @code{0} to use the default TeX horizontal offset. + +@item voffset +The TeX output will be offset downward by the value of this option. The +value must be either a string containing a valid TeX dimension or @code{nil} +or @code{0} to use the default TeX vertical offset. + +@item quad-hsize +Horizontal size to be used for the individual pages in the quad format. The +value must be a string containing a valid TeX dimension. + +@item quad-vsize +Vertical size to be used for the individual pages in the quad format. The +value must be a string containing a valid TeX dimension. +@end table + +The default value is +@example +((omit-area-code . "(@var{AREA-CODE})") + (phone-on-first-line . "^[ \t]*$") + (ps-fonts . nil) + (font-size . 6) + (quad-hsize . "3.15in") + (quad-vsize . "4.5in")) +@end example + +Where @var{AREA-CODE} is the value of @code{bbdb-default-area-code} or +@samp{000} if there is no default area code. + +@item bbdb-print-brief-alist +@vindex bbdb-print-brief-alist +Extra options for the @code{bbdb-print} brief format. The value(s) of +this variable can either supplement or override the values in +@code{bbdb-print-alist}. The format and possible values of this variable are +as in @code{bbdb-print-alist}, described above. + +The default value is +@example +((columns . 1) + (separator . 1) + (n-phones . 2) + (n-addresses . 1) + (include-files "bbdb-print-brief" "bbdb-cols")) +@end example + +@item bbdb-print-full-alist +@vindex bbdb-print-full-alist +Extra options for the @code{bbdb-print} non-brief format. The value(s) of +this variable can either supplement or override the values in +@code{bbdb-print-alist}. The format and possible values of this variable are +as in @code{bbdb-print-alist}, described above. + +The default value is +@example +((columns . 3) + (separator . 2) + (include-files "bbdb-print" "bbdb-cols")) +@end example + +@item bbdb-print-prolog +@vindex bbdb-print-prolog +TeX statements to include at the beginning of the @code{bbdb-print} output +file. + +@item bbdb-print-epilog +@vindex bbdb-print-epilog +TeX statements to include at the end of the @code{bbdb-print} output file. + +@end table + +@node bbdb-snarf, bbdb-srv, bbdb-print, Utilities +@subsection @code{bbdb-snarf} + +@code{bbdb-snarf} provides the ability to generate @b{BBDB} records from raw +text. If invoked as @code{bbdb-snarf}, it attempts to generate the record +from the information around point (the cursor). If invoked as +@code{bbdb-snarf-region}@footnote{@code{bbdb-snarf} is actually a wrapper for +@code{bbdb-snarf-region} that determines the relevant region and passes it +on.}, the active region is used to generate the record. + +@noindent +@b{Restrictions:} + +@enumerate +@item +@code{bbdb-snarf} currently recognizes only US-style phone numbers. +@item +@code{bbdb-snarf} works best with things that look like mailing addresses. +@end enumerate + +@noindent +Example of an address that @code{bbdb-snarf} will recognize: + +@example +another test person +1234 Gridley St. +Los Angeles, CA 91342 +555-1212 +test@@person.net +http://www.foo.bar/ +other stuff about this person +@end example + +@node bbdb-srv, , bbdb-snarf, Utilities +@subsection @code{bbdb-srv} + +@code{bbdb-srv} provides the ability to initiate the display of @b{BBDB} +records from outside of Emacs. This allows external programs to cause +the @b{BBDB} record for a given person to appear in the running Emacs +when, for example, mail is recieved from that person. One specific +application, described below, is the integration of Netscape and the +@b{BBDB}, allowing the display of @b{BBDB} records corresponding to Mail +and/or News messages displayed in Netscape. + +@code{bbdb-srv} is composed of two parts - an external Perl script +(@file{utils/bbdb-srv.pl}), and an Emacs Lisp file +(@file{lisp/bbdb-srv.el}). The external portion is used to send +commands to the internal portion. + +@b{NOTE:} @code{bbdb-srv} requires @code{gnuserv} and @code{itimer}, +both included with XEmacs. @code{gnuserv} must be started with the +@code{gnuserv-start} command before @code{bbdb-srv} can be used. + +In it's most basic form, mail or news headers are passed to the Perl +script. The Perl script then causes the @b{BBDB} record (if any) +corresponding to the passed headers to be displayed in the running +Emacs. While @code{bbdb-srv} will operate with just a @samp{From:} +field, it works better when passed both @samp{From:} and @samp{To:} +headers. When @code{bbdb-srv} notices that the logged-in user is named +in the @samp{From:} header, it will attempt to display the record (if +any) for the person named in the @samp{To:} header. If no @samp{To:} +header is passed, it falls back on the record (if any) for the logged-in +user (the person named in the @samp{From:} header). + +An example manual invocation of @code{bbdb-srv} is as follows: + +@example +% cat |bbdb-srv.pl +From: Jamie Zawinski <jwz@@netscape.com> +To: Matt Simmons <simmonmt@@acm.org> +@key{CTRL-D} +@end example + +If the invoking user is Jamie Zawinski, the record for Matt Simmons (if +any) will be displayed. If the invoking user is not Jamie Zawinski, the +record for Jamie Zawinski (if any) will be displayed. + +As mentioned above @code{bbdb-srv} can be used with Netscape Mail and +Netscape News. Please note that it can only be used with the UNIX +versions 3.0b2 and greater of these applications. To allow Netscape to +use @code{bbdb-srv}, set the @samp{NS_MSG_DISPLAY_HOOK} variable to +@code{bbdb-srv.pl}@footnote{Use the full path to @code{bbdb-srv.pl} if +it is not in the default path.} as follows: + +@noindent +Bourne Shell (@file{/bin/sh}) and variants: +@example +# NS_MSG_DISPLAY_HOOK bbdb-srv.pl +# export NS_MSG_DISPLAY_HOOK +@end example + +@noindent +C-Shell (@file{/bin/csh}) and variants: +@example +% setenv NS_MSG_DISPLAY_HOOK bbdb-srv.pl +@end example + +The following variables can be used to customize the behavior of +@code{bbdb-srv}: + +@table @code +@vindex bbdb/srv-auto-create-p +@item bbdb/srv-auto-create-p +This variable is similar to @code{bbdb/news-auto-create-p} and +@code{bbdb/mail-auto-create-p}. That is, when headers are passed in to +@code{bbdb-srv}, a new @b{BBDB} record can be created if none exists, +depending on the value of this variable. Possible values are: +@table @asis +@item @code{t} +Automatically create new @b{BBDB} records if the headers passed in do +not correspond to an already-existing record. +@item @code{nil} +Do not automatically create new @b{BBDB} records. +@item @var{FUNCTION} +@var{FUNCTION} is called. If it returns @code{t}, a record will be +created for the person named in the @samp{From:} header. If it returns +@code{nil}, no record will be created. + +A suggested function for use is +@code{bbdb/srv-auto-create-mail-news-dispatcher}. This function will +attempt to determine the source of the passed headers - whether they +were part of a mail message or of a news article. The action (if any) +dictated by the value of either @code{bbdb/mail-auto-create-p} or +@code{bbdb/news-auto-create-p}, based on the determined source of the +passed headers. + +@end table + +@vindex bbdb/srv-display-delay +@item bbdb/srv/display-delay +@code{bbdb-srv} pauses between displaying the records corresponding to +each passed set of headers. This variable controls the length of time +(in seconds) of the delay between the display of different records. +Note when setting this variable that only one set of headers can be +queued at a time. If three sets of headers are passed to +@code{bbdb-srv} in less than the delay time, only the first and last +will be displayed. +@end table + +@node Internals, Mailing Lists, Utilities, Top +@section Internals + +@b{This section is currently a dumping ground for things that should +eventually go here, but were found elsewhere in the file.} + +@b{INFORMATION IN THIS SECTION IS FOR INFORMATIONAL PURPOSES ONLY. IT +SHOULD NOT BE TAKEN AS DOCUMENTATION OF AN EXTERNAL API. EVERYTHING +LISTED BELOW IS SUBJECT TO CHANGE WITHOUT NOTICE} + +The first time you use +one of the @b{BBDB} commands, this file is read into an emacs buffer, and +remains there. As you make changes to the database, this buffer is +changed as well, ensuring that if it is auto-saved, it will be saved in +its most current state. @refill + +@subsection BBDB data file format + +The data file is arranged in a hierarchical fashion. At the top level +are vectors, with one vector per database record. It is @b{very} +important that each vector be on its own line, as the BBDB builds and +stores markers based on this layout. The markers are then used to +increase the speed of database modifications (more on this later). The +record vectors contain the individual fields of the record. These +fields can be of any type, but are currently integers, strings, lists of +strings, alists, vectors, or lists of vectors. In the case of fields +that contain one or more vectors, they can be further broken down in +terms of the fields of their component vectors. + +In an effort to provide a more concrete example to illustrate the above, +and to provide a reference for database accessor and modifier functions, +we describe the database format below. This description starts with the +fields of the individual record vectors, and drills down through the +vectors used by some of the fields. + +@subsubsection Record Vectors + +@multitable @columnfractions .13 .19 .36 .32 +@item @b{Name} +@tab @b{Type} +@tab @b{Accessor and Modifier} +@tab @b{Description} + +@item First name +@tab String +@tab @code{bbdb-record-firstname}@* + @code{bbdb-record-set-firstname} +@tab Entity's first name + +@item Last name +@tab String +@tab @code{bbdb-record-lastname}@* + @code{bbdb-record-set-lastname} +@tab Entity's last name + +@item AKAs +@tab List of Strings +@tab @code{bbdb-record-aka}@* + @code{bbdb-record-set-aka} +@tab Alternate names for entity + +@item Company +@tab String +@tab @code{bbdb-record-company}@* + @code{bbdb-record-set-company} +@tab Company with which entity is associated + +@item Phones +@tab List of Vectors +@tab @code{bbdb-record-phones}@* + @code{bbdb-record-set-phones} +@tab List of phone number vectors + +@item Addresses +@tab List of Vectors +@tab @code{bbdb-record-addresses}@* + @code{bbdb-record-set-addresses} +@tab List of address vectors + +@item Net address +@tab List of Strings +@tab @code{bbdb-record-net}@* + @code{bbdb-record-set-net} +@tab List of network addresses + +@item Notes +@tab String or Alist +@tab @code{bbdb-record-raw-notes}@* + @code{bbdb-record-set-raw-notes} +@tab String or Association list of note fields (strings) + +@item Cache +@tab Vector +@tab @code{bbdb-record-cache}@* + @code{bbdb-record-set-cache} +@tab Record cache.@* + @i{Internal version only.} + +@end multitable + +The phone, address and cache vector fields are described below. Please +note that, as indicated in the table above, the cache is present only in +the internal version of the database - it is not written out as part of +the @file{.bbdb} file. + +In addition, the accessor and modifier functions for the notes alist +are described. + +@subsubsection Phone Vectors + +To access the fields in the below table, you must first get the list of +phone vectors using the @code{bbdb-record-phones} function. Note that +if you alter the phones field with the @code{bbdb-record-set-phones} +function, you are altering the entire phones list for the given record. +Use the modifier functions below for modifications to individual phone +vectors. + +@multitable @columnfractions .13 .19 .36 .32 +@item @b{Name} +@tab @b{Type} +@tab @b{Accessor and Modifier} +@tab @b{Description} + +@item Location +@tab String +@tab @code{bbdb-phone-location}@* + @code{bbdb-phone-set-location} +@tab Phone number identifier + +@item Area +@tab Integer +@tab @code{bbdb-phone-area}@* + @code{bbdb-phone-set-area} +@tab Area code for phone number + +@item Exchange +@tab Integer +@tab @code{bbdb-phone-exchange}@* + @code{bbdb-phone-set-exchange} +@tab Exchange (aka prefix) for phone number + +@item Suffix +@tab Integer +@tab @code{bbdb-phone-suffix}@* + @code{bbdb-phone-set-suffix} +@tab Suffix for phone number + +@item Extension +@tab Integer +@tab @code{bbdb-phone-extension}@* + @code{bbdb-phone-set-extension} +@tab Phone number extension (@samp{0} if none) + +@end multitable + +@subsubsection Address Vectors + +To access the fields in the below table, you must first get the list of +address vectors using the @code{bbdb-record-addresses} function. Note +that if you alter the addresses field with the +@code{bbdb-record-set-addresses} function, you are altering the entire +addresses list for the given record. Use the modifier functions below +for modifications to individual address vectors. + +@multitable @columnfractions .13 .19 .36 .32 +@item @b{Name} +@tab @b{Type} +@tab @b{Accessor and Modifier} +@tab @b{Description} + +@item Location +@tab String +@tab @code{bbdb-address-location}@* + @code{bbdb-address-set-location} +@tab Address identifier + +@item Streets +@tab List +@tab @code{bbdb-address-streets}@* + @code{bbdb-address-set-streets} +@tab List of street address lines. @code{nil} if none. + +@item Street3 +@tab String +@tab @code{bbdb-address-street3}@* + @code{bbdb-address-set-street3} +@tab Third line of street address. ``'' if none. + +@item City +@tab String +@tab @code{bbdb-address-city}@* + @code{bbdb-address-set-city} +@tab City name + +@item State +@tab String +@tab @code{bbdb-address-state}@* + @code{bbdb-address-set-state} +@tab State abbreviation + +@item Zip +@tab Integer (american) + List (non-american) +@tab @code{bbdb-address-zip}@* + @code{bbdb-address-set-zip} +@tab Zip code + +@item Country +@tab String +@tab @code{bbdb-address-country}@* + @code{bbdb-address-set-country} +@tab Country + +@end multitable + +@subsubsection Cache Vector + +This vector is present only in the internal database representation. It +is not written out to the database file because it contains information +aggregated from the rest of the record that is reconstructed when the +database is read. To write the cache information to the database file +would increase the risk of database inconsistency, and would violate the +principles of normalization. + +To access the cache fields using the functions listed below that begin +with @code{bbdb-cache-}, you must first get the cache vector using the +@code{bbdb-record-cache} function. The functions that begin with +@code{bbdb-record-} get the cache vector internally. Note that if you +alter the cache field in the high-level record with the +@code{bbdb-record-set-cache} function, you are altering the entire cache +vector for the given record. Use the modifier functions below for +modifications to individual cache fields. + +@multitable @columnfractions .15 .17 .36 .32 +@item @b{Name} +@tab @b{Type} +@tab @b{Accessor and Modifier} +@tab @b{Description} + +@item Name Cache +@tab String +@tab @code{bbdb-cache-namecache}@* + @code{bbdb-cache-set-namecache} +@tab Preconcatenated name of entity + +@item Sort Key +@tab String +@tab @code{bbdb-cache-sortkey}@* + @code{bbdb-cache-set-sortkey} +@tab Preconcatenated sort key for record + +@item Marker +@tab Marker +@tab @code{bbdb-cache-marker}@* + @code{bbdb-record-marker}@* + @code{bbdb-cache-set-marker}@* + @code{bbdb-record-set-marker}@* +@tab Marker in @file{.bbdb} for start of record + +@item Deleted +@tab Boolean +@tab @code{bbdb-cache-deleted-p}@* + @code{bbdb-record-deleted-p}@* + @code{bbdb-cache-set-deleted-p}@* + @code{bbdb-record-set-deleted-p} +@tab Set to @code{t} if record has been deleted, @code{nil} if not + +@end multitable + +The functions listed above will return @code{nil} if their respective +cache fields are not set. The functions listed below will return the +value of their cache fields if set, but will also build (and set) the +correct field values if the fields are unset: + +@table @code +@item bbdb-record-name +Return the name in the Name Cache field of the cache (if set). If +the name has not been built yet (if the field is @code{nil}), the name is +built, stored in the Name Cache field, and returned. + +@item bbdb-record-sortkey +Return the name it the Sort Key field of the cache (if set). If the +Sort Key field has not yet been set (if the field is @code{nil}), the +Sort Key is built, stored in the Sort Key field, and returned. + +@end table + +@subsubsection Notes String or Alist + +If there is only a single note for a given record, the notes field for +that record will be a string. If there is more than one note, the notes +field will be an association list (alist) with elements of the form + +@center ( @var{NAME} . @var{VALUE} ) + +@noindent +where @var{NAME} is the symbol for the name of the note, and +@var{VALUE} is the value of the note. + +@subsubsection Example BBDB record + +@node Mailing Lists, Changes, Internals, Top +@section Mailing Lists + +(If you are looking for a way to create mailing lists with @b{BBDB}, you +should be looking at the section on @xref{Mail Sending Interfaces}.) + +There are three mailing lists for the @b{BBDB}. +@code{bbdb-info@@lists.sourceforge.net} gets moderate traffic, and is +intended for the discussion and distribution of development versions of +the @b{BBDB}. Users of development versions of the @b{BBDB} should be +subscribed to this list. It is also to this list that bugs should be +reported. @xref{Known Bugs}. for instructions on submitting bug reports. + +The second mailing list @code{bbdb-announce@@lists.sourceforge.net} has +very low volume. Any user of the @b{BBDB} should consider subscribing to +this list, as new releases and security issues will be posted here. + +A third mailing list, @code{bbdb-cvs@@lists.sourceforge.net}, is +intended for developers to follow the changes made to the @b{BBDB} +development version. Developers of the @b{BBDB} should consider to +subscribe to this list. + +@node Changes, The Latest Version, Mailing Lists, Top +@section Changes in this Version + +@menu +* Major Changes:: Major changes in this version +* Other Changes:: Not-so-major changes +@end menu + +@node Major Changes, Other Changes, Changes, Changes +@subsection Major Changes + +@subsubheading Database File Version Change + +(the following version-migration text will move in a future version. It is in +this section currently because new users will likely not experience it) + +There has been a version change in the @b{BBDB} database file. The new +version supports non-US zip codes, and an additional ``Country'' field +in addresses. + +An automatic version-migration mechanism has been implemented that allows +older version @file{.bbdb} files to either be migrated to the new version, or +used as-is without migrating. When the @b{BBDB} detects a database file with +an old version, it will display the features that have been introduced @b{in +the database file} from the time of the older version's implementation. It +will offer the choice of migration or use of the @b{BBDB} with the +older-version file. + +If migration is chosen, the database file will be automatically changed to the +new format. If migration is declined, the file will kept in the older format +in the @code{.bbdb} buffer, but will be stored internally in the new format. +When changes need to be made to the @code{.bbdb} buffer, changed records will +be reverse-migrated from their internal version to that of the disk file. + +@node Other Changes, , Major Changes, Changes +@subsection Other Changes + +@subsubheading TeX Output + +By default, ec fonts are used for TeX output instead of cm fonts. With +the @code{ps-fonts} option set in @code{bbdb-print-alist}, TimesNewRoman +and Courier fonts are used. + +@itemize @bullet +@end itemize + +@node The Latest Version, The Future, Changes, Top +@section The Latest Version + +@noindent +Released versions of the @b{BBDB} can be found at the +following site: + +@itemize @bullet +@item +WWW: @code{http://bbdb.sourceforge.net} +@item +FTP: @code{ftp://ftp.sourceforge.net/pub/bbdb} +@end itemize + +@noindent +Development versions of the @b{BBDB} can be obtained in the +following ways: + +@itemize @bullet +@item +WWW: @code{http://bbdb.sourceforge.net} +@item +Anonymous CVS: See @code{http://bbdb.sourceforge.net} for instructions. +@end itemize + +Users of development versions of the @b{BBDB} should subscribe to the +@code{bbdb-info} mailing list. @xref{Mailing Lists}. + +@node The Future, , The Latest Version, Top +@section The Future + +The future consists of Bugs and Features. + +@menu +* Known Bugs:: Known Bugs, and how to submit new ones +* TODO List:: The TODO List +* EOL Statements:: EOL (End Of Life) Statements +@end menu + +@node Known Bugs, TODO List, The Future, The Future +@subsection Known Bugs + +@enumerate +@item +@b{@kbd{M-TAB} conflicts with ispell.} Workaround: The binding +installed by the @b{BBDB} for address completion/expansion conflicts with +that used by ispell. The suggested workarounds are to rebind the ispell +key (the @b{BBDB} binding is not configurable at this time), to manually +invoke ispell via @kbd{M-x}, or to not use ispell completion functionality +in @b{BBDB}-enabled message composition buffers. The following is an +example of such a rebinding, supplied by Kai Großjohan: + +@lisp +(defun my-message-mode-keys () + (define-key message-mode-map (kbd "M-TAB") 'bbdb-complete-name)) + (add-hook 'message-mode-hook 'my-message-mode-keys) +@end lisp + +@item +@b{@b{BBDB} and abbrev expansion is inconsistent.} Workaround: +Currently, @kbd{M-TAB} must be used to expand/complete against @b{BBDB} +names and net addresses, and @kbd{TAB} must be used to expand abbrevs (the +values in the @code{mail-alias} field). Unification is planned for a +future version. + +@item +@b{The @code{*BBDB*} buffer does not always come up when the first +article in a Gnus Summary Buffer is selected.} Workaround: Pressing +@kbd{g} to reload the article. This will cause the @code{*BBDB*} buffer +to be displayed. + +@item +@b{Expansion will fail when the name to be expanded is a subset of +the name for another record.} For example, if you have entries for +@samp{John} and @samp{Johnathan}, you will not be able to expand the +name for @samp{John}. Workaround: Use the net address for the subset +name (@samp{John} in this example). + +@end enumerate + +@cindex Bug Reports +It is commonly known that there are no bugs in the @b{BBDB}. Bugs +found in defiance of this rule should be submitted using @kbd{M-x +bbdb-submit-bug-report}. These bug reports will bbe sent to the +@code{bbdb-info} mailing list (@pxref{Mailing Lists}) and are +available from public archives. Other big brothers may be reading +your bug reports. + +@node TODO List, EOL Statements, Known Bugs, The Future +@subsection TODO List + +@subsubheading The Near Future + +@itemize @bullet +@item +Add bbdb/@i{MUA}-delete-sender-record + +@item +Configurable completion. Should allow user to specify "complete on +names first, then nets", etc. + +@item +More variables for upgrading. Specifically a variable that lets users +specify extra fields for upgrading (an alist @samp{(a . b)} that says +field @samp{a} should be upgraded the same way as field @samp{b}. + +@item +Change all functions that switch on MUAs to use compose-mail (ex: +@code{bbdb-send-mail-internal}). + +@item +Soren Dayton's method for generically extending the @b{BBDB} with +special-purpose fields + +@item +Sorting records on alternate keys. @code{bbdb-sort-by} from Boris +Goldowsky. +@c nnml:bbdb-maint + +@item +Sorting individual types of fields - Sam Steingold's method. + +@item +Button 3 menus (Mark Moll and Soren Dayton) + +@c @item +@c @b{BBDB}-controlled mail splitting in Gnus. Add hook for Soren to make +@c splitting better. Routine from Brian Edmonds. +@c Anyone have contact info for Soren Dayton? + +@item +Conditionalized erasure of properties when text is pasted into the @b{BBDB}. + +@item +Should notice when there are @samp{Reply-To:} addresses.@refill + +@item +Should have a command for merging together two divergent copies of +a @file{.bbdb} file (in case you read mail on one machine and news on +another, for instance.)@refill + +@item +The @samp{*BBDB*} buffer should be resized to exactly fit what it's +displaying, even when not in ``electric'' mode.@refill + +@item +It should be possible to do completion on last names as well as first +names.@refill + +@item +The BBDB buffer is left at the top of the stack when GNUS is exited +because GNUS runs its exit-hooks too early. This should be fixed.@refill + +@item +String area codes (German area codes can begin with zeroes) patch from +@code{Michael Sperber <sperber@@informatik.uni-tuebingen.de>} + +@c @item +@c Internationalization of addresses. Country code to control formats for +@c printing, etc. Country->Format mapping. + +@item +Default country variable, similar to @code{bbdb-default-area-code}. + +@item +Make format self-describing in comment + +@item +ISO-8859-x characters in records for printing. + +@item +Prefix for @kbd{W} (@code{bbdb-www}) command to allow selection of +different addresses. + +@item +Generalized buttons (via extents) for fields. Example: @samp{(a . b)} +means create button that calls @samp{b} for each entry in the @samp{a} +field. + +@item +Remove support for GNUS. Start with lisp Makefile (remove nntp and gnus +loads). + +@item +More flexible auto-addition. Conditionalizing of addition (conditions +or supplied function). Prompt if multiple records that meet criteria exist. + +@item +Different output formats. See Toby Speight's @code{<s8iurdodvm.fsf@@plato.ansa.co.uk>} +and Bin Mu's @code{<199801221605.KAA23663@@DerivaTech.Com>}. + +@item +Generalized area-code-split program that could split, for example, based +on input copied (or straight fetch of page) from the Bellcore NANP page. + +@item +Print multivalue (comma-separated) fields with one value per line + +@item +Easier BBDB extension. See @code{<xcdyb30f3hb.fsf@@ra.cs.uchicago.edu>} +from Soren Dayton. + +@item +Take birthdays from the @b{BBDB}, add them to calendar. From Boris +Goldowsky. +@c In nnml:bbdb-maint + +@item +Make mail aliases file for other mailers. From Boris Goldowsky. +@c In nnml:bbdb-maint + +@item +Various patches from Boris Goldowsky in @file{bbdb-ext}. + +@item +Various other patches: +@itemize @minus +@item +@code{bbdb-filters-0.2} +@item +@code{bbdb-frame.el} +@item +@code{bbdb-letter-1.0} +@item +@code{bbdb-plz} +@item +@code{bbdb-query} +@item +@code{country} +@item +@code{country-info} +@end itemize +@noindent +Note that these files have not been investigated. They may or +may not be incorporated. + +@item +Ability to remove all properties from copied strings. + +@end itemize + + +@subsubheading Not-So-Near Future + +@itemize @bullet +@item +Fix Gnus scoring so it rebuilds when gnus-score disappears + +@item +Multiline note fields + +@item +Change key to be some kind of unique number + +@item +There should be better support for non-American addresses and phone +numbers. This might be Near Future if somebody volunteers to send me patches. + +@item +Should reimplement ``electric'' mode to not be so broken.@refill + +@item +The @kbd{*C-o} keystroke should add a field to all displayed records. +Perhaps @kbd{*;} should append some text to an arbitrary field of all +displayed records. @refill + +@item +Multiple @file{.bbdb} files with precedence relationships. See Wes +Hardaker's @*@code{<sdu3awz75a.fsf@@oakdale.ucdavis.edu>} + +@item +Automatically grab information about a person from their sig. See +Graham Clark's @code{info-bbdb} post +@code{<6282.199706161624@@havra.dcs.ed.ac.uk>} and Adrian Aichner's +@code{info-bbdb} post +@code{<rxsiuzebpgp.fsf@@midnight.ecf.teradyne.com>}. Would like to have +@code{bbdb-snarf} attack the sig then compare the snarfed data with the +header data. + +@end itemize + +@subsubheading Thoughts + +@itemize @bullet +@item +Are there enough hooks? + +@item +The interfaces should share more code. @refill + +@item +The @code{bbdb-create-internal} function should be more forgiving.@refill + +@item +More @kbd{*} commands in general, including @kbd{*d}. +@end itemize + +@node EOL Statements, , TODO List, The Future +@subsection End of Life (EOL) Statements + +The items in the following list describe items for which support will be +removed in coming versions of the @b{BBDB}. The items listed are +guaranteed to be supported and present only until the EOL date. They +may be removed without warning at any time thereafter. + +@enumerate +@item +@code{advertized-bbdb-delete-current-field-or-record}@* +Support for this function will be removed for version 2.2. It is +recommended that all code depending on this variable be switched to use +@code{bbdb-delete-current-field-or-record}. The two functions have the +same calling conventions and effects. This EOL statement was added for +version 2.1. + +@item +Support for the GNUS (not Gnus) newsreader@* +The GNUS-specific parts of the @b{BBDB} will be actively removed for the +2.2 release. No further maintenance and/or bugfixes are planned for +GNUS code at this time. This EOL statement was added for version 2.1. +@end enumerate + +@node Thanks, , , Top +@section Thanks + +Thanks to everyone on the info-bbdb mailing list for many useful +suggestions. This hack would be far less insidious without their input! + +@subheading Thanks list for versions after 2.00.06. +@c I'm trying to include as many code contributors as possible here. It +@c doesn't happen without your help! + +Thanks to Alex Schroeder, Ronan Waide, Thomas DeWeese, Robert Fenk, +Didier Verna, Bill Carpenter. + +@subheading Thanks list for versions after 1.51 prior to and including 2.00.06. + +Thanks to Adrian Aichner, Kees de Bruin, David Carlton, Soren Dayton, +Brian Edmonds, Boris Goldowsky, Seth Golub, John Heidemann, Christopher +Kline, Carsten Leonhardt, Hrvoje Niksic, Jens-Ulrik Hoger Petersen, +Colin Rafferty, Matt Simmons, Sam Steingold, Marco Walther, Christoph +Wedler. + +@subheading Thanks list for versions prior to and including 1.51. + +And special thanks to Sebastian Kremer, Joe Wells, Todd Kaufmann, Andy +Norman, Ivan Vazquez, Stewart Clamen, Roland McGrath, Dave Brennan, +Kimball Collins, Dirk Grunwald, Philippe Queinnec, Boris Putanec, Dave +Disser, Francois Felix Ingrand, Sean Owens, Guido Bosch, Lance Brown, +Tom Emerson, George Hartzell, Luis Miguel Silveira, Kimmo Suominen, +Derek Upham, David Zuhn, Rod Whitby, Richard Mlynarik. + +Last, but not least, thanks to Jamie Zawinski for writing @b{BBDB} in the +first place. + +@node _,,,(dir) +@unnumbered _ +@example +in.sid.i.ous aj \in-'sid-e-*s\ + [L insidiosus, fr. insidiae ambush, fr. insidere to sit in, sit on, + fr. in- + sedere to sit -- more at SIT] + 1 a : awaiting a chance to entrap TREACHEROUS + b : harmful but enticing SEDUCTIVE + 2 a : having a gradual and cumulative effect SUBTLE + b of a disease + : developing so gradually as to be well established before + becoming apparent + in.sid.i.ous.ly av + in.sid.i.ous.ness n +@end example + + + +@menu +* Top:: +* _:: +@end menu + +@node Concept Index, Variable Index,, Top +@unnumbered Concept Index +@printindex cp + +@node Variable Index, , Concept Index, Top +@unnumbered Variable Index +@printindex vr + +@contents +@bye |