[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81302":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":31,"readmeContent":32,"aiSummary":33,"trendingCount":16,"starSnapshotCount":16,"syncStatus":34,"lastSyncTime":35,"discoverSource":36},81302,"vimcode","oribarilan\u002Fvimcode","oribarilan","Vim for OpenCode.","",null,"TypeScript",85,4,46,7,0,1,6,39,5,51,"MIT License",false,"main",true,[27,28,29,30],"harness","opencode","opencode-plugin","vim","2026-06-11 04:07:24","\u003Ch1 align=\"center\">vimcode\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\u003Cstrong>Vim keybindings for the \u003Ca href=\"https:\u002F\u002Fopencode.ai\">OpenCode\u003C\u002Fa> prompt.\u003C\u002Fstrong>\u003C\u002Fp>\n\n\u003Cp align=\"center\">\u003Cem>Experimental. Things will break.\u003C\u002Fem>\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cvideo src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fd0afa749-96c2-4f1c-adcb-5ab388d5798e\" width=\"800\" controls>\u003C\u002Fvideo>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"#install\">Install\u003C\u002Fa> ·\n  \u003Ca href=\"#configuration\">Configuration\u003C\u002Fa> ·\n  \u003Ca href=\"#what-it-does\">What it does\u003C\u002Fa> ·\n  \u003Ca href=\"#keybindings\">Keybindings\u003C\u002Fa> ·\n  \u003Ca href=\"#known-gaps\">Known gaps\u003C\u002Fa> ·\n  \u003Ca href=\"#how-it-works\">How it works\u003C\u002Fa> ·\n  \u003Ca href=\"#contributing\">Contributing\u003C\u002Fa>\n\u003C\u002Fp>\n\n---\n\n## Install\n\nAdd to your `tui.json` (or `.opencode\u002Ftui.json`):\n\n```json\n{\n  \"plugin\": [\"vimcode@git+https:\u002F\u002Fgithub.com\u002Foribarilan\u002Fvimcode.git#v0.9.0\"]\n}\n```\n\nTo upgrade, change the version tag and restart OpenCode. You'll see a toast when a newer version is available.\n\n## Configuration\n\nTo pass options, use the tuple form in `tui.json`:\n\n```json\n{\n  \"plugin\": [[\"vimcode@git+https:\u002F\u002Fgithub.com\u002Foribarilan\u002Fvimcode.git#v0.9.0\", { \"updateCheck\": false }]]\n}\n```\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `updateCheck` | `boolean` | `true` | On startup, check GitHub for new versions (at most once per day). This is the only network request vimcode makes. Set to `false` to disable. |\n| `modeToast` | `boolean` | `true` | Show a brief toast (\"NORMAL\" \u002F \"INSERT\" \u002F \"VISUAL\") on mode switches. Set to `false` to rely on cursor shape alone. |\n| `startMode` | `\"insert\"` \\| `\"normal\"` | `\"insert\"` | Which mode to start in when OpenCode launches. |\n\n## What it does\n\nAdds normal\u002Finsert mode to OpenCode's prompt input. Escape enters normal mode, `i` goes back to insert. A brief toast shows the current mode on each switch (configurable).\n\nIn insert mode, typing works normally. Enter adds a newline, Ctrl+Enter submits. The file picker and autocomplete keep working: Enter picks the selected item, Escape closes the picker without leaving insert.\n\nIn normal mode, keys are vim commands. Unrecognized keys get swallowed so you don't accidentally type into the prompt. `:` opens the command palette.\n\n### Overlay passthrough\n\nWhen OpenCode shows its own UI (command palette, `\u002Fsessions`, the `@` file picker, question prompts, permission prompts) vimcode steps aside. All keys pass through to the overlay until it closes.\n\n### Escape behavior\n\nFirst Escape in insert mode switches to normal - it won't trigger OpenCode's double-escape interrupt. So canceling a running response from insert mode takes 3 escapes: one for normal, two more for the interrupt.\n\n### Platform notes\n\nClipboard (`y`, `yy`, `p`) uses the system clipboard: `pbcopy` on macOS, `clip.exe` on Windows, `xclip` on Linux. Linux users need `xclip` installed (`apt install xclip` or equivalent). If the clipboard tool is missing, yank\u002Fpaste still works within the session via an internal register.\n\nCursor shape (block in normal, bar in insert) needs a terminal that supports DECSCUSR escape sequences. Most modern terminals do: iTerm2, Ghostty, Alacritty, Windows Terminal, Kitty. Older macOS Terminal.app may not respond.\n\nThe plugin checks GitHub for new versions once per day on startup. No other network requests, no telemetry.\n\n## Keybindings\n\n### Motions\n\n| Key | Action |\n|-----|--------|\n| `h` `j` `k` `l` | Left, down, up, right |\n| `w` `b` `e` | Word forward, backward, forward |\n| `0` `^` | Line start |\n| `$` | Line end |\n| `G` | Buffer end |\n\nAll motions take counts: `3j` moves down 3 lines.\n\nWhen the input is empty, `j`\u002F`k` scroll through prompt history instead of moving the cursor.\n\n### Operators\n\n`d` (delete), `c` (change), and `y` (yank) combine with motions:\n\n| Combo | Action |\n|-------|--------|\n| `dd` `cc` `yy` | Operate on whole line |\n| `D` `C` | Delete\u002Fchange to end of line |\n| `dw` `cw` `yw` | To next word |\n| `db` `cb` `yb` | To previous word |\n| `de` `ce` `ye` | To end of word |\n| `d$` `c$` `y$` | To end of line |\n| `d0` `c0` `y0` | To start of line |\n| `d^` `c^` `y^` | To start of line |\n| `dh` `ch` `yh` | Character left |\n| `dl` `cl` `yl` | Character right |\n| `dj` `cj` `yj` | Current + line below |\n| `dk` `ck` `yk` | Current + line above |\n| `yG` | To end of buffer (yank only) |\n\nCounts work on both operator and motion: `2dd` deletes 2 lines, `d3w` deletes 3 words.\n\n### Insert entries\n\n| Key | Action |\n|-----|--------|\n| `i` | Insert at cursor |\n| `a` | Insert after cursor |\n| `A` | Insert at end of line |\n| `o` | Open line below |\n| `O` | Open line above |\n\n### Visual mode\n\nPress `v` in normal mode to enter character-wise visual mode. Motions extend the selection, operators act on it:\n\n| Key | Action |\n|-----|--------|\n| `d` `x` | Delete selection |\n| `c` | Delete selection, enter insert mode |\n| `y` | Yank (copy) selection |\n| `Escape` `v` | Exit visual mode |\n\nAll normal-mode motions work for extending the selection: `h` `j` `k` `l` `w` `b` `e` `0` `$` `G`, with counts.\n\n### Other\n\n| Key | Action |\n|-----|--------|\n| `r{char}` | Replace character under cursor with `{char}` |\n| `x` | Delete character |\n| `u` | Undo |\n| `Ctrl+r` | Redo |\n| `p` | Paste from yank register |\n| `:` | Command palette |\n| `\u002F` | Jump to message (session timeline) |\n| `[` `]` | Scroll conversation half-page up\u002Fdown |\n| `{` `}` | Jump to previous\u002Fnext message |\n| `X` | Backspace |\n| `J` | Join current line with next |\n| `j` `k` | Cycle prompt history (when input is empty) |\n| `Enter` | Submit prompt |\n| `Escape` | Pass through for double-escape interrupt |\n\n## Known gaps\n\n- `V`, `Ctrl+v` - only character-wise visual mode (`v`) is supported, no line-wise or block\n- `ciw`, `di\"`, etc. (text objects) - not yet implemented\n- `gg` - single `g` goes to buffer start immediately, doesn't wait for a second keypress\n- `dG`, `cG` - delete\u002Fchange to buffer end not yet implemented (`yG` works)\n- `e` behaves the same as `w` - the host doesn't expose a separate \"end of word\" command\n- `yy` accuracy - line position is tracked with a counter that drifts on clicks and arrow keys\n- No persistent mode indicator - the toast fades after about a second. Cursor shape is the persistent signal, but a status bar indicator would need the host's SolidJS runtime, which external plugins can't access.\n\nConfigurable key bindings are next once the core vim coverage stabilizes.\n\n## How it works\n\nvimcode registers a key intercept on every prompt keypress. A pure handler in `src\u002Fvim.ts` takes the current mode and key, returns a list of actions (move cursor, delete word, switch mode, etc.) without touching the plugin API. `src\u002Findex.ts` applies those actions through `@opentui\u002Fkeymap` commands.\n\n## Contributing\n\n1. Try it\n2. If it's useful, a star helps others find it\n3. Open issues for bugs or missing keybindings\n4. PRs welcome. See [CONTRIBUTING.md](.\u002FCONTRIBUTING.md) for dev setup and the release process.\n\n## License\n\nMIT\n","vimcode 是一个为 OpenCode 提示环境添加 Vim 键绑定的插件。它通过 TypeScript 实现，允许用户在 OpenCode 中使用熟悉的 Vim 操作模式（如普通模式、插入模式和可视模式），并通过 Escape 键在这些模式之间切换。该插件支持自定义配置选项，例如是否检查更新、显示模式切换提示以及启动时默认进入的模式。适用于希望在 OpenCode 编辑环境中提高文本编辑效率且熟悉 Vim 操作的开发者。注意，此项目仍处于实验阶段，可能会遇到一些问题。",2,"2026-06-11 04:04:32","CREATED_QUERY"]