pi-nvim
Bridge between pi coding agent and Neovim
Package details
Install pi-nvim from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-nvim- Package
pi-nvim- Version
0.2.0- Published
- Mar 20, 2026
- Downloads
- 196/mo · 53/wk
- Author
- chrisarderne
- License
- MIT
- Types
- extension
- Size
- 9.8 KB
- Dependencies
- 0 dependencies · 1 peer
Pi manifest JSON
{
"extensions": [
"./extension.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-nvim
Bridge between pi coding agent and Neovim. Run pi in one terminal pane and Neovim in another — send files, selections, and prompts from Neovim directly into your running pi session.

How it works
The repo contains two components:
- Pi extension (
extension.ts) — opens a unix socket when pi starts. External tools can send JSON messages to inject prompts into the active pi session. - Neovim plugin (
lua/pi-nvim/) — connects to that socket via libuv. Sends context from your editor to pi.
Discovery is automatic: the extension writes socket info to /tmp/pi-nvim-sockets/, and the Neovim plugin scans that directory, preferring sessions matching your cwd.
Install
Pi side
pi install npm:pi-nvim
Or add to ~/.pi/agent/settings.json:
{
"packages": ["https://github.com/carderne/pi-nvim"]
}
Then /reload in pi.
Neovim side
With lazy.nvim:
{ "carderne/pi-nvim" }
Then in your config:
require("pi-nvim").setup()
Usage
Start pi in one terminal. Start Neovim in another. The pi extension automatically opens a socket on session start.
Commands
| Command | Description |
|---|---|
:Pi |
Open the Send to pi dialog (works in normal and visual mode) |
:PiSend |
Type a prompt and send to pi |
:PiSendFile |
Send current file path + prompt |
:PiSendSelection |
Send visual selection + prompt |
:PiSendBuffer |
Send entire buffer + prompt |
:PiPing |
Check if pi is reachable |
:PiSessions |
List/switch between running pi sessions |
Default keybindings
<leader>p is mapped to :Pi in both normal and visual mode by default.
The :Pi dialog
Opens a floating window in the center of the screen:
- Shows the current file name (always sent)
- If you had a visual selection, it shows the line range and sends the selected text
- If no selection, you can press Tab to toggle sending the entire buffer
- Type a prompt and press Enter to send (or just Enter with no prompt)
- Press Esc or Ctrl-C to cancel
Additional keybindings
vim.keymap.set("n", "<leader>pp", ":PiSend<CR>")
vim.keymap.set("n", "<leader>pf", ":PiSendFile<CR>")
vim.keymap.set("v", "<leader>ps", ":PiSendSelection<CR>")
vim.keymap.set("n", "<leader>pb", ":PiSendBuffer<CR>")
vim.keymap.set("n", "<leader>pi", ":PiPing<CR>")
Protocol
The socket accepts newline-delimited JSON:
{"type": "prompt", "message": "your prompt here"}
{"type": "ping"}
Responses:
{"ok": true}
{"ok": true, "type": "pong"}
{"ok": false, "error": "..."}
This means you can also send prompts from any tool:
echo '{"type":"prompt","message":"hello"}' | socat - UNIX-CONNECT:/tmp/pi-nvim-sockets/<hash>.sock
License
MIT