Get neosh

Keys

The short version of every binding that ships. ^Z lists the live registry, and every key here is an ordinary binding your init.ts can move.

Every default is a key your terminal already sends: Ctrl with a letter, ⇧⇥, , , Esc. Arrows and PgUp/PgDn work wherever they mean something and are never the only way to do anything.

Chat

KeyDoes
Send. While a turn runs, steer it
⇧⏎Newline, so a pasted snippet stays one message
EscInterrupt the turn. The conversation survives it
^PPick a model, mid turn too
^EEvery option this model has, applied as you move
⇧⇥Permission mode for this conversation
^NNew conversation, with a choice of where
^TProjects and conversations
^KCommand palette
^SRead the transcript in normal mode
^VAttach the image on the clipboard
^GGit status
^DShow what changed
^LWhat the plan has left
^BToggle the sidebar
^FThe archive
^JThe computers in this workspace
^RReload configuration
^QClose this terminal. Everything keeps running
^ZEvery binding, live

/ completes a command by name. Dragging an image onto the terminal attaches it.

Reading the transcript

^S puts the transcript in normal mode. The motions are Vim’s and take counts: 5j, 12G, ^D, w, f, / and n, v to select, text objects like iw and i(. Nothing edits; the transcript is an artefact you take pieces out of.

The copies specific to a transcript:

KeyCopies
yThe selection
ycThe code block the cursor is in, without its indent
ymThe whole turn, question and answer
ypThis conversation’s directory
yaThe entire transcript

[ and ] jump by turn, c and C by tool call, and the card the cursor is in opens itself. ^S again, or i, goes back to the composer.

The project panel

^T, then Vim motions with counts. opens, n starts a conversation in the project under the cursor, r renames, f pins, x archives, X deletes, y copies the row’s directory. ? shows the keys for the row you are on.

Answering a question

When an agent asks you something, a panel opens over the composer. takes the option under the cursor, 1 to 9 jump to one, ticks on a multi-select, and typing is answering: your text goes into the composer and is sent instead. Esc tells the agent nobody answered, which it can act on.

Rebinding

Every key is a binding to a command name in one table:

await neosh.keymap.set("chat", "<C-l>", "chat.clear");
await neosh.keymap.del("chat", "<C-o>");

The full table lives in AGENTS.md in the repository.