chatgpt-shell
chatgpt-shell 是一款专为 Emacs 用户打造的多模型 AI 交互终端。它打破了单一模型的局限,让用户能在熟悉的 Emacs 命令行环境中,无缝切换并调用 ChatGPT、Claude、DeepSeek、Gemini、Ollama 等主流大语言模型服务。
对于习惯在 Emacs 中进行开发或写作的用户而言,频繁切换浏览器或独立客户端会打断心流。chatgpt-shell 通过将 AI 对话深度集成到 Emacs 的 comint shell 机制中,解决了这一痛点。用户无需离开编辑器即可直接获取代码建议、文本润色或逻辑分析结果,极大地提升了人机协作的流畅度。
这款工具特别适合重度 Emacs 用户、软件开发者及技术研究人员。其核心亮点在于“混合式”交互体验:不仅支持标准的命令行问答,还独创了“组合缓冲区(compose buffer)”模式。用户可以选中代码或文本区域,一键生成可编辑的草稿区来精心构建提示词,提交后又能通过简洁的单键指令(如'n'切换历史、'r'追问、'm'获取更多结果)高效管理对话上下文。这种设计既保留了极客的键盘操作效率,又兼顾了复杂任务所需的编辑灵活性,是让 AI 真正融入本地工作流的得力助手。
使用场景
一位资深 Emacs 用户正在重构遗留的 Python 代码库,需要频繁调用不同大模型进行代码解释、优化建议及生成单元测试。
没有 chatgpt-shell 时
- 切换模型繁琐:想对比 Claude 的逻辑推理与 DeepSeek 的代码能力时,必须离开编辑器,在浏览器中打开多个标签页并重复粘贴上下文,打断心流。
- 上下文割裂:在网页对话框中修改长段代码提示词极其不便,无法利用 Emacs 强大的编辑功能(如宏、正则替换)来精细化调整提问内容。
- 交互效率低下:想要基于上一轮回答继续追问(如“再多给两个方案”或“解释这段逻辑”),往往需要手动复制粘贴历史对话,操作机械且易出错。
- 工作流不统一:AI 交互与本地开发环境完全隔离,无法像操作终端一样通过快捷键快速导航历史记录或清理临时缓冲区。
使用 chatgpt-shell 后
- 一键切换模型:在同一个 Shell 缓冲区中,通过
M-x chatgpt-shell-swap-model即可瞬间从 ChatGPT 切换到 Ollama 本地模型,无需中断编码节奏。 - 沉浸式组合编辑:选中代码区域后调用
chatgpt-shell-prompt-compose,直接在可编辑的 Buffer 中打磨提示词,享受完整的 Emacs 编辑体验后再提交。 - 高效快捷交互:利用内置单键命令,按
r直接追问后续问题,按m请求更多类似结果,按n/p快速浏览历史对话块,交互如呼吸般自然。 - 原生工作流整合:AI 对话完全融入 Comint Shell 机制,支持标准快捷键关闭缓冲区、自动高亮代码块,让 AI 辅助成为开发闭环的一部分。
chatgpt-shell 将分散的网页 AI 交互收束为统一的 Emacs 原生工作流,让开发者在熟悉的编辑环境中无缝驾驭多模型能力。
运行环境要求
- 未说明
非必需(本地运行 Ollama 时需根据所选模型配置相应 GPU,云端 API 模式无需本地 GPU)
未说明

