# Pi Vi

GNU Readline-style vi-mode prompt editing for [Pi](https://pi.dev).

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:

```bash
pi install npm:@hnnazm/pi-vi
```

Or run/install from a checkout:

```bash
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:

```bash
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: `Ctrl-P`, `Ctrl-N`, `/`, `?`, `n`, `N`; in multiline command-mode prompts, `j` and `k` move between logical lines
- 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

```bash
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):

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

See [`COMPATIBILITY.md`](./COMPATIBILITY.md) for implementation and profile details.
