[Emacs] EBDB: 联系人数据库

简介

EBDB 是一个联系人数据库,用于存储联系人的信息,如姓名、邮箱、电话、地址等,可单独作为通讯录使用,也可与 MUA(Mail User Agent) 、 Org Mode 等集成使用。 EBDB 是 BBDB (Big Brother DataBase) 的重写,对中文支持更好。

仓库地址:https://github.com/girzel/ebdb

用户手册:https://github.com/girzel/ebdb/blob/master/ebdb.org

安装

可以通过 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 等补全工具。

Powered by Org Mode.