快速开始
👉 [[https://github.com/sponsors/xenodium][通过 GitHub Sponsors 支持本项目]]
[[https://stable.melpa.org/#/chatgpt-shell][file:https://stable.melpa.org/packages/chatgpt-shell-badge.svg]] [[https://melpa.org/#/chatgpt-shell][file:https://melpa.org/packages/chatgpt-shell-badge.svg]]
- chatgpt-shell
一个支持多大模型的 Emacs [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html][comint]] shell,由 [[https://lmno.lol/alvaro][我]] 开发。
- 相关包
- [[https://github.com/xenodium/ob-chatgpt-shell][ob-chatgpt-shell]]:将 chatgpt-shell 块作为 Emacs org babel 块执行。
- [[https://github.com/xenodium/ob-dall-e-shell][ob-dall-e-shell]]:将 DALL-E shell 块作为 Emacs org babel 块执行。
- [[https://github.com/xenodium/dall-e-shell][dall-e-shell]]:一个用于 OpenAI 的 DALL-E 的 Emacs shell。
- [[https://github.com/xenodium/shell-maker][shell-maker]]:创建由本地或云端服务支持的 Emacs shell。
- 新闻
chatgpt-shell 支持多模型 🎉
请赞助该项目,以确保开发与支持的可持续性。
| 提供商 | 模型 | 支持 | 设置 | |------------+---------------+-----------+----------------------------------| | Anthropic | Claude | 是 | 设置 =chatgpt-shell-anthropic-key= | | Deepseek | Chat/Reasoner | 是 | 设置 =chatgpt-shell-deepseek-key= | | Google | Gemini | 是 | 设置 =chatgpt-shell-google-key= | | Kagi | Summarizer | 是 | 设置 =chatgpt-shell-kagi-key= | | Ollama | Llama | 是 | 安装 [[https://ollama.com/][Ollama]] | | OpenAI | ChatGPT | 是 | 设置 =chatgpt-shell-openai-key= | | OpenRouter | Various | 是 | 设置 =chatgpt-shell-openrouter-key= | | Perplexity | Llama Sonar | 是 | 设置 =chatgpt-shell-perplexity-key= |
注意:除 [[https://ollama.com/][Ollama]] 外,通常需要为云服务的 API 访问付费。请务必向各 LLM 服务提供商确认。
我最喜欢的模型没有被支持。
| [[https://github.com/xenodium/chatgpt-shell/issues][提交功能请求]] | [[https://github.com/sponsors/xenodium][赞助本项目]] |
** 熟悉的 shell
chatgpt-shell 是一个 [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html][comint]] shell。您可以沿用自己熟悉的 Emacs shell 工作流。
#+HTML: 
** 切换模型
一个 shell 查询所有模型。只需通过 =M-x chatgpt-shell-swap-model= 切换 LLM 提供商,即可继续使用您熟悉的流程。
#+HTML: 
** 混合型 shell
=chatgpt-shell= 包含一个 compose 缓冲区体验。这是我最喜欢且最常使用的与 LLM 交互的方式。
例如,选择一段文本并调用 =M-x chatgpt-shell-prompt-compose=(=C-c C-e= 是我偏好的快捷键),编辑缓冲区会自动复制选中的文本,并允许您构建更完整的查询。准备好后,使用熟悉的 =C-c C-c= 提交。缓冲区会自动变为只读,并启用单字符绑定。
#+HTML: 
*** 导航:n/p(或 TAB/shift-TAB)
在源代码块之间导航(包括历史记录中的先前提交)。源代码块会自动被选中。
*** 回复:r
使用 =r= 绑定对之前的请求进行回复。
*** 再给我一些:m
想再要一些相同的数据吗?按下 =m= 即可请求更多内容。这对于跟进任何类型的列表(建议、候选、结果等)都非常方便。
*** 快速处理:q
我非常喜欢用 =q= 绑定快速关闭 Emacs 缓冲区。chatgpt-shell 的 compose 缓冲区也不例外。
*** 请求完整片段:e
LLM 返回了部分代码吗?按下 =e= 可以请求完整的代码片段。
*** 使用瞬态菜单快速操作
为了快速访问常用操作,=chatgpt-shell= 提供了一个瞬态菜单,基于优秀的 [[https://github.com/magit/transient][transient]] 包实现。可以把它想象成一个临时的键位映射叠加层,它会弹出显示可用命令及其快捷键,并在您选择一个命令后自动消失。
在 =chatgpt-shell= 缓冲区中,使用 =C-c C-t= 来调用该菜单。
菜单按逻辑分组排列,便于导航:
#+BEGIN_SRC text :exports code
┌──────────────────────────────────────────────────────────────────────────────┐
│ 外壳 通过组合生成提示 内联编辑 │
│ b: 切换到外壳缓冲区 e: 专用缓冲区 q: 快速 │
│ N: 创建新外壳 p: 小缓冲区 插入/ │
│ P: 小缓冲区(包含上次 编辑 │
│ 杀掉的内容) r: 发送 │
│ 区域 │
│ R: 发送 & │
│ 审核 │
│ 区域 │
│ │
│ 会话 历史记录 导航 │
│ m: 切换模型 h: 搜索 n: 下一项 │
│ L: 重新加载模型 p: 上一项 │
│ y: 切换系统提示 项 │
│ TAB: 下一个 │
│ 源 │
│ 块 │
│
(注:显示的具体命令取决于上下文,例如是否激活了区域,或者你是否位于 =chatgpt-shell= 缓冲区中。)
如果你更喜欢全局快捷键(在 Emacs 的任何地方都可用),可以在你的个人 Emacs 配置中添加如下内容:
#+begin_src emacs-lisp :lexical no ;; 在你的 init.el 或等效文件中 (global-set-key (kbd "C-c C-g") 'chatgpt-shell-transient) #+end_src
此菜单有助于发现可用的命令并快速执行,而无需记住每一个快捷键或 =M-x= 命令名称。
** 确认内联修改(通过差异)
请求内联修改,并在接受之前明确确认。
#+HTML: 
** 执行代码片段(类似于 [[https://orgmode.org/worg/org-contrib/babel/intro.html][org babel]])
外壳和组合缓冲区都允许用户通过 =C-c C-c= 执行源代码块,利用 [[https://orgmode.org/worg/org-contrib/babel/intro.html][org babel]] 的功能。
#+HTML: 
** 视觉实验
我一直在尝试使用图像查询(目前仅支持 ChatGPT,请 [[https://github.com/sponsors/xenodium][赞助]] 以帮助增加对其他模型的支持)。
以下是一个方便的集成,用于提取日语词汇。此外,还有一个通用的图像描述工具,可通过 =M-x chatgpt-shell-describe-image= 调用,适用于任何 Emacs 图像(通过 dired、图像缓冲区、光标指向图像,或选择桌面区域)。
#+HTML: 
- 支持这项工作
如果你觉得 =chatgpt-shell= 很有用,请帮助使该项目可持续发展,并考虑 ✨[[https://github.com/sponsors/xenodium][赞助]]✨。
=chatgpt-shell= 仍在开发中。请报告问题或提交 [[https://github.com/xenodium/chatgpt-shell/pulls][拉取请求]] 以改进它。
- 喜欢这个包吗?告诉我吧 💙
觉得它有用吗?喜欢这个包吗?我很想听听你的意见。请与我联系([[https://indieweb.social/@xenodium][Mastodon]] / [[https://twitter.com/xenodium][Twitter]] / [[https://bsky.app/profile/xenodium.bsky.social][Bluesky]] / [[https://www.reddit.com/user/xenodium][Reddit]] / [[mailto:me__AT__xenodium.com][电子邮件]])。
- 安装
** MELPA
通过 [[https://github.com/jwiegley/use-package][use-package]],你可以使用 =:ensure t= 进行安装。
#+begin_src emacs-lisp :lexical no (use-package chatgpt-shell :ensure t :custom ((chatgpt-shell-openai-key (lambda () (auth-source-pass-get 'secret "openai-key"))))) #+end_src
** Straight
#+begin_src emacs-lisp :lexical no (use-package shell-maker :straight (:type git :host github :repo "xenodium/shell-maker"))
(use-package chatgpt-shell :straight (:type git :host github :repo "xenodium/chatgpt-shell" :files ("chatgpt-shell*.el")) :custom ((chatgpt-shell-openai-key (lambda () (auth-source-pass-get 'secret "openai-key"))))) #+end_src
- 切换模型 ** M-x chatgpt-shell-swap-model
#+HTML: 
- 设置默认模型
#+begin_src emacs-lisp :lexical no (setq chatgpt-shell-model-version "llama3.2") #+end_src
- 设置 API 密钥
首先,你需要为每个想要交互的公共大语言模型 API 获取一个 API 密钥。
| 服务 | 模型 | 链接:获取 API 密钥 |
|---|---|---|
| OpenAI | ChatGPT | [[https://platform.openai.com/account/api-keys][获取 API 密钥]] |
| Anthropic | Claude | [[https://console.anthropic.com/dashboard][访问控制台]] |
| Deepseek | Chat/Reasoner | [[https://platform.deepseek.com/api_keys][获取 API 密钥]] |
| Gemini | [[https://aistudio.google.com/app/apikey][获取 API 密钥]] | |
| Kagi | Summarizer | [[https://kagi.com/settings?p=api][获取 API 密钥]] |
| OpenRouter | 多种 | [[https://openrouter.ai/settings/keys][管理您的 API 密钥]] |
| Perplexity | Llama Sonar | [[https://docs.perplexity.ai/guides/getting-started#generate-an-api-key][获取 API 密钥]] |
** 通过函数将 API 密钥提供给 ChatGPT
您可以定义一个 chatgpt-shell 调用的函数来获取 API 密钥。以下示例适用于 OpenAI;对于其他服务,请采用类似的方法。
#+begin_src emacs-lisp ;; 如果您使用的是 "pass" 密码管理器 (setq chatgpt-shell-openai-key (lambda () ;; (auth-source-pass-get 'secret "openai-key") ; 使用 auth-sources 的 pass 支持作为替代 (nth 0 (process-lines "pass" "show" "openai-key"))))
;; 或者如果您使用 auth-sources,例如 ~/.authinfo 文件中包含以下行: ;; machine api.openai.com password OPENAI_KEY (setq chatgpt-shell-openai-key (auth-source-pick-first-password :host "api.openai.com"))
;; 或者与上一条相同,但采用惰性加载(避免意外弹出密码提示) (setq chatgpt-shell-openai-key (lambda () (auth-source-pick-first-password :host "api.openai.com"))) #+end_src
** 手动/交互式设置相应变量
=M-x set-variable chatgpt-shell-anthropic-key=
=M-x set-variable chatgpt-shell-deepseek-key=
=M-x set-variable chatgpt-shell-google-key=
...
** 在您的 Emacs 初始化文件中以编程方式设置相应变量 #+begin_src emacs-lisp ;; 从字符串设置 Anthropic 密钥 (setq chatgpt-shell-anthropic-key "my anthropic key") ;; 从环境变量设置 OpenAI 密钥 (setq chatgpt-shell-openai-key (getenv "OPENAI_API_KEY"))
#+end_src
- 通过代理服务使用 ChatGPT
如果您通过代理服务 "https://api.chatgpt.domain.com" 使用 ChatGPT,请设置如下选项:
#+begin_src emacs-lisp :lexical no (use-package chatgpt-shell :ensure t :custom ((chatgpt-shell-api-url-base "https://api.chatgpt.domain.com") (chatgpt-shell-openai-key (lambda () ;; 此处的 openai-key 应该是代理服务的密钥。 (auth-source-pass-get 'secret "openai-key"))))) #+end_src
如果您的代理服务 API 路径不是 OpenAI ChatGPT 的默认路径 "/v1/chat/completions=",则可以自定义选项 chatgpt-shell-api-url-path。
- 通过 HTTP(S) 代理使用 ChatGPT
在后台,chatgpt-shell 使用 =curl= 向 OpenAI 服务器发送请求。如果您通过 HTTP 代理使用 ChatGPT(例如您处于企业网络中,HTTP 代理将企业网络与互联网隔开),则需要通过 curl 选项 =-x http://your_proxy= 告诉 =curl= 使用该代理。为此,请使用 =chatgpt-shell-proxy=。
例如,如果您希望 curl 使用 =-x=http://your_proxy=,请将 =chatgpt-shell-proxy= 设置为 "=http://your_proxy="。
- 启动
通过 =M-x chatgpt-shell= 启动。
注意:=M-x chatgpt-shell= 会保持单个 shell 运行,必要时会重新聚焦。要启动多个 shell,请使用 =C-u M-x chatgpt-shell=。
- 清空缓冲区
在提示符下输入 =clear=。
#+begin_src sh ChatGPT> clear #+end_src
或者,您也可以使用 =M-x chatgpt-shell-clear-buffer= 或 =M-x comint-clear-buffer=。
- 保存和恢复
使用 =M-x chatgpt-shell-save-session-transcript= 保存会话记录,并使用 =M-x chatgpt-shell-restore-session-from-transcript= 恢复会话。
一些相关值存储在 =shell-maker= 中,例如 =shell-maker-transcript-default-path= 和 =shell-maker-forget-file-after-clear=。
- 流式传输
=chatgpt-shell= 可以选择等待整个响应接收完毕后再显示,也可以在数据块到达时逐步显示(流式传输)。
流式传输默认启用。若要禁用,请执行 =(setq chatgpt-shell-streaming nil)=。
- chatgpt-shell 自定义设置
#+BEGIN_SRC emacs-lisp :results table :colnames '("自定义变量" "描述") :exports results (let ((rows)) (mapatoms (lambda (symbol) (when (and (string-match "^chatgpt-shell" (symbol-name symbol)) (custom-variable-p symbol)) (push `(,symbol ,(car (split-string (or (documentation-property symbol 'variable-documentation) (get (indirect-variable symbol) 'variable-documentation) (get symbol 'variable-documentation) "") "\n"))) rows)))) rows) #+END_SRC
#+RESULTS: | 自定义变量 | 描述 | |------------------------------------------------------------------+------------------------------------------------------------------------------| | chatgpt-shell-google-api-url-base | Google API 的基础 URL。 | | chatgpt-shell-deepseek-api-url-base | DeepSeek API 的基础 URL。 | | chatgpt-shell-perplexity-key | Perplexity API 密钥,可以是字符串,也可以是加载并返回该密钥的函数。 | | chatgpt-shell-anthropic-thinking | 当非 nil 时,启用模型思考功能(如果可用)。 | | chatgpt-shell-deepseek-key | DeepSeek 密钥,可以是字符串,也可以是加载并返回该密钥的函数。 | | chatgpt-shell-prompt-header-write-git-commit | ‘git-commit’ 提示语的头部。 | | chatgpt-shell-highlight-blocks | 是否高亮显示源代码块。 | | chatgpt-shell-prompt-compose-display-action | 选择如何显示撰写缓冲区。 | | chatgpt-shell-display-function | 用于显示 shell 的函数。可设置为 ‘display-buffer’ 或自定义函数。 | | chatgpt-shell-prompt-header-generate-unit-test | ‘generate-unit-test’ 提示语的头部。 | | chatgpt-shell-prompt-header-refactor-code | ‘refactor-code’ 提示语的头部。 | | chatgpt-shell-prompt-header-proofread-region | 由 ‘chatgpt-shell-proofread-region’ 使用的提示语头部。 | | chatgpt-shell-openai-reasoning-effort | 用于 OpenAI 推理模型的推理力度。 | | chatgpt-shell-welcome-function | 返回欢迎消息的函数,或返回 nil 表示不显示消息。 | | chatgpt-shell-perplexity-api-url-base | Perplexity API 的基础 URL。 | | chatgpt-shell-prompt-query-response-style | 决定从其他缓冲区调用时的提示语风格。 | | chatgpt-shell-model-version | 活跃模型版本,可以是字符串。 | | chatgpt-shell-kagi-key | Kagi API 密钥,可以是字符串,也可以是加载并返回该密钥的函数。 | | chatgpt-shell-logging | 默认禁用日志记录(会降低速度)。 | | chatgpt-shell-render-latex | 是否渲染 LaTeX 块(实验性功能)。 | | chatgpt-shell-swap-model-selector | 在切换模型时使用的自定义函数。 | | chatgpt-shell-api-url-base | OpenAI API 的基础 URL。 | | chatgpt-shell-google-key | Google API 密钥,可以是字符串,也可以是加载并返回该密钥的函数。 | | chatgpt-shell-ollama-api-url-base | Ollama API 的基础 URL。 | | chatgpt-shell-openrouter-key | OpenRouter 密钥,可以是字符串,也可以是加载并返回该密钥的函数。 | | chatgpt-shell-babel-headers | 使 Babel 块正常工作的附加头信息。 | | chatgpt-shell--pretty-smerge-mode-hook | 进入或离开 ‘chatgpt-shell--pretty-smerge-mode’ 后执行的钩子。 | | chatgpt-shell-include-local-file-link-content | 非 nil 时,将在请求中包含链接文件的内容。 | | chatgpt-shell-compose-auto-transient | 当非 nil 时,撰写提交后自动显示临时菜单。 | | chatgpt-shell-source-block-actions | 已知语言的代码块操作。 | | chatgpt-shell-default-prompts | 可供选择的默认提示语列表。 | | chatgpt-shell-anthropic-key | Anthropic API 密钥,可以是字符串,也可以是加载并返回该密钥的函数。 | | chatgpt-shell-always-create-new | 非 nil 时,每次调用 ‘chatgpt-shell’ 都会创建一个新的 shell 缓冲区。 | | chatgpt-shell-screenshot-command | 用于截屏的程序。 | | chatgpt-shell-prompt-header-eshell-summarize-last-command-output | ‘eshell-summarize-last-command-output’ 提示语的头部。 | | chatgpt-shell-system-prompt | ‘chatgpt-shell-system-prompts’ 系统提示语索引。 | | chatgpt-shell-transmitted-context-length | 控制提供给 ChatGPT 的上下文长度。 | | chatgpt-shell-root-path | 存储内部 shell 文件的根路径位置。 | | chatgpt-shell-prompt-header-whats-wrong-with-last-command | ‘whats-wrong-with-last-command’ 提示语的头部。 | | chatgpt-shell-read-string-function | 从用户读取字符串的函数。 | | chatgpt-shell-swap-model-filter | 使用此函数作为过滤器来筛选可切换的模型。 | | chatgpt-shell-after-command-functions | 每次命令执行后调用的异常钩子(即带有参数的钩子)。 | | chatgpt-shell-system-prompts | 可供选择的系统提示语列表。 | | chatgpt-shell-openai-key | OpenAI 密钥,可以是字符串,也可以是加载并返回该密钥的函数。 | | chatgpt-shell-proxy | 当非 nil 时,用作代理(例如 http 或 socks5)。 | | chatgpt-shell-prompt-header-describe-code | ‘describe-code’ 提示语的头部。 | | chatgpt-shell-insert-dividers | 是否在请求和响应之间显示分隔线。 | | chatgpt-shell-models | 可供切换的支持模型列表。 | | chatgpt-shell-openrouter-api-url-base | OpenRouter API 的基础 URL。 | | chatgpt-shell-language-mapping | 将外部语言名称映射到 Emacs 中的语言名称。 | | chatgpt-shell-prompt-compose-view-mode-hook | 进入或离开 ‘chatgpt-shell-prompt-compose-view-mode’ 后执行的钩子。 | | chatgpt-shell-streaming | 是否流式传输 ChatGPT 的响应(随到随显 chunks)。 | | chatgpt-shell-anthropic-api-url-base | Anthropic API 的基础 URL。 | | chatgpt-shell-model-temperature | 采样温度,范围在 0 到 2 之间,或返回 nil。 | | chatgpt-shell-anthropic-thinking-budget-tokens | 分配给 Anthropic 模型思考的 token 预算。 | | chatgpt-shell-request-timeout | 请求超时等待时间,单位为秒。 | | chatgpt-shell-kagi-api-url-base | Kagi API 的基础 URL。 |
还有更多。可通过 =M-x set-variable= 浏览。
** =chatgpt-shell-display-function=(使用自定义函数)
如果你更倾向于使用自己的自定义显示函数,
#+begin_src emacs-lisp :lexical no (setq chatgpt-shell-display-function #'my/chatgpt-shell-frame)
(defun my/chatgpt-shell-frame (bname) (let ((cur-f (selected-frame)) (f (my/find-or-make-frame "chatgpt"))) (select-frame-by-name "chatgpt") (pop-to-buffer-same-window bname) (set-frame-position f (/ (display-pixel-width) 2) 0) (set-frame-height f (frame-height cur-f)) (set-frame-width f (frame-width cur-f) 1)))
(defun my/find-or-make-frame (fname) (condition-case nil (select-frame-by-name fname) (error (make-frame `((name . ,fname)))))) #+end_src
感谢 [[https://github.com/tuhdo][tuhdo]] 提供的自定义显示函数。
- chatgpt-shell 命令
#+BEGIN_SRC emacs-lisp :results table :colnames '("绑定" "命令" "描述") :exports results (let ((rows)) (mapatoms (lambda (symbol) (when (and (string-match "^chatgpt-shell" (symbol-name symbol)) (commandp symbol)) (push `(,(string-join (seq-filter (lambda (symbol) (not (string-match "menu" symbol))) (mapcar (lambda (keys) (key-description keys)) (or (where-is-internal (symbol-function symbol) comint-mode-map nil nil (command-remapping 'comint-next-input)) (where-is-internal symbol chatgpt-shell-mode-map nil nil (command-remapping symbol)) (where-is-internal (symbol-function symbol) chatgpt-shell-mode-map nil nil (command-remapping symbol))))) " 或 ") ,(symbol-name symbol) ,(car (split-string (or (documentation symbol t) "") "\n"))) rows)))) rows) #+END_SRC
#+RESULTS:
| 绑定 | 命令 | 描述 |
|----------------------+----------------------------------------------------------+---------------------------------------------------------------------------------|
| | chatgpt-shell-japanese-lookup | 查找日语术语。 |
| | chatgpt-shell-next-source-block | 将光标移动到下一个源代码块的主体。 |
| | chatgpt-shell-prompt-compose-request-entire-snippet | 如果响应代码不完整,请求整个代码片段。 |
| | chatgpt-shell-prompt-compose-request-more | 请求更多数据。这在您已经请求过示例时很有用。 |
| | chatgpt-shell-google-toggle-grounding-with-google-search | 切换当前所选模型的 :grounding-search' 布尔值。 | | | chatgpt-shell-execute-babel-block-action-at-point | 以 Org Babel 格式执行代码块。 | | C-c C-s | chatgpt-shell-swap-system-prompt | 从 chatgpt-shell-system-prompts' 中切换系统提示词。 |
| | chatgpt-shell-system-prompts-menu | ChatGPT |
| | chatgpt-shell-prompt-compose-swap-model-version | 切换撰写缓冲区的模型版本。 |
| | chatgpt-shell-describe-code | 使用 ChatGPT 描述区域内的代码。 |
| C-chatgpt-shell-models' 中切换模型版本。 | | C-x C-s | chatgpt-shell-save-session-transcript | 将会话记录保存到文件中。 | | | chatgpt-shell-proofread-region | 使用 ChatGPT 校对区域或当前段落中的文本。 | | | chatgpt-shell-prompt-compose-quit-and-close-frame | 如果是最后一个窗口,则退出撰写并关闭框架。 | | | chatgpt-shell-prompt-compose-other-buffer | 跳转到 Shell 缓冲区(撰写缓冲区的另一个缓冲区)。 | | | chatgpt-shell | 启动 ChatGPT Shell 交互式命令。 | | RET | chatgpt-shell-submit | 提交当前输入。 | | | chatgpt-shell-prompt-compose-swap-system-prompt | 切换撰写缓冲区的系统提示词。 | | | chatgpt-shell-describe-image | 请求 OpenAI 描述图像。 | | | chatgpt-shell-prompt-compose-search-history | 搜索提示词历史,选择并插入到当前撰写缓冲区。 | | | chatgpt-shell-prompt-compose-previous-history | 将历史中的上一条提示词插入到撰写缓冲区。 | | | chatgpt-shell-delete-interaction-at-point | 删除光标处的交互(请求和响应)。 | | | chatgpt-shell-anthropic-toggle-thinking | 切换 Anthropic 模型,根据 chatgpt-shell-anthropic-thinking' 进行操作。 |
| | chatgpt-shell-refresh-rendering | 通过重新应用到整个缓冲区来刷新 Markdown 渲染。 |
| | chatgpt-shell-prompt-compose-insert-block-at-point | 在已知位置将代码块插入到光标处。 |
| | chatgpt-shell-explain-code | 使用 ChatGPT 描述区域内的代码。 |
| | chatgpt-shell-execute-block-action-at-point | 在光标处执行代码块。 |
| | chatgpt-shell-load-awesome-prompts | 从 awesome-chatgpt-prompts 加载 chatgpt-shell-system-prompts'。 | | | chatgpt-shell-write-git-commit | 使用 ChatGPT 从区域编写提交信息。 | | | chatgpt-shell-restore-session-from-transcript | 从文件会话记录(或 HISTORY)中恢复会话。 | | | chatgpt-shell-prompt-compose-next-interaction | 显示下一次交互(请求/响应)。 | | <backtab> 或 C-c C-p | chatgpt-shell-previous-item | 跳转到上一个项目。 | | | chatgpt-shell-fix-error-at-point | 修复光标处的 flymake 错误。 | | | chatgpt-shell-next-link | 将光标移动到下一个链接。 | | | chatgpt-shell-prompt-compose-transient | ChatGPT Shell Compose 临时模式。 | | | chatgpt-shell-prompt-compose-clear-history | 清除撰写及关联的 Shell 历史记录。 | | | chatgpt-shell-prompt-appending-kill-ring | 从 minibuffer 发起 ChatGPT 请求,并将其添加到剪贴板。 | | | chatgpt-shell-ollama-load-models | 查询 Ollama 获取本地安装的模型,并将其添加到 | | C-<down> 或 M-n | chatgpt-shell-next-input | 循环浏览输入历史。 | | | chatgpt-shell-prompt-compose-view-mode | 类似于 view-mode,但专为 ChatGPT Compose 扩展。 | | | chatgpt-shell-clear-buffer | 清空当前 Shell 缓冲区。 | | | chatgpt-shell-insert-local-file-link | 选择并插入指向本地文件的链接。 | | | chatgpt-shell-edit-block-at-point | 在光标处执行代码块。 | | <tab> 或 C-c C-n | chatgpt-shell-next-item | 跳转到下一个项目。 | | | chatgpt-shell-prompt-compose-send-buffer | 将撰写缓冲区内容发送到 Shell 进行处理。 | | C-c C-e | chatgpt-shell-prompt-compose | 从专用缓冲区撰写并发送提示词。 | | | chatgpt-shell-rename-buffer | 重命名当前 Shell 缓冲区。 | | | chatgpt-shell-remove-block-overlays | 移除代码块覆盖层。对于重命名代码块非常有用。 | | | chatgpt-shell-send-region | 将区域发送到 ChatGPT。 | | | chatgpt-shell-send-and-review-region | 将区域发送到 ChatGPT,在提交前进行审查。 | | C-M-h | chatgpt-shell-mark-at-point-dwim | 如果光标在源代码块上,则标记该块;否则标记所有输出。 | | | chatgpt-shell-insert-buffer-file-link | 选择并插入指向缓冲区本地文件的链接。 | | | chatgpt-shell--pretty-smerge-mode | 用于显示冲突标记覆盖的小模式。 | | | chatgpt-shell-mark-block | 在撰写缓冲区中标记当前代码块。 | | | chatgpt-shell-prompt-compose-reply | 作为后续回复并撰写另一条查询。 | | | chatgpt-shell-prompt-compose-refresh | 使用 Shell 中的当前内容刷新撰写缓冲区。 | | | chatgpt-shell-set-as-primary-shell | 当有多个会话时,将其设置为主 Shell。 | | | chatgpt-shell-google-load-models | 查询 Google 获取可用的 Gemini LLM 模型列表。 | | | chatgpt-shell-rename-block-at-point | 重命名光标处的代码块(可能使用不同语言)。 | | | chatgpt-shell-quick-insert | 从 minibuffer 发起请求,并将响应插入到当前缓冲区。 | | | chatgpt-shell-reload-default-models | 重新加载所有可用模型。 | | S-<return> | chatgpt-shell-newline | 插入一个新行,并将光标移动到新行的左边界。 | | | chatgpt-shell-generate-unit-test | 使用 ChatGPT 为区域内的代码生成单元测试。 | | | chatgpt-shell-prompt-compose-view-last | 显示最后的请求/响应交互。 | | | chatgpt-shell-prompt-compose-previous-item | 跳转并选择上一个项目(请求、响应、代码块、链接、交互)。 | | | chatgpt-shell-prompt-compose-next-history | 将历史中的下一条提示词插入到撰写缓冲区。 | | C-c C-c | chatgpt-shell-ctrl-c-ctrl-c | 如果光标在源代码块内,则执行该块;否则中断。 | | | chatgpt-shell-eshell-summarize-last-command-output | 请求 ChatGPT 总结上次命令的输出。 | | M-r | chatgpt-shell-search-history | 搜索之前的输入历史。 | | | chatgpt-shell-mode | ChatGPT Shell 的主模式。 | | | chatgpt-shell-prompt-compose-mode | 从专用缓冲区撰写 ChatGPT 提示词的主模式。 | | | chatgpt-shell-previous-source-block | 将光标移动到上一个源代码块的主体。 | | | chatgpt-shell-prompt | 从 minibuffer 发起 ChatGPT 请求。 | | | chatgpt-shell-japanese-ocr-lookup | 选择屏幕上的一个区域进行 OCR,并用日语查找。 | | | chatgpt-shell-refactor-code | 使用 ChatGPT 重构区域内的代码。 | | | chatgpt-shell-proofread-paragraph-or-region | 使用 ChatGPT 校对区域或当前段落中的文本。 | | | chatgpt-shell-view-block-at-point | 在单独的缓冲区中查看光标处的代码块(使用相应语言的主模式)。 | | | chatgpt-shell-japanese-audio-lookup | 转录当前文件(缓冲区或 dired')中的音频,并用日语查找。 |
| | chatgpt-shell-eshell-whats-wrong-with-last-command | 询问 ChatGPT 上次 eshell 命令出了什么问题。 |
| | chatgpt-shell-prompt-compose-cancel | 取消并关闭撰写缓冲区。 |
| | chatgpt-shell-prompt-compose-retry | 重试向 Shell 发送请求。 |
| | chatgpt-shell-version | 显示 chatgpt-shell' 模式的版本。 | | | chatgpt-shell-prompt-compose-previous-interaction | 显示上一次交互(请求/响应)。 | | | chatgpt-shell-interrupt | 从任何缓冲区中断 chatgpt-shell'。 |
| | chatgpt-shell-view-at-point | 在单独的缓冲区中查看光标处的提示词和输出。 |
通过 =M-x= 浏览所有可用选项。
- 功能请求
- 请先查看此 README,确认所需功能是否已支持。
- 需要自定义行为吗?请查看现有的 [[https://github.com/xenodium/chatgpt-shell/issues?q=is%3Aissue+][问题/功能请求]]。您可能会在讨论中找到解决方案。
拉取请求 非常欢迎提交拉取请求。请在开始之前[[https://github.com/xenodium/chatgpt-shell/issues/new][联系一下]],以确保我们不会重复工作。同时,请[[https://github.com/xenodium/chatgpt-shell/][搜索现有的讨论]]。
报告 bug ** 设置不生效? 请分享您用于设置 =chatgpt-shell= 的完整代码片段(但需遮盖您的密钥)。同时请附上遇到的任何错误信息。继续阅读以了解如何提供更多详细信息。 ** 发现运行时或 Elisp 错误? 请启用 =M-x toggle-debug-on-error=,重现错误,并分享堆栈跟踪信息。 ** 发现意外行为? 请启用日志记录 =(setq chatgpt-shell-logging t)=,并在 bug 报告中分享 =chatgpt-log= 缓冲区的内容。 ** Babel 相关问题? 请一并分享完整的 Org 代码片段。
支持我的工作
👉 觉得我的工作有用吗?[[https://github.com/sponsors/xenodium][通过 GitHub Sponsors 支持这项工作]],或[[https://apps.apple.com/us/developer/xenodium-ltd/id304568690][购买我的 iOS 应用程序]]。
- 我的其他工具、包、应用及写作...
- [[https://xenodium.com/][博客 (xenodium.com)]]
- [[https://lmno.lol/alvaro][博客 (lmno.lol/alvaro)]]
- [[https://plainorg.com][Plain Org]] (iOS)
- [[https://flathabits.com][Flat Habits]] (iOS)
- [[https://apps.apple.com/us/app/scratch/id1671420139][Scratch]] (iOS)
- [[https://github.com/xenodium/macosrec][macosrec]] (macOS)
- [[https://apps.apple.com/us/app/fresh-eyes/id6480411697?mt=12][Fresh Eyes]] (macOS)
- [[https://github.com/xenodium/dwim-shell-command][dwim-shell-command]] (Emacs)
- [[https://github.com/xenodium/company-org-block][company-org-block]] (Emacs)
- [[https://github.com/xenodium/org-block-capf][org-block-capf]] (Emacs)
- [[https://github.com/xenodium/ob-swiftui][ob-swiftui]] (Emacs)
- [[https://github.com/xenodium/chatgpt-shell][chatgpt-shell]] (Emacs)
- [[https://github.com/xenodium/ready-player][ready-player]] (Emacs)
- [[https://github.com/xenodium/sqlite-mode-extras][sqlite-mode-extras]]
- [[https://github.com/xenodium/ob-chatgpt-shell][ob-chatgpt-shell]] (Emacs)
- [[https://github.com/xenodium/dall-e-shell][dall-e-shell]] (Emacs)
- [[https://github.com/xenodium/ob-dall-e-shell][ob-dall-e-shell]] (Emacs)
- [[https://github.com/xenodium/shell-maker][shell-maker]] (Emacs)
- 贡献者
#+HTML:
#+HTML:
#+HTML:
常见问题
相似工具推荐
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
NextChat
NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
ragflow
RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。
PaddleOCR
PaddleOCR 是一款基于百度飞桨框架开发的高性能开源光学字符识别工具包。它的核心能力是将图片、PDF 等文档中的文字提取出来,转换成计算机可读取的结构化数据,让机器真正“看懂”图文内容。 面对海量纸质或电子文档,PaddleOCR 解决了人工录入效率低、数字化成本高的问题。尤其在人工智能领域,它扮演着连接图像与大型语言模型(LLM)的桥梁角色,能将视觉信息直接转化为文本输入,助力智能问答、文档分析等应用场景落地。 PaddleOCR 适合开发者、算法研究人员以及有文档自动化需求的普通用户。其技术优势十分明显:不仅支持全球 100 多种语言的识别,还能在 Windows、Linux、macOS 等多个系统上运行,并灵活适配 CPU、GPU、NPU 等各类硬件。作为一个轻量级且社区活跃的开源项目,PaddleOCR 既能满足快速集成的需求,也能支撑前沿的视觉语言研究,是处理文字识别任务的理想选择。
OpenHands
OpenHands 是一个专注于 AI 驱动开发的开源平台,旨在让智能体(Agent)像人类开发者一样理解、编写和调试代码。它解决了传统编程中重复性劳动多、环境配置复杂以及人机协作效率低等痛点,通过自动化流程显著提升开发速度。 无论是希望提升编码效率的软件工程师、探索智能体技术的研究人员,还是需要快速原型验证的技术团队,都能从中受益。OpenHands 提供了灵活多样的使用方式:既可以通过命令行(CLI)或本地图形界面在个人电脑上轻松上手,体验类似 Devin 的流畅交互;也能利用其强大的 Python SDK 自定义智能体逻辑,甚至在云端大规模部署上千个智能体并行工作。 其核心技术亮点在于模块化的软件智能体 SDK,这不仅构成了平台的引擎,还支持高度可组合的开发模式。此外,OpenHands 在 SWE-bench 基准测试中取得了 77.6% 的优异成绩,证明了其解决真实世界软件工程问题的能力。平台还具备完善的企业级功能,支持与 Slack、Jira 等工具集成,并提供细粒度的权限管理,适合从个人开发者到大型企业的各类用户场景。