copilot.el
copilot.el 是一款专为 Emacs 编辑器打造的 GitHub Copilot 非官方插件,旨在将强大的 AI 编程辅助能力无缝融入用户的开发工作流。它解决了开发者在编写代码时需要频繁切换上下文或手动查找示例的痛点,通过提供行内代码补全(幽灵文本)、交互式对话界面以及“下一步编辑建议”功能,显著提升编码效率与流畅度。
这款工具特别适合习惯使用 Emacs 的软件开发者和技术研究人员。无论是日常业务逻辑编写,还是复杂的算法实现,copilot.el 都能提供实时的智能建议。其独特的技术亮点在于直接通过 jsonrpc 与官方的 Copilot 语言服务器通信,而非依赖标准的 LSP 客户端。这种设计不仅更好地适配了 Copilot 特有的非标准协议,还实现了跨缓冲区和项目的全局服务器共享,确保了响应速度与稳定性。只需简单的配置并登录账号,用户即可在熟悉的 Emacs 环境中享受顶级的 AI 结对编程体验。
使用场景
一位资深后端工程师正在 Emacs 中重构一个遗留的 Python 数据处理模块,需要快速补全复杂的正则表达式和重复的样板代码。
没有 copilot.el 时
- 频繁切换上下文:为了确认标准库函数的参数顺序或正则语法,不得不离开编辑器去浏览器搜索文档,打断心流。
- 手动输入样板代码:编写重复的日志记录、异常捕获块和数据序列化逻辑时,只能靠肌肉记忆逐行敲击,效率低下且易出错。
- 调试成本高:在处理复杂字符串匹配时,往往写完后运行报错才发现语法细节有误,需要反复修改试错。
- 思维中断:在构思算法逻辑时,因繁琐的语法细节(如缩进、括号匹配)而被迫停顿,导致整体编码节奏拖沓。
使用 copilot.el 后
- 智能行内补全:copilot.el 直接以“幽灵文本”形式在光标处预测并显示整行甚至整块代码,工程师只需按 Tab 键即可采纳,无需查阅文档。
- 自动生成样板:输入函数签名或注释后,工具自动补全完整的异常处理结构和数据转换逻辑,将机械性打字时间减少 80%。
- 实时语法校正:在编写正则表达式时,copilot.el 能根据上下文即时提供正确的语法建议,显著降低运行时错误率。
- 流畅的逻辑表达:开发者可以专注于业务逻辑的设计,让 copilot.el 负责处理缩进、括号等语法细节,保持编码思路的连贯性。
copilot.el 将 Emacs 用户从繁琐的语法记忆中解放出来,实现了“所想即所得”的高效编程体验。
运行环境要求
- Linux
- macOS
- Windows
不需要 GPU,基于云端 API
未说明

快速开始
Copilot.el
Copilot.el 是一个用于 GitHub Copilot 的 Emacs 插件。它提供了内联补全(幽灵文本)、交互式聊天界面以及下一次编辑建议——所有这些功能都由官方的 @github/copilot-language-server 提供支持。

