Ordered by priority within each category.
-
ReplaceDone.lineTrackerwith direct cursor reads. -
FixDone.ggrequiring two keypresses. -
FixDone.ebehaving identically tow. -
Eliminate
setTimeoutcommand dispatch for operations that can use direct manipulation. Multi-command sequences likeO(home + newline + up) depend on setTimeout ordering. Replace with direct buffer manipulation (cursorOffsetwrites,insertText()) where possible. Keep setTimeout only for commands that genuinely needdispatchCommand(submit, undo/redo, history navigation).
-
Set cursor style viaDone.cursorStyleproperty instead of DECSCUSR escapes. -
Replace
dispatchCommand-based motions with direct cursor manipulation. Motions like h/l/j/k/w/b can callmoveCursorLeft/Right/Up/Down()or writecursorOffsetdirectly instead of dispatchinginput.move.*commands through setTimeout. -
Replace selection commands with
setSelection/setSelectionInclusive. Visual mode currently dispatchesinput.select.*commands. The widget hassetSelection(start, end)andsetSelectionInclusive(start, end), which would be immediate and accurate. -
Replace
yankSelectionsetTimeout with synchronous read. The currentyankSelectionaction defers to let select commands finish. With directsetSelection+getSelectedText(), the yank can happen synchronously. -
Remove
PromptAccessabstraction.getLine(n)andgetLineCount()splitplainTexton every call. WithcursorOffsetandvisualCursoravailable, most callers don't need line-based access. Where they do, readplainTextonce and split.
-
Text objects (
ciw,diw,yiw,ci",di",da(, etc.). Feasible now that we have cursor position access. ReadplainText+cursorOffset, compute the object range in pure logic, apply the edit viasetSelection+deleteSelectedTextor direct text manipulation. Start with word and quote objects, then add bracket/paren. -
Visual-line mode (
V). The widget'sgetLineInfo()andsetSelection()make line-wise selection straightforward. Extend the existing visual mode with avisual-linevariant. -
Done.dG/cG— delete/change to buffer end. -
Proper
ggas go-to-line. Oncegwaits for a second keypress,gggoes to buffer start and{n}Ggoes to line n. -
/vimtoggle command. Register a slash command viaapi.keymap.registerLayer({ commands: [...] })that toggles vim mode on/off. Persist the setting withapi.kv. Lets users disable vim without editing config. -
Custom keymaps. User-configurable key remapping per mode via
tui.jsonoptions. Common requests:jk/kjto exit insert mode,Ymapped toy$. Needs multi-key sequence support with a configurable timeout. -
Pending key display. Show partial key sequences (like
dwaiting for a motion, or the count accumulator) somewhere visible. Right now these are invisible, so the user doesn't know vimcode is waiting for more input. -
Yank flash. Brief highlight on yanked text using
selectionBg/selectionFgwith a short timer (200-300ms), like Neovim'svim.highlight.on_yank(). -
Completion-aware j/k. When the cursor follows
@or/(autocomplete triggers), normal-mode j/k should navigate the completion popup rather than move the cursor. -
Persistent mode indicator. Replace the fading toast with something persistent. Blocked by the no-external-imports limitation for slot-based UI. Might be possible via
api.renderer.keyInput.processParsedKey()or another workaround.
-
Normal-mode cursor clamping. In vim, normal-mode cursor can't sit past the last character on a line. Currently the cursor can land on the newline position after motions like
$orAfollowed by Escape. -
ishould not advance cursor on Escape. Entering and exiting insert mode without typing should leave the cursor where it was (or move left one froma/A). Currently inconsistent. -
ppaste positioning. Vim'sppastes after the cursor for character-wise yanks and below the current line for line-wise yanks. Current implementation always pastes at cursor viaprompt.paste.