ECA (Editor Code Assistant) Emacs is an AI-powered pair-programming client for Emacs.
Inspired by lsp-mode’s JSONRPC handling, it connects to an external eca
server process to provide interactive chat, code suggestions, context management and more.
For more details about ECA, check ECA server.
- Emacs 28.1 or later
- Custom
eca
server binary, it's automatically downloaded ifeca-custom-command
isnil
- Place it on your
$PATH
or customizeeca-custom-command
- Place it on your
- whisper.el for Speech-to-Text support (optional)
M-x package-install eca
(package! eca :recipe (:host github :repo "editor-code-assistant/eca-emacs" :files ("*.el")))
- Run
M-x eca
to start the eca process and initialize the workspace.
- eca-emacs will check for
eca-custom-command
; - if not set, will check for a
eca
on$PATH
; - if not found, will download
eca
automatically and cache it.
- The dedicated chat window
<eca-chat>
pops up. - Type your prompt after the
>
and press RET. - Attach more context auto completing after the
@
.
If you have whisper.el installed you can use the eca-chat-talk
command (or use the C-t
keybinding) to talk to the Editor Code
Assistant. This will record audio until you press RET
. Then, the
recorded audio will be transcribed to text and placed into the chat
buffer.
We recommend to use the small
, it is a good trade-off between
accuracy and transcription speed.
(use-package whisper
:custom
(whisper-model "small"))
Calling M-x eca
with prefix C-u
will ask for what workspaces to start the process.
eca-chat-add-context-at-point
: Add the current function or selected lines to chat as context.eca-chat-add-file-context
: Add the current file to chat as context.
eca-extra-args
: customize extra args to server to help debug like("--verbose")
or("--log-level" "debug")
.eca-chat-usage-string-format
: to customize what shows on mode-line for usage like costs and tokens.eca-chat-position-params
: customize the chat window.
Feature | key |
---|---|
Chat: clear | C-c C-l |
Chat: reset | C-c C-k |
Chat: talk | C-c C-t |
Chat: prev prompt history | C-↑ |
Chat: next prompt history | C-↓ |
Chat: go to prev block | C-c ↑ |
Chat: go to next block | C-c ↓ |
Chat: go to prev user msg | C-c C-↑ |
Chat: go to next user msg | C-c C-↓ |
Chat: toggle expandable content | C-c Tab |
When launching Emacs from a GUI application (Dock, Applications folder, or desktop environment), it doesn't inherit environment variables from your shell configuration files (.zshrc
, .bashrc
, etc.). Since the ECA server is started as a subprocess from Emacs, it inherits Emacs' environment, which may be missing your API keys and other configuration.
- ECA fails to start with authentication errors
- Missing API keys for OpenAI, Anthropic, or other providers
- Custom configuration variables not found
Install and configure exec-path-from-shell
to import your shell environment into Emacs:
(use-package exec-path-from-shell
:init
;; Specify the environment variables ECA needs
(setq exec-path-from-shell-variables
'("ANTHROPIC_API_KEY"
"OPENAI_API_KEY"
"OLLAMA_API_BASE"
"OPENAI_API_URL"
"ANTHROPIC_API_URL"
"ECA_CONFIG"
"XDG_CONFIG_HOME"
"PATH"
"MANPATH"))
;; For macOS and Linux GUI environments
(when (memq window-system '(mac ns x))
(exec-path-from-shell-initialize)))
-
Launch Emacs from Terminal: Start Emacs from your shell where environment variables are already loaded:
emacs &
-
Manual Environment Setup: Set variables directly in your Emacs configuration:
(setenv "ANTHROPIC_API_KEY" "your-key-here") (setenv "OPENAI_API_KEY" "your-key-here")
-
System-wide Environment: On macOS, you can set environment variables system-wide using
launchctl
:launchctl setenv ANTHROPIC_API_KEY "your-key-here"
-
Check ECA installation: Verify ECA is available on your PATH or set
eca-custom-command
:(setq eca-custom-command "/path/to/your/eca/binary")
-
Enable debug logging: Add extra arguments for debugging:
(setq eca-extra-args '("--verbose" "--log-level" "debug"))
-
Check environment variables: Test if your API keys are available in Emacs:
M-x eval-expression RET (getenv "ANTHROPIC_API_KEY") RET
- Ensure
OPENAI_API_KEY
is set in your environment - For custom endpoints, set
OPENAI_API_URL
- Ensure
ANTHROPIC_API_KEY
is set in your environment - For custom endpoints, set
ANTHROPIC_API_URL
- Ensure Ollama is running locally
- Set
OLLAMA_API_BASE
if using a custom endpoint - Use the
ollama/
prefix for model names (e.g.,ollama/llama2
)
-
Verify environment: Check what environment variables are available to Emacs:
M-x eval-expression RET process-environment RET
-
Test ECA manually: Try running ECA from terminal to verify it works:
eca --help
-
Reset ECA: Clear the workspace and restart:
M-x eca-chat-reset M-x eca ; Start fresh
Contributions are very welcome, please open a issue for discussion or pull request.