用途
d2 是一个 Emacs 技能,用于在用户调用 "/d2" 时,根据当前上下文创建图表。它使用 D2 从最近的交互上下文中提取或推导可图表化的数据,生成 PNG 图片,并以 Markdown 图片形式输出,使其能够内联渲染。
主要能力
- 从当前上下文提取或推导可图表化的数据。
- 生成 PNG 格式的图表图片。
- 将结果以 Markdown 图片形式输出在单独一行,例如:
。 - 根据 Emacs 的前景色和背景模式调整图表样式,保证在用户 Emacs 背景上的可读性。
使用方式
- 用户调用 "/d2"。
- 从当前上下文提取或推导可图表化的数据。
- 如果本次会话中尚未从之前的图表得知 Emacs 前景色和背景模式,则进行查询:
emacsclient --eval '(face-foreground (quote default))'返回十六进制颜色,如 "#eeffff"。emacsclient --eval '(frame-parameter nil (quote background-mode))'返回 dark 或 light。- 两者在本次会话的后续图表中复用。
- 使用前景色将 D2 文件写入临时文件。
- 运行 D2:如果背景模式为 dark,使用
--theme 200;如果为 light,使用--theme 0。命令示例:d2 --theme 200 --pad 40 /tmp/agent-diagram-XXXX.d2 /tmp/agent-diagram-XXXX.png - 成功运行后,在单独一行输出 Markdown 图片。
D2 模板
根据 Emacs 背景模式选择 --theme 200(dark)或 --theme 0(light)。将查询到的前景色应用到节点和边的 style.font-color 和 style.stroke。模板示例:
direction: right
node1: Label {
style.font-color: "#eeffff"
style.fill: "#2d3748"
style.stroke: "#eeffff"
}
node2: Label {
style.font-color: "#eeffff"
style.fill: "#2d3748"
style.stroke: "#eeffff"
}
node1 -> node2: label {style.stroke: "#eeffff"; style.font-color: "#eeffff"}
规则
- 每个会话只查询一次 Emacs 前景色,并在后续所有图表中复用;仅在颜色未知时再次查询。
- 每个会话通过
(frame-parameter nil 'background-mode)查询一次背景模式。dark 使用--theme 200,light 使用--theme 0。始终使用--pad 40。 - 文件名始终使用时间戳(例如
/tmp/agent-diagram-$(date +%s).png),不要使用描述性名称。 - 将所有节点和边的
style.font-color和style.stroke设置为查询到的前景色,使图表在用户 Emacs 背景上可读。 - 使用有意义的填充颜色区分不同类型的元素。
- D2 成功运行后,在单独一行输出 Markdown 图片
。 - 为数据选择合适的布局方向和结构。
- 当边标签能增加清晰度时,为其添加标签。
- 如果最近上下文中没有可图表化的数据,告知用户。
适用场景
适用于在 Emacs 中需要根据当前对话或交互上下文快速生成图表的场景,尤其是希望图表样式与 Emacs 主题(深色/浅色)匹配、并直接以 Markdown 图片内联展示的情况。
限制
- 依赖 D2 工具和 emacsclient 可用。
- 需要从上下文中存在可图表化的数据,否则会告知用户无法生成。
- 关于收费、价格、平台支持范围等信息,资料中暂未提供。