copilot.el 0.7
Good news, everyone – copilot.el 0.7 is out! And it’s a big one.
Ever since I took over the maintenance of copilot.el in the spring of 2025, I’ve had one north star: close the gap between Emacs and the editors that enjoy first-party Copilot support. VS Code and (Neo)vim got the rich, official experience – chat, agents, the whole shebang – while we Emacs folks were stuck with humble ghost-text completion. That never sat right with me. Emacs deserves better.
For a bit of perspective on the pace: in its first three years the project never shipped a single tagged release. 0.7 is the seventh I’ve cut since taking over. We’ve been busy.
For a long time that gap felt unbridgeable. We were essentially reverse-engineering an undocumented protocol and replicating it in Elisp, always one step behind. But then Microsoft open-sourced @github/copilot-language-server, and everything changed. Suddenly we had a documented, first-party LSP server to talk to – the very same backend that powers Copilot in VS Code. The migration to it in 0.4 was the turning point. From that moment on, catching up to the other editors stopped being a fantasy and became a (long) TODO list.
We’ve been chipping away at that list ever since. A few months ago, in 0.5, we added basic support for Copilot Chat – the first time the package did anything beyond completion. 0.6 brought Next Edit Suggestions (NES) and the experimental beginnings of agent mode. And now 0.7 fills in pretty much all of the remaining blanks.
So what’s actually in it? Quite a lot. Let me walk you through the highlights.
Agent Mode, For Real
Chat is nice, but talking to an assistant that can’t do anything gets old fast. Enter agent mode:
(setopt copilot-chat-use-agent-mode t)
With this on, Copilot can run tools to actually get work done – run shell
commands, create and edit files, read your diagnostics, fetch web pages. Ask it
to “add a test for foo and run it” and it’ll write the test, invoke your test
runner, read the output, and iterate, all without you leaving the chat buffer.
Of course, letting an AI run commands and rewrite your files unsupervised is a
recipe for excitement of the wrong kind, so every tool call asks for
confirmation first. File edits show you a diff preview before you approve them,
and if you trust a particular tool you can pick always to stop being asked for
the rest of the conversation. Long-running terminal commands now run
asynchronously too, so Emacs stays responsive while that test suite chugs along
– and C-g aborts a command that’s overstaying its welcome.
Workspace Awareness
An agent that can only see the current buffer isn’t much of an agent. So 0.7
teaches copilot.el to answer the server’s workspace requests: Copilot can now
search your project by file glob or by text/regex (via
ripgrep, so your .gitignore is
respected), read files, and list directories across the whole tree. That’s what
makes “where is X handled in this codebase?” actually work.
For the truly ambitious there’s also opt-in semantic search:
(setopt copilot-chat-enable-semantic-search t)
Flip that on and the server builds an embeddings index of your workspace, so you can ask whole-codebase questions instead of pointing at specific files. It’s off by default, since indexing isn’t free, but it’s there when you want it.
MCP Support
Model Context Protocol is how you give an
assistant extra superpowers, and copilot.el now speaks it. Point
copilot-mcp-servers at the servers you want and their tools show up in chat,
right alongside the built-in ones:
(setopt copilot-mcp-servers
'(:fetch (:command "uvx" :args ["mcp-server-fetch"])
:memory (:command "npx"
:args ["-y" "@modelcontextprotocol/server-memory"])))
M-x copilot-chat-list-mcp-tools shows you which servers connected and what
they offer (and complains loudly when one fails to start, which beats the old
silent treatment).
A Chat You Can Actually Use
The chat buffer grew up too. A few of the quality-of-life additions:
- Slash commands (
C-c /) –/explain,/fix,/tests,/doc, and friends, fetched live from the server. - Acting on code blocks –
C-c C-iinserts the code block at point into your source buffer,C-c M-wcopies it to the kill ring. No more copy-paste gymnastics out of a read-only buffer. - Attaching context –
copilot-chat-add-file-reference(C-c C-f) andcopilot-chat-add-region-referencelet you hand Copilot specific files or selections along with your question.
Odds and Ends
A grab bag of smaller, but handy, additions:
M-x copilot-quotashows how much of your chat, completion, and premium-request allowance is left – useful now that the fancy models eat into a quota.- Copilot will tell you when a suggestion closely matches public code and
collect those matches, with their licenses and reference URLs, in a buffer you
can open via
M-x copilot-list-code-citations. - A pile of bug fixes, including agent-mode tool confirmations that were flat-out broken against newer servers, and chat finally picking a sensible default model on its own.
As always, see the full changelog for the complete rundown.
Epilogue
Agent mode, MCP, and semantic search are all opt-in, so nothing here changes your setup unless you ask for it. But I’d love for you to ask for it! Turn on agent mode, point it at a real task, and tell me where it shines and where it falls on its face. This kind of feature only gets good with people kicking the tires and filing detailed reports, so please do open issues and let me know how it goes. Your feedback is what shapes the next release.
I’d be remiss not to acknowledge it: there’s a decent chance that by now half of you have wandered off to Claude Code or some other agentic CLI, and that pouring this much time and energy into Copilot support for Emacs is, objectively, a questionable use of a human life. Fair enough.
But here’s the thing – Emacs has always excelled at providing amazing support for niche technologies long after the rest of the world has moved on. We’re the people who’ll lovingly maintain a mode for a language nobody has written any code in since 2003. Keeping Copilot first-class in Emacs is squarely in that grand tradition, and I, for one, intend to see it through. :-)
That’s all I have for you today. Keep hacking!