org-ai
在 Emacs Org-mode 中与 AI 对话,ChatGPT、DALL-E、语音交互无缝融入编
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
在 Emacs Org-mode 中与 AI 对话,ChatGPT、DALL-E、语音交互无缝融入编
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你正在用 Emacs 写一份复杂的技术文档,遇到一个不确定的概念——不必切换到浏览器搜索,不必复制粘贴到 ChatGPT 网页,只需在文档中插入一个 #+begin_ai 块,按下 C-c C-c,答案就直接写进你的文档;你还可以继续追问,就像在 ChatGPT 里聊天一样,所有对话历史都保留在你的 Org 文件里,可以随时回溯、导出、版本控制。
这就是 org-ai 做的事。它不是另一个 Electron 写的"AI 聊天应用",而是一个深度嵌入 Emacs 工作流的 AI 交互层——用 Org-mode 的块语法包裹 LLM 的能力,让 AI 成为你编辑环境的一部分,而非另一个需要切换过去的窗口。
Emacs 的可扩展性在软件史上几乎无出其右。Org-mode 更是其中的明珠——从简单的 TODO 列表工具演化成了事实上的 Markdown 替代品、知识管理平台、甚至轻量级数据库。但面对 2023 年爆发的大语言模型浪潮,大多数 Emacs 用户只能退而求其次:在浏览器里用 ChatGPT,在终端里跑 API,手动复制粘贴结果。
Robert Krahn(GitHub @rksm)从 2023 年开始开发 org-ai,将 OpenAI 的 ChatGPT、DALL-E、Stable Diffusion 等模型的能力,以 Emacs 原生插件的形式引入 Org-mode。目前在 GitHub 已有 818 颗星,收获 18 位贡献者的代码支持,并已被收录至 MELPA(Emacs 包生态的核心仓库)。
项目的核心设计哲学值得玩味:作者并非试图"重新发明 AI",而是做一个优雅的桥接层——让 Org-mode 的块语法(block syntax)直接成为 AI 交互的协议。这是一个天才的设计决策:用户不需要学习新的交互模型,只需要会用 Org-mode,就会用 AI。
最基础也最强大的功能。在 Org 文件中插入:
#+begin_ai
帮我解释一下什么是 Emacs Lisp 的 lexical binding
#+end_ai
按下 C-c C-c,ChatGPT 的回复会直接写入文档,同时保留对话历史,你可以继续追问。所有 Org-mode 的编辑能力(折叠、搜索、导出)都可以作用于 AI 对话内容。
更进一步,你可以通过块选项精细控制模型行为:
#+begin_ai :model gpt-4 :max-tokens 500 :temperature 0.7
[SYS]: 你是一个严格的代码审查员
[ME]: 请审查以下代码...
#+end_ai
通过 Org 标题属性(Property Drawer),可以为一整个子树的 #+begin_ai 块设置统一的系统提示和模型参数。这意味着你可以为不同的文档章节分配不同的 AI"角色",比如"Python 专家区"、"Emacs 配置区",各用各的模型设定,互不干扰。
#+begin_ai :image :size 1024x1024
Hyper realistic sci-fi rendering of a starship hangar
#+end_ai
支持 DALL-E 3(默认)和 Stable Diffusion 两种图像生成后端。生成的图片会自动保存到 ~/org/org-ai-images/ 目录,Org 文件中插入图片链接,方便导出为 HTML/PDF。Stable Diffusion 部分通过 org-ai-sd.el 模块支持 img2img(图生图)功能,可以用 CLIP interrogator 从已有图片反推 prompt。
这是 org-ai 最令人惊喜的差异化功能。启用后,你可以对着麦克风说话,Whisper 语音识别将内容转写为文本,发送给 AI;AI 的回复还可以通过 TTS(espeak 或 macOS Voice)朗读出来。整个过程不需要离开 Emacs,不需要切换窗口——真正实现了"和 AI 说话"的沉浸式体验。
配置稍显繁琐(需要安装 ffmpeg、Whisper、greader 等依赖),但一旦跑通,体验非常流畅。作者甚至提供了 macOS 上选择麦克风设备的交互式助手脚本。
即使不在 Org-mode 缓冲区,也可以使用 AI 能力。通过 C-c M-a 前缀触发:
| 命令 | 说明 |
|---|---|
C-c M-a r | 选区 AI:对选中文本提问/操作 |
C-c M-a s | 摘要:快速总结选中文本 |
C-c M-a c | 代码重构:生成 diff 并预览 |
C-c M-a p | 项目级 AI:跨文件操作,可修改代码 |
C-c M-a $ | 查看 OpenAI API 账户用量 |
其中 org-ai-on-project 尤其亮眼——它使用 Projectile(项目感知插件)识别当前项目,选中多个文件后,可以让 AI 分析整个代码库、重构跨文件逻辑,甚至直接生成 unified diff 可视化预览。
org-ai 支持 Noweb 语法,可以在 AI 提示中嵌入 Org-mode 源代码块的结果。这意味着你可以在发送请求给 AI 之前,先执行任意 Emacs Lisp 代码(读取文件内容、查询数据库、调用外部命令),将结果注入 prompt。这为动态构建复杂提示提供了无限可能——比如让 AI 在分析 Dockerfile 时,先通过 Lisp 代码读取文件的实际内容。
更令人惊叹的是,这个注入过程支持 Lisp 求值,可以调用外部脚本:
#+begin_ai :noweb yes
Tell me ways to improve this dockerfile
<<identity(x=(quelpa-slurp-file "~/code/myapp/Dockerfile"))>>
#+end_ai
从代码结构看,org-ai 是一个高度模块化的 Emacs Lisp 包:
依赖极简:只需要 Emacs 27.1 + websocket.el 两个依赖。API 通信基于 Emacs 内置的 url-retrieve + 外部 curl(用于图像上传),不引入重型依赖栈。
多后端支持:虽然默认对接 OpenAI API,但通过切换 org-ai-service 变量,可以无缝切换到 Anthropic(Claude)、Azure OpenAI、Perplexity.ai,甚至本地运行的 LLM(通过 oobabooga WebSocket API)。这种灵活性在 Emacs 插件中相当罕见。
对于已有 Emacs 使用经验的用户,org-ai 的上手成本几乎为零——从 MELPA 安装、use-package 配置、五行初始化代码,10 分钟内就能在 Org 文件里和 ChatGPT 对话。
但对于 AI 部分,有几个实际的门槛:
~/.authinfo.gpg(加密存储),安全但配置稍复杂。C-c M-a $)。org-ai 的定位注定了一些局限性:
org-ai 代表了一种正在兴起的工作流理念:AI 能力不应是一个独立的应用,而应是用户已有工具的自然延伸。随着 AI 模型 API 化程度加深,这种"AI as a layer"的思路会越来越普遍——不仅是 Emacs,VS Code(Copilot)、Neovim(Copilot.lua)、Obsidian(Local REST API 插件)都在走类似的路。
Emacs 的优势在于其极致可扩展性,使得 org-ai 能够做到其他平台难以实现的事情:把 AI 对话变成 Org 文件的一部分,实现文档、知识库和 AI 对话的真正融合。对于已经深度使用 Org-mode 进行知识管理的用户来说,org-ai 是目前最优雅的 AI 集成方案之一。
总结:org-ai 不是一个"更漂亮的 ChatGPT 界面",而是一个把 AI 能力融入 Emacs 工作流的深度插件。它精准地服务了一个特定用户群:Emacs 深度用户 + AI 爱好者 / 开发者。对这个群体来说,它几乎是目前最好的 Org-mode AI 集成方案。