pi-vimmode
Vim mode for Pi coding agent
Package details
Install pi-vimmode from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-vimmode- Package
pi-vimmode- Version
0.0.5- Published
- Jun 5, 2026
- Downloads
- not available
- Author
- pekochan069
- License
- MIT
- Types
- extension
- Size
- 196.7 KB
- Dependencies
- 0 dependencies · 2 peers
Pi manifest JSON
{
"extensions": [
"./index.js"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-vimmode
Vim-style prompt editing for Pi.
pi-vimmode replaces Pi's main input editor with a CustomEditor-based modal editor. It targets practical prompt editing for agent prompts, not full Vim parity.
Install / load
Install from npm:
pi install npm:pi-vimmode
or Install from Git to install latest version:
pi install git:https://github.com/pekochan069/pi-vimmode
For local development from this checkout:
bun install
Pi discovers the extension through package.json:
{
"pi": {
"extensions": ["./index.ts"]
}
}
For local testing, load this package as a Pi extension using Pi's normal extension loading flow.
Quick start
- Start Pi with the extension loaded.
- Type normally in insert mode.
- Press
Escto enter normal mode when autocomplete is inactive. - Use supported Vim commands such as
h,j,k,l,w,b,e,0,$,i,a,x,dd,cw,p,/,n,N,v,V,Ctrl-v,:s,:d,:y,:pu,:t,:m,:j,:noh,q,@, and@@. - Press
i,a,I,A,o,O,C,s, orSto return to insert mode after edits; use operator forms such ascw,cc, orc$when changing by motion.
Default modes:
- INSERT: Pi-like text entry. Autocomplete, submit, newlines, image paste, external editor, and app shortcuts use Pi's default behavior.
- NORMAL: supported Vim command mode. Unsupported printable keys are ignored.
- VISUAL: characterwise selection.
- V-LINE: linewise selection.
- V-BLOCK: rectangular block selection.
Esc in normal mode delegates to Pi so interrupt/abort behavior still works. Esc in visual modes cancels the selection and returns to normal mode.
Documentation
Canonical user-facing docs live under docs/:
docs/features.md: supported modes, motions, edits, operators, prompt-native text objects, prompt transforms, character search, prompt search, visual modes, Ex command-line commands, registers, marks, macros, UI/status rendering, Pi shortcut compatibility, limitations, recovery, and validation examples.docs/settings.md: every supportedpiVimModesetting, defaults, accepted value shapes, merge behavior, key sequence syntax, protected-key validation, warnings, troubleshooting, and practical config examples.docs/adr/0002-user-facing-pi-vimmode-docs.md: documentation source-of-truth decision and maintenance rules.
README is the quickstart and index. Keep detailed behavior and settings reference in the canonical docs above.
Common configuration
Minimal startup override:
{
"piVimMode": {
"startMode": "normal"
}
}
Example keymap/UI override:
{
"piVimMode": {
"cursor": {
"normal": "block",
"insert": "bar"
},
"keymap": {
"commands": {
"startSearch": ["/"]
}
},
"ui": {
"status": {
"items": ["mode", "pending", "search", "macro", "cursorPosition", "warnings"]
}
}
}
}
See docs/settings.md for the full default reference and all settings.
Recover or disable
If the extension blocks editing or configuration goes wrong:
- Run
/vimmode offto restore Pi's previous editor for the current extension runtime. - Run
/vimmode onor/vimmodeto enable the Vim editor again. - Start with
docs/features.md#disable-or-recover. - Use
pi listto inspect installed extensions. - Use
pi removeorpi uninstallwith the installed extension identifier to remove it. - Use
pi configor edit Pi config files to removepiVimModeoverrides. - Restart Pi after changing extension or config state.
Architecture
VimEditor is the Pi adapter shell. It owns CustomEditor integration, snapshots, effect application, rendering bridge, public cursor restoration, and best-effort terminal cursor writes.
Modal editing behavior lives under src/modal/:
engine.tsowns mode transitions, finite semantic key dispatch, register updates, and supported Vim semantics.types.tsdefines adapter-applied effects such as delegation, edits, macro replay, cursor restoration, invalidation, and terminal cursor hints.view.tsderives mode labels, status items, visual status text, and cursor position text without needing Pi TUI objects.
The parser in src/commands.ts and text transforms in src/buffer.ts remain pure helpers. Config maps keys to supported semantic actions; it does not add private Pi APIs, recursive mappings, .vimrc, Vimscript, or Neovim Lua support.
Project docs
docs/features.md: canonical feature guide.docs/settings.md: canonical settings reference.docs/adr/: documentation and architecture decisions.docs/plans/: implementation plans for Vim editor work.docs/solutions/: reusable learnings for parser, buffer, lifecycle, and visual-mode bugs.openspec/specs/: durable OpenSpec requirements for supported Vim behavior.
Validate
bun test
bun run check-types
bun run lint
bun run format:check
Manual smoke checklist:
- Load extension in Pi.
- Type text in insert mode.
- Press
Esc, use normal-mode motions and edits. - Use
v,V, andCtrl-v; confirm visual highlighting and selection operations. - Configure
piVimMode.startMode,piVimMode.cursor, a keymap binding, and UI status items; confirm behavior changes. - Confirm insert/normal submit and normal-mode
Escstill delegate to Pi where expected. - Record and replay a macro with
q{slot},@{slot}, and@@. - Run
/query,n,N,:%s/old/new/g,:2,3copy$,:move0, and:noh; confirm prompt-local search/Ex behavior.