pi-nvim

Bridge between pi coding agent and Neovim

Package details

extension

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.

demo

How it works

The repo contains two components:

  1. 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.
  2. 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