该插件通过 JSON-RPC 与 Copilot 语言服务器通信,直接使用 jsonrpc.el 而不是通过像 eglot 这样的 LSP 客户端。这是一个有意的选择——Copilot 协议的大部分内容并非标准的 LSP,并且所有缓冲区和项目共享同一个全局服务器。完整的理由请参阅 doc/design.md。
[!NOTE]
您需要访问 GitHub Copilot 才能使用此插件。该服务在 2025 年初推出了免费层级。
需求
copilot.el 需要 Emacs 27 或更高版本,以及以下软件包(可从 MELPA 自动安装):
editorconfigjsonrpccompattrack-changes
@github/copilot-language-server 则需要 Node.js 22 或更高版本。
快速入门
(use-package copilot
:ensure t
:hook (prog-mode . copilot-mode)
:bind (:map copilot-completion-map
("<tab>" . copilot-accept-completion)
("TAB" . copilot-accept-completion)
("C-<tab>" . copilot-accept-completion-by-word)
("C-TAB" . copilot-accept-completion-by-word)
("C-n" . copilot-next-completion)
("C-p" . copilot-previous-completion)))
然后运行 M-x copilot-install-server 和 M-x copilot-login。就完成了!
安装
MELPA
安装 copilot.el 最简单的方式是从 MELPA 获取:
(use-package copilot
:ensure t)
或者使用 M-x package-install RET copilot RET。
Emacs 30+ (use-package :vc)
(use-package copilot
:vc (:url "https://github.com/copilot-emacs/copilot.el"
:rev :newest
:branch "main"))
Emacs 27-29 (straight / quelpa)
straight.el:
(use-package copilot
:straight (:host github :repo "copilot-emacs/copilot.el" :files ("*.el"))
:ensure t)
quelpa + quelpa-use-package:
(use-package copilot
:quelpa (copilot :fetcher github
:repo "copilot-emacs/copilot.el"
:branch "main"
:files ("*.el")))
手动安装
克隆本仓库,确保已安装 需求 中列出的依赖项,然后:
(add-to-list 'load-path "/path/to/copilot.el")
(require 'copilot)
Doom Emacs
将包定义添加到 ~/.doom.d/packages.el:
(package! copilot
:recipe (:host github :repo "copilot-emacs/copilot.el" :files ("*.el")))
在 ~/.doom.d/config.el 中配置 Copilot:
;; 接受 Copilot 的补全并回退到 company
(use-package! copilot
:hook (prog-mode . copilot-mode)
:bind (:map copilot-completion-map
("<tab>" . 'copilot-accept-completion)
("TAB" . 'copilot-accept-completion)
("C-TAB" . 'copilot-accept-completion-by-word)
("C-<tab>" . 'copilot-accept-completion-by-word)))
强烈建议在 company 模块中启用 childframe 选项 ((company +childframe)),以防止覆盖冲突。
如果按 Tab 键有时无法完成补全,您可以将其绑定到其他键,或尝试:
(after! (evil copilot)
;; 定义一个自定义函数,要么接受补全,要么执行默认行为
(defun my/copilot-tab-or-default ()
(interactive)
(if (and (bound-and-true-p copilot-mode)
;; 如有必要,可以添加其他条件来检查 Copilot 是否有活跃的建议
)
(copilot-accept-completion)
(evil-insert 1))) ; 默认操作是插入一个制表符。可根据需要调整。
;; 将自定义函数绑定到 Evil 的插入模式下的 <tab>
(evil-define-key 'insert 'global (kbd "<tab>") 'my/copilot-tab-or-default))
如果您希望在此处配置缩进,以下是一个可能适合您的配置示例:
(use-package! copilot
:hook (prog-mode . copilot-mode)
:bind (:map copilot-completion-map
("<tab>" . 'copilot-accept-completion)
("TAB" . 'copilot-accept-completion)
("C-TAB" . 'copilot-accept-completion-by-word)
("C-<tab>" . 'copilot-accept-completion-by-word)
("C-n" . 'copilot-next-completion)
("C-p" . 'copilot-previous-completion))
:config
(add-to-list 'copilot-indentation-alist '(prog-mode 2))
(add-to-list 'copilot-indentation-alist '(org-mode 2))
(add-to-list 'copilot-indentation-alist '(text-mode 2))
(add-to-list 'copilot-indentation-alist '(clojure-mode 2))
(add-to-list 'copilot-indentation-alist '(emacs-lisp-mode 2)))
Spacemacs
编辑您的 ~/.spacemacs 文件,加入 GitHub Copilot 层,这将为您自动完成所有设置:
;; ===================
;; dotspacemacs/layers
;; ===================
;; 添加或取消注释自动补全层
;; 添加 GitHub Copilot 层
dotspacemacs-configuration-layers
'(
...
auto-completion
github-copilot
...
)
有关默认绑定的详细信息,请参阅 Spacemacs 关于 GitHub Copilot 层的文档。
安装完包后,运行 M-x copilot-install-server 来安装语言服务器,然后运行 M-x copilot-login 进行认证。您可以通过 M-x copilot-diagnose 来验证一切是否正常工作(如果显示“NotAuthorized”,则表示您没有有效的订阅)。
配置
补全触发
使用 copilot-mode 可以在缓冲区中自动提供补全:
(add-hook 'prog-mode-hook 'copilot-mode)
或者使用 global-copilot-mode 在全局范围内启用:
(global-copilot-mode)
若要自定义补全何时触发,请查看 copilot-enable-predicates 和 copilot-disable-predicates。若要自定义补全何时显示,请查看 copilot-enable-display-predicates 和 copilot-disable-display-predicates。
此外,您也可以手动调用 copilot-complete,并在 post-command-hook 中使用 copilot-clear-overlay 来清除补全提示。
聊天
copilot-chat 使用 conversation/* LSP 方法打开与 GitHub Copilot 的交互式聊天。聊天缓冲区会实时流式显示响应,并自动提供当前缓冲区作为上下文。
;; 开始聊天(或在已有聊天窗口时发送后续消息)
M-x copilot-chat
;; 发送选中的代码并附带可选提示
M-x copilot-chat-send-region
*copilot-chat* 缓冲区中的快捷键:
- C-c RET 或 C-c C-c — 发送后续消息
- C-c C-k — 取消流式输出,或在空闲时重置
- q — 退出聊天窗口
自定义选项:
copilot-chat-model— 用于聊天的模型(默认为nil,即使用服务器默认值)
[!TIP]
安装
markdown-mode可以在聊天缓冲区中实现丰富的 Markdown 渲染效果(标题、代码块、强调等)。如果没有安装该模式,则仅使用基本的语法高亮。
若需更丰富的聊天体验,请查看 copilot-chat.el。
[!WARNING]
copilot-chat.el(chep 包)和copilot.el都提供了名为copilot-chat的 Emacs 功能,因此它们 不能同时安装。同时安装会导致自动加载错误,例如“无法定义函数 copilot-chat-display”。如果希望使用copilot.el内置的聊天功能,请确保卸载chep/copilot-chat.el,反之亦然。
下一步编辑建议 (NES)
NES 根据您最近的编辑模式,预测您在文件中任何位置接下来想要进行的编辑。与内联补全(光标处的幽灵文本)不同,NES 建议可以替换或删除文件中任意位置的现有文本。
[!NOTE]
NES 需要
copilot-language-server版本 1.434.0 或更高。如有需要,请运行M-x copilot-reinstall-server进行升级。
在缓冲区中启用 copilot-nes-mode 即可开始接收建议。它可与 copilot-mode 共存:
(add-hook 'prog-mode-hook #'copilot-nes-mode)
当有建议待处理时:
- TAB — 接受建议(如果距离较远会先跳转到建议位置,第二次按下则应用)
- C-g — 撤销建议
自定义变量:
copilot-nes-idle-delay— 在请求建议之前需要等待的空闲时间(秒)(默认为0.5)copilot-nes-auto-dismiss-move-count— 光标移动多少次后自动撤销建议(默认为3)copilot-nes-auto-dismiss-distance— 光标与建议之间的最大行数,超过此值则自动撤销建议(默认为40)
快捷键绑定
copilot-mode 默认不设置任何快捷键。您可以使用 copilot-completion-map(在补全覆盖层可见时生效)来绑定按键:
(keymap-set copilot-completion-map "<tab>" #'copilot-accept-completion)
(keymap-set copilot-completion-map "TAB" #'copilot-accept-completion)
(keymap-set copilot-completion-map "C-<tab>" #'copilot-accept-completion-by-word)
(keymap-set copilot-completion-map "C-TAB" #'copilot-accept-completion-by-word)
(keymap-set copilot-completion-map "M-n" #'copilot-next-completion)
(keymap-set copilot-completion-map "M-p" #'copilot-previous-completion)
Fish 风格的快捷键绑定
如果您使用 company-mode 或 corfu,TAB 键可能已被占用。一种受 Fish shell 启发的替代方案可以完全避免冲突——右箭头接受完整建议,而 forward-word/end-of-line 则部分接受建议:
(keymap-set copilot-completion-map "<right>" #'copilot-accept-completion)
(keymap-set copilot-completion-map "C-f" #'copilot-accept-completion)
(keymap-set copilot-completion-map "M-<right>" #'copilot-accept-completion-by-word)
(keymap-set copilot-completion-map "M-f" #'copilot-accept-completion-by-word)
(keymap-set copilot-completion-map "C-e" #'copilot-accept-completion-by-line)
(keymap-set copilot-completion-map "<end>" #'copilot-accept-completion-by-line)
(keymap-set copilot-completion-map "M-n" #'copilot-next-completion)
(keymap-set copilot-completion-map "M-p" #'copilot-previous-completion)
Zap 风格的部分接受方式
为了在覆盖层可见时自动重新映射内置的 zap 命令:
(keymap-set copilot-completion-map "<remap> <zap-to-char>" #'copilot-accept-completion-to-char)
(keymap-set copilot-completion-map "<remap> <zap-up-to-char>" #'copilot-accept-completion-up-to-char)
LSP 设置
您可以通过 copilot-lsp-settings 配置底层的 LSP 设置。可用选项的完整列表请参见
此处。
以下示例将 GitHub Enterprise 服务器设置为 https://example2.ghe.com,请将其替换为您自己的服务器地址。
(setopt copilot-lsp-settings '(:github-enterprise (:uri "https://example2.ghe.com"))) ;; 允许在不重启 LSP 的情况下更改值
(setq copilot-lsp-settings '(:github-enterprise (:uri "https://example2.ghe.com"))) ;; 或者
使用 setq 更改值时,必须重启 LSP(M-x copilot-diagnose)。登录时,身份验证流程的 URL 应与 copilot-lsp-settings 中设置的 URL 一致。
语言检测
Copilot.el 根据缓冲区的主要模式名称检测编程语言,去掉 -mode 部分。生成的 languageId 应与 此处 的表格匹配。您可以将不常见的主要模式映射添加到 copilot-major-mode-alist 中。如果没有正确设置语言,建议的质量可能会较差。
(add-to-list 'copilot-major-mode-alist '("enh-ruby" . "ruby"))
网络代理
格式:'(:host "127.0.0.1" :port 7890 :username "user" :password "password"),其中 :username 和 :password 是可选的。
例如:
(setq copilot-network-proxy '(:host "127.0.0.1" :port 7890))
处理服务器消息
copilot-on-request 注册一个处理器,用于接收来自语言服务器的 JSON-RPC 请求。返回值应为可序列化的 JSON 数据,或调用 jsonrpc-error 报告错误。更多信息。
;; 如果 Emacs 编译时支持 D-Bus,则显示桌面通知
(copilot-on-request
'window/showMessageRequest
(lambda (msg) (notifications-notify :title "Emacs Copilot" :body (plist-get msg :message))))
copilot-on-notification 注册一个监听器,用于接收传入的 LSP 通知。
(copilot-on-notification
'window/logMessage
(lambda (msg) (message (plist-get msg :message))))
命令
[!TIP]
你不必记住这些命令——只需输入
M-x copilot-后按 TAB 键,或使用菜单栏中的 Copilot 菜单即可。
| 命令 | 描述 |
|---|---|
| 设置 | |
copilot-install-server |
安装语言服务器 |
copilot-uninstall-server |
卸载已安装的语言服务器 |
copilot-reinstall-server |
重新安装语言服务器 |
copilot-login |
登录 GitHub Copilot |
copilot-logout |
从 GitHub Copilot 注销 |
copilot-diagnose |
重启服务器并显示诊断信息 |
copilot-select-completion-model |
选择用于补全的模型 |
copilot-chat-select-model |
选择用于聊天的模型 |
| 补全 | |
copilot-mode |
切换当前缓冲区中的自动补全功能 |
copilot-complete |
在光标位置触发补全 |
copilot-panel-complete |
显示包含多个补全建议的面板缓冲区 |
copilot-accept-completion |
接受当前补全 |
copilot-accept-completion-by-word |
接受接下来的 N 个单词(前缀参数) |
copilot-accept-completion-by-line |
接受接下来的 N 行(前缀参数) |
copilot-accept-completion-by-sentence |
接受接下来的 N 句子(前缀参数) |
copilot-accept-completion-by-paragraph |
接受接下来的 N 段落(前缀参数) |
copilot-accept-completion-to-char |
接受到某个字符为止(包含该字符,类似于 zap-to-char) |
copilot-accept-completion-up-to-char |
接受到某个字符之前(不包含该字符,类似于 zap-up-to-char) |
copilot-clear-overlay |
关闭补全覆盖层 |
| 导航 | |
copilot-next-completion |
切换到下一个补全建议 |
copilot-previous-completion |
切换到上一个补全建议 |
| 聊天 | |
copilot-chat |
打开 Copilot Chat 并发送消息 |
copilot-chat-send |
在当前聊天中发送后续消息 |
copilot-chat-send-region |
将选中的区域作为上下文连同可选提示一起发送 |
copilot-chat-stop |
取消流式传输,或在空闲时重置对话 |
copilot-chat-reset |
销毁当前对话并清空聊天缓冲区 |
| 下一步编辑建议 | |
copilot-nes-mode |
切换当前缓冲区中的 NES 功能 |
copilot-nes-accept |
接受(或跳转到)当前的 NES 建议 |
copilot-nes-dismiss |
忽略当前的 NES 建议 |
自定义
[!TIP]
使用 M-x
customize-groupRETcopilot来浏览所有可用的配置选项及其文档。
以下是一些常用的可调整变量:
copilot-idle-delay— 触发补全前的等待时间(默认为0秒)。将其设置为nil可完全禁用自动补全。copilot-lsp-server-version— 锁定特定的 @github/copilot-language-server 版本(nil表示最新版本)。copilot-enable-predicates/copilot-disable-predicates— 控制copilot-mode何时请求补全。copilot-enable-display-predicates/copilot-disable-display-predicates— 控制何时显示补全结果。copilot-clear-overlay-ignore-commands— 不会关闭覆盖层的命令。copilot-indentation-alist— 根据主要模式覆盖缩进宽度。copilot-enable-parentheses-balancer— 对 Lisp 模式下的补全结果进行后处理以平衡括号(默认为t)。将其设置为nil可使用原始服务器补全结果。
协议支持
copilot.el 使用 LSP 协议以及 Copilot 特有的扩展,通过 JSON-RPC 与 @github/copilot-language-server 进行通信。下表显示了当前的支持情况。
客户端到服务器请求
| 方法 | 状态 | 备注 |
|---|---|---|
initialize |
支持 | 发送 rootUri、workspaceFolders 和编辑器信息 |
shutdown |
支持 | 退出前的正常关闭 |
textDocument/inlineCompletion |
支持 | 核心补全机制 |
workspace/executeCommand |
支持 | 在接受时执行服务器端命令 |
signInInitiate / signInConfirm / checkStatus / signOut |
支持 | 认证流程 |
copilot/models |
支持 | 列出可用的补全模型 |
getPanelCompletions |
支持 | 面板缓冲区中的多个建议 |
conversation/create |
支持 | 开始新的聊天对话 |
conversation/turn |
支持 | 发送后续聊天消息 |
conversation/destroy |
支持 | 结束聊天对话 |
textDocument/copilotInlineEdit |
支持 | 下一步编辑建议(NES) |
客户端到服务器通知
| 方法 | 状态 | 备注 |
|---|---|---|
initialized |
支持 | |
exit |
支持 | 在 shutdown 之后发送 |
textDocument/didOpen |
支持 | |
textDocument/didClose |
支持 | |
textDocument/didChange |
支持 | 增量同步 |
textDocument/didFocus |
支持 | |
textDocument/didShowCompletion |
支持 | 当覆盖层显示时的遥测数据 |
textDocument/didPartiallyAcceptCompletion |
支持 | 部分接受时的遥测数据 |
textDocument/didShowInlineEdit |
支持 | 当 NES 覆盖层显示时的遥测数据 |
workspace/didChangeConfiguration |
支持 | 在设置更改时发送 |
workspace/didChangeWorkspaceFolders |
支持 | 动态工作区根目录 |
$/cancelRequest |
支持 | 取消过时的补全请求 |
textDocument/didSave |
尚未支持 | |
notebookDocument/* |
尚未支持 |
服务器到客户端请求
| 方法 | 状态 | 备注 |
|---|---|---|
window/showMessageRequest |
支持 | 通过 completing-read 提示用户 |
window/showDocument |
支持 | 在浏览器或 Emacs 中打开 URI |
conversation/context |
支持 | 为聊天提供编辑器上下文 |
服务器到客户端通知
| 方法 | 状态 | 备注 |
|---|---|---|
window/logMessage |
支持 | 记录到 *copilot-language-server-log* 日志中 |
didChangeStatus |
支持 | 在模式行中显示 |
$/progress |
支持 | 在模式行中显示进度 |
PanelSolution / PanelSolutionsDone |
支持 | 面板补全结果 |
可通过 copilot-on-request 和 copilot-on-notification 对上述未处理的消息进行扩展。
已知问题
其他补全弹出窗口位置错误

这是一个与 company-mode 默认前端一起使用的示例。由于 company-mode 和 copilot.el 都使用覆盖层来显示补全结果,冲突是不可避免的。推荐的解决方案是使用 company-box(仅限 GUI),它基于子框架而非覆盖层。
使用 company-box 后,效果如下:

在其他编辑器(如 VS Code、PyCharm)中,Copilot 和其他来源的补全结果不能同时显示。而在 copilot.el 中,它们可以共存,因此你可以随时选择更好的补全结果。
光标在输入时跳到行尾
如果您正在使用 whitespace-mode,请确保从 whitespace-style 中移除 newline-mark。
常见问题解答
我需要付费的 GitHub Copilot 订阅吗?
不一定。GitHub 在 2025 年初推出了 Copilot 的免费层级,包含每月有限数量的补全建议。付费订阅(个人或企业)则取消了这些限制。
TAB 键无法接受补全建议
这通常是由其他包以更高优先级绑定了 TAB 键导致的。常见的“罪魁祸首”包括 company-mode、corfu、yasnippet 和 Evil 模式。您可以尝试以下几点:
- 同时绑定
<tab>和TAB。 在 GUI Emacs 中,它们是不同的事件——<tab>是功能键,而TAB是C-i字符。有些模式只拦截其中一种。快速入门 示例中同时绑定了两者。 - 使用 Fish 风格的快捷键。 如果 TAB 键被其他包彻底占用,可以将接受补全的按键改为
<right>或C-f。详情请参阅Fish 风格的快捷键。 - Doom Emacs 用户——请参阅Doom Emacs 安装部分,了解如何通过自定义 Evil 插入模式绑定来解决此问题。
是否可以在不启用 copilot-mode 的情况下使用 copilot-complete?
可以。您可以在任何缓冲区中手动调用 M-x copilot-complete,它会自动启动服务器并打开文档。使用 copilot-clear-overlay(或直接输入内容)即可关闭提示。如果您更倾向于按需触发补全而非自动补全,这种方式非常实用。
补全速度慢或未出现
您可以尝试以下几种方法:
- 运行
M-x copilot-diagnose——它会重启服务器并输出诊断信息。请注意是否有NotAuthorized(订阅问题)或连接错误。 - 检查网络连接——语言服务器需要访问 GitHub 的 API。如果您处于代理之后,请配置
copilot-network-proxy。 - 大文件——超过
copilot-max-char字符数(默认 100,000)的缓冲区会被跳过。您可以提高此限制,但非常大的文件始终会较慢。 - 调整
copilot-idle-delay——默认值为0(立即触发)。设置一个小的延迟(例如0.2秒)可以在快速输入时降低服务器负载。
如何在某些模式或缓冲区中禁用 Copilot?
使用 copilot-disable-predicates 添加函数,当返回 t 时 Copilot 将保持静默:
;; 在 org-mode 中禁用
(add-to-list 'copilot-disable-predicates
(lambda () (derived-mode-p 'org-mode)))
或者直接不要将 copilot-mode 加入您希望排除的模式钩子中。如果您使用 global-copilot-mode,那么使用谓词方式是最合适的。
Lisp 补全中的括号不平衡
Copilot.el 包含一个括号平衡器,在 Lisp 模式(emacs-lisp-mode、clojure-mode、scheme-mode 等)中对补全结果进行后处理,以修复不平衡的分隔符。该功能默认启用。如果仍然遇到问题,请确保 copilot-enable-parentheses-balancer 设置为 t,否则请附上补全文本和缓冲区上下文提交 bug 报告。
如果括号平衡器影响了您的工作流程,可以将其禁用:
(setopt copilot-enable-parentheses-balancer nil)
如何选择不同的补全模型?
运行 M-x copilot-select-completion-model 可以交互式地从您订阅可用的模型中选择。选择结果会保存在 copilot-completion-model 中。将其设置为 nil 可恢复到服务器默认值。
注意: 只有具有“补全”范围的模型才可用于内联补全。像 Claude、Gemini 等您可能在 VS Code 的聊天界面中看到的模型,仅适用于聊天/编辑模式,无法用于内联补全。这是服务器端的限制,而非 copilot.el 的限制。目前 GitHub 仅提供单一的补全模型(gpt-41-copilot)。
要选择聊天模型,请运行 M-x copilot-chat-select-model。聊天模式下可用的模型更多(Claude、Gemini、GPT-4o 等)。选择结果会保存在 copilot-chat-model 中。
报告 Bug
- 更新插件后,请务必重启 Emacs,并在必要时重新构建插件。
- 异步请求错误(例如补全被取消)会自动记录到
*Messages*缓冲区中。请先查看那里以获取线索。 - 若要进行更深入的调查,可以通过自定义
copilot-log-max(例如设置为 1000)启用事件日志,并通过(setq copilot-server-args '("--stdio" "--debug"))启用调试日志,然后粘贴来自*copilot events*、*copilot stderr*和*copilot-language-server-log*缓冲区的相关日志。 - 如果抛出异常,请同时粘贴堆栈跟踪信息(使用
M-x toggle-debug-on-error启用堆栈跟踪)。
开发
有关架构和关键设计决策的概述,请参阅 doc/design.md。
运行测试
单元测试(需要 eask):
eask test buttercup
代码检查
eask lint checkdoc
eask lint indent
集成测试
dev/integration-smoke.el 中包含一个手动集成测试,它会连接到真实的 Copilot 语言服务器,并验证 textDocument/inlineCompletion 的往返通信。此测试需要安装并认证服务器。
emacs --batch -L . -l dev/integration-smoke.el
历史
copilot.el 项目始于 2022 年 3 月。当时还没有公开的 Copilot 服务器包——唯一的方法是从 copilot.vim 内部提取 Node.js 客户端。早期版本的 copilot.el 通过对 copilot.vim 中 JSON-RPC 协议的逆向工程,复制了一份客户端代码并存储在仓库中,每次 copilot.vim 发布新版本时都会更新该副本。
2025 年初,GitHub 在 npm 上发布了官方的 @github/copilot-language-server。copilot.el 迁移到这个开源服务器,完全移除了对 copilot.vim 的依赖。此次切换还带来了新的协议特性,如 textDocument/inlineCompletion(取代了旧版的 getCompletions)、Copilot 聊天以及下一阶段的编辑建议等功能。
致谢
以下项目帮助实现了 copilot.el:
- copilot.vim — 最初的参考实现,其捆绑的客户端驱动了 copilot.el 前三年的发展。
- https://github.com/TommyX12/company-tabnine/ — 基于覆盖层的补全用户体验的灵感来源。
- https://github.com/cryptobadger/flight-attendant.el
- @github/copilot-language-server
团队
现任维护者:@bbatsov。
已卸任的维护者:@zerolfx、@emil-vdw、@jcs090218、@rakotomandimby。
支持项目发展
copilot.el 由志愿者在业余时间开发和维护。如果您觉得它很有用,请考虑支持其持续发展。
以下是您可以支持该项目的方式:
- GitHub Sponsors(定期或一次性捐赠)
- Patreon(定期捐赠)
- PayPal(一次性捐赠)
许可证
copilot.el 采用 MIT 许可证进行分发。
版权所有 © 2022–2026 copilot-emacs 维护者及贡献者。
版本历史
v0.5.02026/03/16v0.4.02026/02/26v0.3.02025/11/16v0.2.02025/04/17v0.1.02025/04/02常见问题
相似工具推荐
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 等工具集成,并提供细粒度的权限管理,适合从个人开发者到大型企业的各类用户场景。