Skip to content

Prompt and transcript

A session buffer has the transcript at the top, the prompt region below a divider, and a footer. In the transcript, which is read-only, single keys run commands. In the prompt region, keys type as usual, and commands are on C-c C- keys.

Key Action
C-c C-c Send the prompt
RET Insert a newline (sends instead when ecc-chat-return-sends is on)
S-RET, C-j Insert a newline
TAB Complete a slash command or an @ reference
C-c C-k Clear the prompt region
C-k, C-a, C-e Kill to the end of, or move along, the visual line
M-p / M-n, C-<up> / C-<down> Previous / next prompt from the history
C-c C-r Choose a past prompt and insert it at point
C-c C-s Take the CLI’s suggested prompt
C-c C-z Interrupt the running turn
C-c C-q List the queued prompts
C-c C-a / C-c C-d Allow or deny a request
C-c C-x Turn editor context on or off
C-c C-i Insert an image
C-c C-y Paste the image on the clipboard
C-c C-b Show the /btw side questions
C-c C-n / C-c C-p Next / previous turn
C-c C-t Switch the window to another session
C-c C-e Export the conversation as Markdown
S-TAB Cycle the permission mode
C-c ? Open the menu

Every session shares one prompt history. M-p replaces the whole prompt; C-c C-r inserts the prompt you choose at point. To keep the history across restarts, turn on savehist-mode and add this to your init:

(add-to-list 'savehist-additional-variables 'ecc-prompt-history)

A prompt sent while Claude is working waits in a queue, as does a turn started by Remote Control. The waiting prompts appear above the divider. C-c C-q, or RET on them or clicking them, opens the list, where RET takes a prompt back into the prompt region to edit, d drops it and M-<up> / M-<down> move it. The footer shows the permission mode and the model.

With ecc-prompt-suggestions-enabled on, the CLI may suggest a next prompt after a turn. It appears in the empty prompt region as ghost text, and C-c C-s takes it as a draft. Not every model suggests.

The slash command list open over a session, each command with the description the CLI gave it

/ at the start of an empty prompt lists the commands, each with the CLI’s description; TAB completes them anywhere in the prompt. /model, /effort, /permissions, /config and /btw ask for their argument first. Commands that only work in a terminal are not listed, but typing one in full still runs it.

Emacs handles these itself, and they never reach the model: /btw, /hooks, /plugins, /login, /logout, /auth-status and /resume.

/btw <question> asks a side question in a separate, tool-less CLI that knows the conversation so far. The running turn goes on, and neither the question nor the answer goes into the transcript or the recording.

C-c C-b lists the session’s side questions: a asks another, c copies the answer, k cancels one in flight, x clears the list, q closes it. A follow-up carries only the last few exchanges (ecc-btw-history-limit). ecc-btw-display puts the answer in a window or a posframe popup.

/resume asks which recorded conversation of this project to continue and switches this window to it; the window, tab, buffer and session name stay. /resume <session-id> goes straight to one. Emacs stops the running process first, so that two processes never write one recording, and asks before leaving a conversation that has turns or queued prompts. The conversation you leave stays on disk.

C-c C-y pastes the image on the clipboard; M-x yank-media does the same. An image can also be dropped into the buffer or inserted from a file with C-c C-i. All of them are saved under ecc-image-dir and sent to the CLI as paths. A pasted image of a type the API does not take is converted to PNG with sips, which comes with macOS; without sips it is saved as it came, and the API may not accept it. ecc-image-cleanup decides whether they are deleted when the session ends.

The transcript shows images under the prompt or the call they came with. I stops or starts a GIF, a video shows its first frame when ffmpeg is on PATH, and RET opens the file. ecc-image-inline (I in the menu) shows only the line naming each file.

A ```mermaid block in a reply is shown as its diagram when mermaid-cli (mmdc) is on PATH. The block appears as code first, and the diagram replaces it a moment later. I on a diagram shows its source, and I again shows the diagram. Search and copy work on the source either way. A block mmdc cannot draw stays code, and hovering over it shows the error. I on it tries again, after you have fixed the cause.

Install mermaid-cli with npm install -g --allow-scripts=puppeteer @mermaid-js/mermaid-cli. Without --allow-scripts, npm may skip downloading the browser mmdc draws with. (setq ecc-mermaid-command nil) turns the diagrams off, and so does turning off ecc-image-inline.

The transcript is ordinary read-only text, so isearch, occur, narrowing and M-w work in it.

Key Action
TAB Fold or unfold the node at point
1–4 Unfold the tree to that depth
+ / - Unfold or fold everything
n / p Next / previous heading
M-n / M-p Next / previous sibling
^ Up to the parent heading
] / [ Next / previous block
T Jump to a turn by its prompt
F / P Jump to the Files section / the plan
SPC / DEL Scroll down / up
v / i Go to the prompt region
RET Open what is at point: a link, a source line, a subagent’s transcript, or the full tool result. A click opens a link, a path in Claude’s reply or a picture
o Show the whole node: input, diff and result
w Copy the code block at point, or the whole response
I Show the diagram at point as its source and back, or stop or start the GIF at point
a / d Allow / deny the request (d elsewhere shows the diff)
g Redraw the transcript
L Show the protocol log
t / R Hand over to the terminal / restart the session, or resume a stopped one
C-c C-k Clear the prompt region
S-TAB Cycle the permission mode
q Bury the buffer
? Open the menu

On a request waiting for an answer, more keys apply: see Permissions and plans.

RET on code in the transcript opens the file beside the session at that line.

Point on Opens
A diff line of an edit or a Bash command That line; a removed line opens where it was
The Updated/Created/Deleted line over a Bash command’s diff The first changed line of that file
The heading of a tool call that names a file The line Read started at, or the first changed line
A diff line in the Files section or a permission request That line
A path in Claude’s reply (foo.el:12, a/b.el, x.el#L3) The file at that line

The line number follows later changes the session made to the same file, so the file opens where the line is now. A video or sound file opens in the system’s player. A path that is not there as written, such as a name without its directory, opens the file of that name in the project; when there are several, you choose one, and the session remembers the choice; C-u RET chooses again. A file that is not in the project is searched for on the whole machine after asking; ecc-visit-search-machine set to 'always or 'never answers for you. Paths inside fenced code blocks are not links; (setq ecc-markdown-linkify-paths nil) turns path links off. On a heading without a file, RET shows the full tool result.

The bottom of the transcript lists the files the session touched: the path, the reads, edits and writes (R×n, E×n, W×n), and the lines changed (+n −n). F jumps there. On a file, TAB unfolds its diff, RET opens it, and d reviews it alone. (setq ecc-render-summary-position 'top) puts the section at the top.

T lists the turns by their prompts and jumps to the one you choose. C-c C-n and C-c C-p step through them.

The turn picker, listing the turns of the session by their prompts