Vim-pi-chat: make Vim a pi-powered editor Developer galeone released vim-pi-chat, a Vim 9 plugin that embeds the pi coding agent in a chat window by spawning `pi --mode rpc` as a background job over a strict JSON-lines protocol. The plugin requires Vim 9.0+ compiled with `+job +channel` and the pi CLI on `$PATH`, and does not support Neovim because it is built on Vim's job/channel API. It renders `text_delta` output incrementally, shows tool calls as `⚙ …`/`✓ …`/`✗ …` lines with syntax-highlighted diff previews for `edit` and `write`, and answers extension UI requests such as `notify`, `confirm`, `select` and `input` through native Vim prompts. A chat window for the pi coding agent https://github.com/earendil-works/pi inside Vim 9 no GUI, no Node.js runtime needed by Vim itself — it just speaks to the pi CLI . Neovim is not supported: the plugin is built on Vim's job/channel API. ┌────────────────────────────────────────────┬─────────────────────────────┐ │ │ ── pi chat ── │ │ your code in the main window │ Type at the bottom line │ │ │ ... │ │ │ ❯ fix the failing test │ │ │ ⚙ bash npm test │ │ │ ✓ bash │ │ │ The test failed on line 42 │ │ │ because... │ │ │ ────────────────────────── │ └────────────────────────────────────────────┴─────────────────────────────┘ The plugin spawns pi --mode rpc as a background job job start / ch sendraw . RPC mode is a strict JSON-lines protocol over stdin/stdout see pi's docs/rpc.md : commands go in as one JSON object per line, events come back as one JSON object per line. The plugin: - buffers stdout lines and drains them on a timer start tick, so output never interrupts you mid-keystroke; - renders text delta deltas incrementally line-buffered , tool executions as ⚙ … / ✓ … / ✗ … lines, and your prompts as ❯ … ; edit and write tool calls additionally get a syntax-highlighted diff preview in the same format as pi's TUI g:pi chat tool diff , and other tools show the first lines of their output under the ✓ line │ … , g:pi chat tool output ; a failed tool always shows its error output ; - answers extension UI requests: notify renders as an in-chat transcript line with a level marker ℹ/⚠/⛔ , and confirm / select / input use native Vim prompts showing the request's title and message. Esc always sends a cancellation never a choice: Esc on "Allow dangerous command?" does not allow it , and an input placeholder is shown as a hint, not pre-filled. setStatus entries show in the chat statusline, set editor text prefills the ❯ prompt once the turn ends, if pi is busy , and setWidget / setTitle are ignored. editor requests are answered as cancelled see Limitations . The conversation buffer is a plain text buffer. Everything is the transcript except the ❯ prompt block at the bottom: type there,