# npm
npm i -g @leohenon/ocv
# Homebrew
brew install leohenon/tap/ocv
# curl
curl -fsSL https://raw.githubusercontent.com/leohenon/opencode-vim/ocv/install.sh | sudo shocv# npm
npm i -g @leohenon/ocv@latest
# Homebrew
brew upgrade ocv
# built-in updater
ocv updateToggle via command palette (Ctrl+p -> Toggle vim mode).
Unicode word boundaries are not supported.
| Category | Keys |
|---|---|
| Character / word | h, j, k, l, w, b, e, W, B, E |
| Line / buffer | 0, ^, _, $, gg, G |
| Matching / paragraph | %, {, } |
| Find / till | f, F, t, T, ;, , |
| Scroll | Ctrl+e, Ctrl+y, Ctrl+d, Ctrl+u, Ctrl+f, Ctrl+b |
| Insert / replace | i, I, a, A, o, O, R |
| Character / line edit | r, x, ~, s, S, J, C, dd, cc |
| Word changes | cw, cb, ciw, caw, ciW, caW |
| Word deletes | dw, db, diw, daw, diW, daW |
| Quote changes | ci", ca", ci', ca', ci` , ca` |
| Quote deletes | di", da", di', da', di` , da` |
| Bracket changes | ci(, ca(, ci[, ca[, ci{, ca{, ci<, ca< |
| Bracket deletes | di(, da(, di[, da[, di{, da{, di<, da< |
| Find / till operators | cf, cF, ct, cT, df, dF, dt, dT |
| Matching / paragraph operators | c%, d%, c}, c{, d}, d{ |
| Line / word yanks | yy, yw, yiw, yaw, yiW, yaW |
| Quote yanks | yi", ya", yi', ya', yi` , ya` |
| Bracket yanks | yi(, ya(, yi[, ya[, yi{, ya{, yi<, ya< |
| Matching / paragraph yanks | y%, y}, y{ |
| Put / undo / repeat | p, P, u, Ctrl+r, . |
| Visual selection | v, V |
Note
<leader>y copies the prompt selection when present; configure it with keybinds.prompt_copy_selection.
For clipboard sync, see System clipboard register.
Claude subscriptions built-in with /connect. No plugins or configuration needed.
Text selection from the chat session view.
Copy mode collapses code diffs into a single column for easy copying.
- Enter copy mode with
<leader>vorCtrl+W k. - Navigate with
hjklor arrow keys (LeftDownUpRight). - Press
v/Vto start character-wise or line-wise selection. y/yyyanks to the vim register.Entercopies to the system clipboard.Yyanks to the vim register and scrolls to the bottom.Shift+Entercopies to the system clipboard and scrolls to the bottom.Escapeexits visual mode,qexits copy mode and scrolls to the bottom.Ctrl+W jexits copy mode without scrolling;Ctrl+W wtoggles copy mode.ifocuses the prompt input in insert mode without scrolling.zztzzzbadjust copy-mode scroll positioning.H/M/Ljump to the top / middle / bottom of the viewport.
Tip
Configure the entry key with keybinds.copy_mode.
Prompt input height is configurable with prompt_max_height in tui.json.
A scrollbar appears when the prompt exceeds the visible area. gg / G focus the prompt input when typing.
{
"prompt_max_height": 35,
"prompt_scrollbar": true
}Note: Setting
prompt_max_heightabove40is not recommended.
Hides extra UI hints and tips.
| Default | Minimal |
|---|---|
![]() |
![]() |
Toggle via command palette (Ctrl+p -> Toggle minimal ui).
By default, vim insert mode keeps Enter for newlines and normal mode uses Enter to submit. If you want Enter to submit from insert mode too, add this to tui.json:
{
"vim_enter_submit": true
}When vim_enter_submit is enabled, line returns are still available through input_newline.
{
"keybinds": {
"input_newline": "alt+return"
}
}If you keep vim_enter_submit disabled but want a separate submit key that works from insert mode, configure input_force_submit:
{
"keybinds": {
"input_force_submit": "alt+return"
}
}By default, input_force_submit is unbound.
By default, vim mode uses an internal register for y and p. If you want yank and paste to use the system clipboard instead, add this to tui.json:
{
"vim_system_clipboard_register": true
}With this enabled, yank operations sync to the system clipboard and p / P paste from it.
Note
Terminal/OS clipboard shortcuts don’t preserve Vim linewise register state. External clipboard text is pasted as characterwise text.
Have a suggestion? Open an issue.
Thanks to everyone who contributed.




