@hnnazm/pi-vi

GNU Readline vi-mode prompt editor extension for Pi

Packages

Package details

extension

Install @hnnazm/pi-vi from npm and Pi will load the resources declared by the package manifest.

$ pi install npm:@hnnazm/pi-vi
Package
@hnnazm/pi-vi
Version
0.1.3
Published
Sep 16, 2026
Downloads
447/mo · 369/wk
Author
hnnazm
License
MIT
Types
extension
Size
121.4 KB
Dependencies
0 dependencies · 2 peers
Pi manifest JSON
{
  "extensions": [
    "./src/index.ts"
  ]
}

Security note

Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.

README

Pi Vi

GNU Readline-style vi-mode prompt editing for Pi.

The extension preserves Pi's prompt editor, autocomplete, paste handling, and application actions while adding command, insert, and replace modes. It ships a Bash 5 / Readline 8 profile and resolves user bindings through Bash when $INPUTRC or ~/.inputrc exists.

Install

Install the published package:

pi install npm:@hnnazm/pi-vi

Or run/install from a checkout:

npm ci
npm run check
pi -e "$PWD/src/index.ts" # temporary smoke test
pi install "$PWD"         # persistent local package

Rollback with the same source used to install:

pi remove npm:@hnnazm/pi-vi
# or: pi remove "$PWD"

You can also disable the package interactively with pi config.

The prompt border shows INSERT, COMMAND, or REPLACE. Press Escape to enter command mode.

Implemented command-mode editing

  • Motions: h, l, 0, ^, $, w, W, b, B, e, E, f, F, t, T, ;, ,, %
  • Modes: i, I, a, A, R
  • Operators: d, c, y with character, word, search, delimiter, and line motions
  • Direct edits: x, X, s, S, r, ~, D, C, Y, p, P
  • State: u, Ctrl-_, U, ., marks via m, `, and '
  • History: k, j, -, +, Ctrl-P, Ctrl-N, /, ?, n, N
  • External editing: v delegates to Pi's app.editor.external action and therefore honors Pi's $VISUAL/$EDITOR behavior

Numeric counts are accepted before motions and editing commands.

Inputrc

The extension checks $INPUTRC first, then ~/.inputrc. If present, Bash resolves includes, conditionals, variables, and macros and emits canonical keymaps. Paths are passed as process arguments rather than interpolated into shell source. If loading fails, the extension warns and falls back to the bundled profile.

Inputrc bind -x shell-command bindings are never executed by default.

Development

npm run format
npm run lint
npm run typecheck
npm run test:unit
npm run test:integration
npm run check

Capture the default profile for a Bash executable (profile directories use major versions only):

READLINE_BASH=/opt/homebrew/bin/bash READLINE_VERSION=8.3.3 npm run capture:profile
npm run compatibility:report

See COMPATIBILITY.md for implementation and profile details.