[Emacs] EBDB: 联系人数据库
Table of Contents
简介
EBDB 是一个联系人数据库,用于存储联系人的信息,如姓名、邮箱、电话、地址等,可单独作为通讯录使用,也可与 MUA(Mail User Agent) 、 Org Mode 等集成使用。 EBDB 是 BBDB (Big Brother DataBase) 的重写,对中文支持更好。
安装
可以通过 ELPA 直接安装,也可以 clone 到本地然后把路径添加到 load-path
。
测试
一般而言, EBDB 不单独使用,但是我一开始就是想试一下功能,于是摸索了一番,去 GitHub 上问了一下人家。
ebdb
是一个基础或者入口库,但是它本身不包含 core 的函数,主要的功能函数是在 ebdb-com
里,所以需要 (require 'ebdb-com)
来测试功能,它里面调用了 ebdb
。
如果也其它模块如 GNUS 集成使用,需要导入的是对应的库(见下文)。
数据库
首先需要配置的一个自定义变量是 ebdb-sources
,它是数据库文件,你可以把它指定到想要的位置,默认是 ~/.emacs.d/ebdb
(它是一个文件,不是目录)。
新建数据库
在导入了 ebdb-com
或其它集成库之后,通过 M-x ebdb-open
便创建了一个数据库,同时进入 ebdb-mode
。如果数据库已经存在,它会打开 EBDB
buffer 但是不显示任何数据。需要通过查询来显示。
从 BBDB 迁移
- 确保
bbdb-file
指向的是 BBDB 数据库的位置 - 执行 Elisp 或者写到配置里边(迁移一次就行没必要写配置):
(locate-user-emacs-file "bbdb" ".bbdb")
M-x ebdb-migrate-from-bbdb
即可
从 Org Contacts 迁移
我没听过这个库,需要的去看手册。
EBEB Buffer
EBDB buffer 是一个接口界面,用于快速而方便查询和编辑通讯录数据。
M-x ebdb
会要求输入一个正则,之后进入 EBEB buffer 并展示匹配的数据。如果直接回车不输入,那么就展示全部数据。
数据库级操作
- d e 选择数据库并自定义数据库信息
- d m 移动数据到其他数据库
- d c 复制数据到其他数据库
- d r 数据
- d d 禁闭数据库
- s 保存所有数据
- f 导入当前数据项到一个临时 buffer
- F 导入当前 buffer 所有数据项到一个临时 buffer
光标移动
- n 移动到下一条数据
- p 移动到上一条数据
- N 移到到下一个域
- P 移到到上一个域
- tab 在各个域的值之间移动,向前
- S-tab 在各个域的值之间移动,向后
展示
- t 切换当前数据的展示模式:多行显示、单行显示、全信息显示
- T 且或所有数据的展示模式
- r 刷新当前数据
- g 刷新所有数据
复制
- w f 复制域对应的值,如果是名字复制名字
- w r 复制整个数据项
- w m 复制名字 + 邮箱
数据项操作
增
c
(ebdb-create-record) 添加一条新条目,在 minibuffer 录入基本信息C
(ebdb-create-record-extended) 添加一条新条目,在 minibuffer 录入扩展信息
删
C-k
(ebdb-delete-records/ebdb-delete-field-or-record) 删除一条记录,会先询问。如果光标落在数据名上,询问删除整条数据;如果光标落在某个域上,询问删除域
改
i
(ebdb-insert-field) 向条目中添加新的键e
(ebdb-edit-field) 编辑域E
(ebdb-edit-field-customize) 通过 customize 接口编辑域
查
最基本的查询 / /
按正则查询各个域,结果覆盖到 buffer 上
细化查询有三种模式,对应三个按键前缀键
/
查询整个数据库,并将结果刷新到 buffer+
查询整个数据库,并将结果添加到 buffer|
只查询当前 buffer 的数据
每个前缀后面都可以跟下面的按键选择不同的查询方式:
- n 查找名字
- o 查找组织 organization
- p 查找电话
- a 查找住址
- m 查找邮件
- t 查找标签
- x 查找一个指定的域
- c 查找自上次保存以来被修改过的数据
- C 按等级(类?) record class
全局查找:
/ D
展示数据库的所有数据(注意数据量)/ 1
查询单个记录并展示,会在 minibuffer 选择名字/ d
查询重复的记录
反向前缀 !
. 想比查询“xx 不是 yy 的记录”,那么只要先按 !
再正常按其他查询按键。
例子:
- 查询包含“Alice”的所有数据,出现在名字、邮箱或是其他都行:
/ / Alice
- 查询数据库“名为 Bob”的所有数据,并覆盖当前 buffer:
/ n Bob
- 查询数据库“组织为 Center”的所有数据,并添加到当前 buffer:
+ o Center
- 在当前 buffer 中查询“邮箱包含 gmail”的数据:
| m gmail
- 查询数据库“不住在火星的人”,并覆盖当前 buffer:
! / a Mars
集成 GNUS
首先需要明确的一点,收信和发信的机制是不一样的,需要自己小心。如果用的 GNUS, 默认收信是 gnus, 发信是 message. 因此配置:
(require 'ebdb-gnus)
(require 'ebdb-message)
然后只需要几个配置项就能用了:
;; EBDB 数据库位置,前面讲过
(setq ebdb-sources (no-littering-expand-var-file-name "ebdb"))
;; 手机标签的位置,我自己加了一个 mobile
(setq ebdb-phone-label-list '("home" "work" "cell" "fax" "mobile" "other"))
;; Emacs 退出时自动保存
(setq ebdb-save-on-exit t)
;; 在 GNUS 时不弹出 EBEB Buffer
(setq ebdb-mua-pop-up nil))
保存收件人
在对应的 Article 里, ;
(分号) 作为前缀定义了 EBDB 更新相关的函数。
; :
(分号 + 冒号) 保存当前发件人到 EBDB; ;
(分号 + 分号) 如果ebdb-mua-pop-up
设为了 nil, 那么展示所有数据
补全发件人
在编写邮件的时候,在 To
那一栏开启补全即可 –— 按 TAB, 或者使用 company/corfu 等补全工具。