Skip to content

Latest commit

 

History

History
618 lines (359 loc) · 24.8 KB

bbdb简单使用教程.org

File metadata and controls

618 lines (359 loc) · 24.8 KB

bbdb简单使用教程

配置

最简单的配置方法就是将下面的语句放入Emacs初始化文件中

(require 'bbdb)
(bbdb-initialize)

这里的`bbdb-initialize’会初始化bbdb,并开启最基本的查询/维护记录功能.

除了最基本的查询/维护记录功能外,bbdb还有一些与其他package联合使用的特性,要开启这些特性,则需要在调用`bbdb-initialize’时传入其他的参数.

`bbdb-initialize’可以接收一系列的symbol作为参数,这些symbol决定了bbdb初始化时会开启与哪些package交互的特性. 这些symbol的说明如下表所示:

symbolmeaning
gnusGnus mail/news reader. should probably also pass the message symbol
mh-eMH-E mail reader.
rmailRmail mail reader.
vmVM mail reader.
mailMail (M-x mail).
messageMessage mode.
annivAnniversaries in Emacs diary.
scSupercite.
pgpPGP support:

为其他package增加BBDB支持

bbdb提供了一系列的`bbdb-insinuate-xxxx’函数来为xxxx package提供BBDB的支持. 这些函数为package增加了默认的快捷键,并且配置这些package当收到新message时,通知bbdb.

例如:为了給gnus增加bbdb的支持,我们可以添加下面的语句到Emacs初始化文件中

(add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus)

BBDB基础

BBDB数据库结构

BBDB数据库由一系列的记录组成,每条记录对应一个联系人或组织. 每条记录由多种域组成,每种域对应联系人/组织的一个属性.

BBDB内置支持一些类型的域:

typeDescriptionNotes
NAME联系人的名称,若该记录表示一个组织,则为空一条记录只能有一个该类型的域,一个域只能有一个值
orgnization联系人所在的组织,可以为空一条记录只能有一个该类型的域,一个域只能有一个值
AKA联系人的别名一个域可以有多个值,以逗号分隔
mail联系人的email地址一个域可以有多个值,以逗号分隔
Phone联系人的电话一条记录可以有多个该类型的域,一个域只能有一个值
address联系人的地址一条记录可以有多个该类型的域,一个域只能有一个值
Notes其他说明一条记录可以有多个该类型的域,一个域只能有一个值

自定义类型

除了上面BBDB内置的域类型,我们还可以自定一些域类型. BBDB处理大多数自定义类型的域时,与Notes类型域一样,但是对有一些特殊名称的域类型,BBDB会进行特殊处理:

aka
用于存储指定记录的non-primary names
finger-host
Address used in place of the listed net address for fingering the entity indicated by the record
gnus-score
Gnus scoring adjustment for this person.
mail-alias
Value used instead of name for completion
mail-name
Used for the storage of non-default names to be used in the reporting of new mail by Reportmail.
mark-char
The field containing the character to be used for marking a given poster in the Gnus Summary Buffer
tex-name
The value of this field is used in place of the name field when printing the database using bbdb-print
www
This field contains the URL associated with the BBDB record.

BBDB相关命令

搜索记录

bbdb

执行该命令后,输入一个正则表达式,则bbdb会列出任何域中的值符合该正则表达式的记录

bbdb-search-name/bbdb-search-organization/bbdb-search-address/bbdb-search-mail/bbdb-search-notes/bbdb-search-phone

执行该命令后,输入一个正则表达式,则bbdb会列出指定域中的值符合该正则表达式的记录

bbdb-timestamp-older

执行该命令后,输入一个`yyyy-mm-dd’格式的日期,则bbdb会列出在指定日期之前修改过的记录

bbdb-timestamp-newer

执行该命令后,输入一个`yyyy-mm-dd’格式的日期,则bbdb会列出在指定日期之后修改过的记录

bbdb-creation-older

执行该命令后,输入一个`yyyy-mm-dd’格式的日期,则bbdb会列出在指定日期之前创建的记录

bbdb-creation-newer

执行该命令后,输入一个`yyyy-mm-dd’格式的日期,则bbdb会列出在指定日期之后创建的记录

bbdb-creation-no-change

执行该命令后,bbdb会列出自创建以来,从未修改过的记录

增加记录

bbdb-create

执行该命令后,bbdb会以此提示输入各个内置域的相关信息,然后根据这些相关信息新建一条记录

bbdb-snarf

该命令可以根据一定规则将选中的字符串转换成bbdb格式的记录. 默认的转换规则由变量`bbdb-snarf-rule-default’决定. 详细参见`bbdb-snarf-rule-alist’

BBDB Mode使用说明

使用BBDB的查询命令后,会弹出一个名为`*BBDB*’的buffer,该buffer处于bbdb mode下.

bbdb mode下拥有许多维护BBDB记录的各种命令,常用的命令有:

e (bbdb-edit-field)

修改记录中当前域的值

; (bbdb-edit-foo)

若不带前置参数执行该命令,则修改`(car bbdb-edit-foo)’所表示的域(默认为notes)

若代前置参数执行该命令,则修改`(cdr bbdb-edit-foo)’所表示的域(默认为current-fields)

d / C-k (bbdb-delete-field-or-record)

删除光标所在的域,若光标所处的域为bbdb记录的第一个行,则会提示删除整个记录.

This may also be applied to multiple records at once by *.

i (bbdb-insert-field)

为当前记录添加新域,该新域的类型可以是BBDB的内置类型,也可以是新的用户自定义类型.

C-x C-t (bbdb-transpose-fields)

交换光标所在的field与上一行field的位置

若带参数0执行该命令,则光标所在的域与mark标记的域进行交换

With non-zero numeric argument ARG, the previous field is moved past ARG fields.

交换的field必须在同一条记录中,且具有相同的类型

n (bbdb-next-record)/ p (bbdb-prev-record)

移动到下一个/上一个记录,若带前缀参数N,则下移/上移N条记录

t (bbdb-toggle-records-layout)

切换是否显示记录中具体域的说明.

若带参数0调用该函数,则强制光标所在记录不显示记录域说明,此时,所有的域信息都压缩到一行内显示.

当待其他参数调用该函数时,则强制光标所在记录显示记录中的域说明时,此时,当前记录使用多行样式显示.

若使用`*t’而不是`t’,则buffer内所有的记录都同时切换显示样式

T (bbdb-display-record-completely)

谢换是否展示当前记录的所有域,这时平时隐藏不显示的`creation-date’和`timestamp’都会显示出来.

o (bbdb-omit-record)

隐藏当前记录,但并不会将当前记录从BBDB数据库中删除掉.

若带参数N执行该命令,则会隐藏下面N条记录,N可以为负数

m (bbdb-mail)

发送电子邮件給当前的联系人. 默认邮件地址为记录中的第一个email地址.

若带参数N调用该函数,则表示邮件地址使用记录周公的第N个email地址

若使用`*m’而不是`m’,则表示給该buffer中的所有联系人发送电子邮件

s /C-x C-s (bbdb-save)

保存BBDB数据库到文件中

M-d (bbdb-dial)

该命令会尝试着去拨打光标所在的数字. 若光标处于一条记录的开头,则会拨打第一个phone域.

具体原理不明…

q (quit-window)

退出bbdb窗口,但不会kill bbdb buffer

? (bbdb-help)

在minibuffer中显示简易帮助信息

h (bbdb-info)

显示bbdb的info文档

若bbdb的info文档没有安装在标准的info目录下,可以通过设置`bbdb-info-file’变量来明确指明bbdb info文件的路径

(bbdb-print)

将BBDB记录导出到Tex文件中.

c (bbdb-create)

创建新记录保存新的联系人信息

C (bbdb-copy-records-as-kill)

将当前记录拷贝到kill ring中

若使用`* C’则拷贝buffer中的所有记录到kill ring中

b (bbdb)

重新查询bbdb数据库

/ m (bbdb-search-mail)

搜索mail域

/ a (bbdb-search-address)

搜索address域

/ c (bbdb-search-changed)

搜索至上次保存后,改变过的bbdb记录

/ d (bbdb-search-duplicates)

搜索具有相同域的记录

/ n (bbdb-search-name)

搜索name域

/ o (bbdb-search-organization)

搜索organization域

/ p (bbdb-search-phone)

搜索phone域

/ x (bbdb-search-xfields)

搜索xfield域(该域存什么?我也不知道…)

* (bbdb-do-all-records)

该命令用于修改紧接之后的命令的作用域,让其作用于buffer中的所有记录.(Command prefix for operating on all records currently displayed.)

但只对某些特定的命令有效

配置

配置项

  • bbdb-file

    bbdb数据库的存储路径,默认为`~/.bbdb’

  • bbdb-default-area-code

    当输入新电话好吗时,使用的默认区号.

    该变量的值也会影响到拨打电话时的行为

  • bbdb-address-format-list

    用于编辑/显示BBDB地址信息时的规则列表.

  • bbdb-continental-postcode-regexp

    该正则表达式决定了BBDB的address是否为欧洲格式的地址.

    若address域的值匹配该正则表达式,则表示该address为欧洲格式的地址,否则认为是美国格式的地址

  • bbdb-case-fold-search

    当使用bbdb系列的搜索命令进行搜索时,是否大小写敏感

  • bbdb-auto-revert

    若在Emacs中没有修改bbdb buffer中的信息,而此时,bbdb-file发生了改变,则自动重新加载bbdb-file的新内容

  • bbdb-pop-up-layout

    pop-up BBDB buffer时使用的默认布局(mail,news…). 默认为’pop-up-multi-line

  • bbdb-pop-up-window-size

    pop-up BBDB buffer时的高度.

    若为整数N,则表示高度为N行

    若为一个介于0到1之间的小数N,则拆分拥有最高高度的window,并且BBDB buffer占据N倍的高度

    若为t,则表示使用 `display-buffer’/`pop-to-buffer’ 创建BBDB window??(貌似会占据next-window来显示BBDB buffer)

  • bbdb-completion-list

    控制`bbdb-complete-mail’的补全方式. 该函数用于在mail buffer中补全联系人信息

    该值可以为一个symbol list,用来指明补全哪些域的值. 这些symbol可以是:

    fl-name
    first and last name
    lf-name
    last and first name
    organization
    aka
    mail
    all email address of each record
    primary
    first email address of each record

    该值也可以为t,表示所有上面symbol的集合

    若该值为nil,则表示不提供补全

  • bbdb-complete-mail-allow-cycling

    当调用`bbdb-complete-mail’补全email地址时,是否允许循环展示补全项

  • bbdb-user-mail-address

    该变量的值为一个正则表达式,该正则表达式用于标识某email地址是否是用户自己的email地址.

    多数BBDB的命令根据变量`bbdb-message-headers’从消息中抽取出发送方和接收方的email地址. 但若发送方的email地址匹配上了`bbdb-user-mail-address-re’,则该email地址依然被认为是接收方的email地址.

    改变量的默认值为`(user-login-name)’

  • bbdb-add-mails

    该变量指明了当收到某个联系人从新的email地址发来的消息后,是否增加该新email到联系人信息中.

    可选值有:

    t
    自动添加该新的email地址
    query
    询问用户是否添加该新的email地址
    nil
    忽略新的email地址
    数字N
    在N秒内,BBDB显示该新的email地址,但只在当前session有效
    函数fn
    使用record和新email地址作为参数来调用fn,fn需要返回t,’query,nil或一个数字
    正则表达式re
    若新的email地址符合该正则,则忽略该新的email地址,否则询问用户是否添加该email地址
  • bbdb-new-mails-primary

    为联系人新增email地址时,该新email地址是否作为primary mail address(即该新email地址排在其他email地址的前面).

    可选值为:

    t
    让该新增的email地址自动称为primary mail address
    query
    询问用户是否作为primary mail address
    nil
    不作为primary mail address,会将新email地址放到列表最后面.
    函数fn
    该函数接收两个参数:record和新email地址. 该函数需要返回t,’query或nil
    正则表达式re
    若新email地址匹配该re,则不作为primary mail address,否则询问用户是否作为primary mail address
  • bbdb-ignore-redundant-mails

    当增加新mail地址时,若联系人中的旧mail地址是新mail地址的更一般形式(例如,已有的mail地址为[email protected],而新mail地址为[email protected])时,是否覆盖原mail地址.

    可选的值为为:

    t
    自动忽略新email地址
    query
    询问用户是否忽略新email地址
    nil
    使用新email地址,覆盖原email地址
    数字N
    在接下来的N秒内,保留新email地址
    函数fn
    fn接收两个参数:record及新email地址,fn需要返回t,’query,nil或数字
    正则表达式re
    符合该正则表达式的email地址会替代原email地址,否则询问用户是否忽略新email地址
  • bbdb-check-auto-save-file

    若值为t,则BBDB会检查它的auto-save file,若auto-save file比`bbdb-file’要新,则BBDB会恢复auto-save file

  • bbdb-ignore-message-alist

    描述哪些message不允许触发自动新建BBDB联系人记录.

  • bbdb-accept-message-alist

    描述哪些message允许触发自动新建BBDB联系人记录.

  • bbdb-mua-auto-update-p

    决定了`bbdb-mua-auto-update’如何自动更新BBDB记录. 可选值:

    nil
    什么也不做
    search
    搜索匹配ADDRESS的记录
    update
    搜索匹配ADDRESS的记录,如有必要,会更新name和mail域
    query
    搜索匹配ADDRESS的记录,若记录不存在,提示用户是否创建新记录
    create
    搜索匹配ADDRESS的记录,若记录不存在,则创建新记录
    t
    搜索匹配ADDRESS的记录,若记录不存在,则创建新记录
    函数fn
    bbdb调用该函数,该函数需要返回nil,search,update,query,create或t

hooks

hook调用hook的时机调用hook时的参数其他说明
bbdb-display-hook展示*BBDB* buffer后
bbdb-create-hook在BBDB创建新联系人记录前新增的recordbbdb-change-hook也会被触发
bbdb-change-hookBBDB buffer发生改变前修改的record
bbdb-mode-hook进入bbdb mode后
bbdb-notice-record-hook当发现message中的email地址包含在某个联系人记录中后包含message中email的联系人记录若某message中包含同一联系人的多个email地址,该hook也只会被触发一次
bbdb-notice-mail-hook当发现message中的email地址包含在某个联系人记录中后包含message中email的联系人记录若某message中包含同一联系人的多个email地址,该hook也会被触发多次
bbdb-after-read-db-hook当`bbdb-file’被读取之后当BBDB buffer revert之后还会再次触发该hook
bbdb-initialize-hookBBDB的初始化函数`bbdb-initialize’被调用之后
bbdb-canonicalize-mail-functioin当BBDB notice a message后message中的corresponding email address该函数用于对message中的对应email地址作一次转换,转换后的结果才拿来与BBDB中的记录进行对比,或添加入BBDB. 若该函数返回nil,则BBDB认为该message中无email address

其他

函数

(bbdb-display-records records )

在bbdb buffer中显示records中的记录

(bbdb-record-field RECORD FIELD)

返回记录中的指定域的值. 域的说明为:

firstnameReturn the first name of RECORD
lastnameReturn the last name of RECORD
nameReturn the full name of RECORD (first name first)
name-lfReturn the full name of RECORD (last name first)
affixReturn the list of affixes
organizationReturn the list of organizations
akaReturn the list of AKAs
aka-allReturn the list of AKAs plus mail-akas.
mailReturn the list of email addresses
mail-akaReturn the list of name parts in mail addresses
mail-canonReturn the list of canonical mail addresses.
phoneReturn the list of phone numbers
addressReturn the list of addresses
xfieldsReturn the list of all xfields
其他指定label的xfields

(bbdb-get-records PROMPT)

若在*BBDB* buffer中,则返回光标所在的记录,若在其他buffer中,则询问用户想要返回哪个记录

(bbdb-update-records ADDRESS-LIST &optional UPDATE-P SORT)

返回匹配ADDRESS-LIST的BBDB记录列表

其中ADDRESS-LIST是一个由email地址组成的列表

参数UPDATE-P的可选值为:

nil
使用变量`bbdb/MUA-update-records-p’中的值, 若该值依然为nil,则`bbdb-update-records’返回nil
search
搜索匹配ADDRESS的记录
update
搜索匹配ADDRESS的记录,如有必要,会更新name和mail域
query
搜索匹配ADDRESS的记录,若记录不存在,提示用户是否创建新记录
create
搜索匹配ADDRESS的记录,若记录不存在,则创建新记录
t
搜索匹配ADDRESS的记录,若记录不存在,则创建新记录
函数fn
bbdb调用该函数,该函数需要返回search,update,query,create或t

若参数SORT为非nil,则返回的记录列表中的记录会经过`bbdb-record-lessp’排序;若SORT为nil,则记录的顺序与参数ADDRESS-LIST中的邮件地址的顺序对应.

(bbdb-get-mail-aliases)

返回BBDB中使用的mail aliases列表

(bbdb-search-read &optional FIELD)

提示用户输入一个正则表达式re,并从BBDB数据库中搜索出指定的FIELD符合该re的记录

(bbdb-search RECORDS &optional NAME-RE ORG-RE MAIL-RE XFIELD-RE PHONE-RE ADDRESS-RE)

从RECORDS中搜索出符合指定域的指定正则表达式的记录. 其中

  • NAME-RE匹配FIRST_LAST,LAST_FIRST和AKA域
  • XFIELD-RE匹配xfiled notes域
  • XFIELD-RE也以格式为(LABEL . RE)表示label为xfield的正则表达式,其中若LABEL为`*’则表示任一个xfield

(bbdb-display-records-with-layout RECORDS LAYOUT)

使用LAYOUT形式来展示RECORDS,其中LAYOUT参见`bbdb-layout-alist’中的值

(bbdb-pop-up-window &optional SELECT HORIZ-P)

(bbdb-display-records RECORDS &optional LAYOUT APPEND SELECT HORIZ-P)

使用LAYOUT形式来显示RECORDS

若参数APPEND为非nil,则会在当前已经显示的记录后,再多显示这些RECORDS;若APPEND为nil,则会用RECORDS的显示结果代替已有的显示结果

参数SELECT与参数HORIZ-P的意义参见`bbdb-pop-up-window’

(bbdb-display-record RECORD LAYOUT NUMBER)

在当前buffer的光标所在处,插入格式化好的RECORD表示文本.

LAYOUT是`bbdb-layout-alist’中描述的layout符号,若为nil则表示`bbdb-layout’

NUMBER is the number of RECORD among the displayed records.

(bbdb-read-record &optional FIRST-AND-LAST)

提示用户输入联系人信息,并创建一个新的BBDB联系人记录.

但该函数不会将新产生的BBDB记录存入数据库,也不会更新BBDB hashtable

该函数会检查新输入的联系人是否和已存在的联系人记录相冲突

(bbdb-read-string PROMPT &optional INIT COLLECTION REQUIRE-MATCH)

读取用户输入的字符串,会取出字符串中的空格和text properties

参数PROMPT为提示说明

参数INIT为预设值,当编辑已存在记录时常用到

参数COLLECTION与REQUIRE-MATCH的意义与`completing-read’中的意义一致

(bbdb-record-set-field RECORD FIELD VALUE &optional MERGE CHECK)

设置RECORD中的FIELD域的值为VALUE.

该函数的返回值为VALUE

若参数MERGE为非nil,则将参数VALUE合并到FIELD的当前值中

若参数CHECK为非nil,则会检查FIELD是否能够存储VALUE

该函数会更新bbdb hashtable,但不会保存RECORD到bbdb数据库中. 一般使用函数`bbdb-change-record’来保存RECORD到bbdb数据库中.

其中参数FIELD的说明,参见`bbdb-record-field’中的FIELD说明

(bbdb-change-record RECORD &optional NEED-TO-SORT NEW)

该函数保存RECORD到BBDB数据库中,若参数RECORD中的值与BBDB数据库中的值相比发生了变化,则该函数返回RECORD,否则该函数返回nil

当RECORD中的联系人名称发生改变,或RECORD为新建的联系人记录时,NEED-TO-SORT参数需要为t

当RECORD为新建的联系人记录时,参数NEW需要为t. 若RECORD为新建联系人记录则该RECORD会自动更新入BBDB hashtable,否则需要手工更新BBDB hashtable

(bbdb-current-record &optional FULL)

返回光标所处的RECORD

若参数FULL为非nil,则返回包含RECORD和显示格式(layout)的一个list

(bbdb-current-record t)
;; ([nil "darksun" nil nil nil (["home" "(+86)15820984397"] ["work" "(0794)6593346"]) nil nil ((creation-date . "2015-03-30 09:46:57 +0000") (timestamp . "2015-03-30 13:17:00 +0000")) ["darksun" "darksun" nil nil "darksun" #<marker at 64 in bbdb>]] multi-line #<marker at 1 in *BBDB*>)
(bbdb-current-record)
;; [nil "darksun" nil nil nil (["home" "(+86)15820984397"] ["work" "(0794)6593346"]) nil nil ((creation-date . "2015-03-30 09:46:57 +0000") (timestamp . "2015-03-30 13:17:00 +0000")) ["darksun" "darksun" nil nil "darksun" #<marker at 64 in bbdb>]]

(bbdb-current-field)

返回光标所处的当前域

(bbdb-current-field)
;; (name "darksun")

bbdb-record-set-xxx系列函数

置record中指定field的值

变量

bbdb-records

该变量的值为当前bbdb buffer中的record列表

bbdb-search-invert

若值为t,则会反转`bbdb-search’的搜索结果

FAQ

如何修改BBDB创建联系人的流程

使用`bbdb-create’新建联系人时,会以此提示你输入一系列的联系人的信息,包括姓名,所属机构,电子邮件,地址,电话,备注. 但若想让BBDB在创建联系人时也提示你输入其他额外的信息该如何作呢?

下面是一个例子,它让`bbdb-create’新建联系人时,还会提示你输入生日信息:

(defun bbdb-read-record-advise-function(record)
  "提示存储生日,QQ,微信号"
  (bbdb-record-set-field record 'birthdate
                         (bbdb-read-string "Birthdate (YYYY.MM.DD): "))
  (bbdb-record-set-field record 'QQ
                         (bbdb-read-string "QQ:"))
  (bbdb-record-set-field record 'WeChat
                         (bbdb-read-string "WeChat:"))
  record)

(advice-add 'bbdb-read-record :filter-return #'bbdb-read-record-advise-function)

如何将bbdb中保存的联系人信息导入到手机中

最简单的方法,就是使用”bbdb-to-outlook.el”将bbdb导出为.csv文件. 然后在手机上导入该.csv文件

  1. 加载”bbdb-to-outlook.el”
  2. 使用`bbdb’显示bbdb联系人信息
  3. 键入`O’会运行`bbdb-to-outlook’命令,输入保存的csv文件路径即可.