0.32.0
Added
- Select mode (
gh/gH/g<C-h>) — Vim select mode where typing replaces the selection and enters insert mode.ghenters charwise,gHlinewise,g<C-h>blockwise.<C-g>toggles between visual and select mode.<BS>deletes the selection. Matches Neovim behavior. (#45)- Fork:
enterSelectMode,toggleSelectMode,preventReselectactions invim.js;selectModeflag on vim state;'select'context for keymap dispatch with visual fallback;gvpreserves and restores select mode vialastSelection - Fork:
:smap,:snoremap,:sunmap,:smapclearex commands for select-mode-specific mappings - Fork:
selectmodeoption (set selectmode=cmdmakesv/V/<C-v>enter select mode);keymodeloption (accepted, shifted cursor key behavior deferred) - Plugin: status bar shows
SELECT,data-vim-mode="select", powerline CSS with::aftertriangle, Style Settings entries - 16 fork browser tests, 5 Neovim golden test cases, 3 e2e tests
- Fork:
- Virtual Replace mode (
gR) — replace mode that operates on screen columns instead of byte positions. TAB-aware virtual column math with replace stack for<BS>restore.<Insert>toggles between virtual replace and insert mode. (#45)- Fork:
virtualReplaceCharandvirtualReplaceBackspaceadapter methods incm_adapter.ts;virtualReplaceflag andreplaceStackon vim state;{mode: "vreplace"}mode change event - Plugin: status bar shows
V-REPLACE,data-vim-mode="vreplace", powerline CSS, Style Settings entries - 10 fork browser tests, 3 Neovim golden test cases, 2 e2e tests
- Fork:
- Visual Line / Visual Block mode indicators — status bar now distinguishes
V-LINEandV-BLOCKfromVISUAL. Uses the fork's existingsubModeevent field. (#45)- Plugin: mode-tracker maps
subMode: "linewise"→visualLine,"blockwise"→visualBlock;data-vim-mode="v-line"/"v-block"; powerline CSS + Style Settings entries - 3 e2e tests
- Plugin: mode-tracker maps
- Command-line and Search mode indicators — status bar shows
COMMANDwhen:prompt is open andSEARCHwhen/or?prompt is open. Detects dialog type via DOM text node inspection of the fork's"dialog"event. (#45)- Plugin:
dialogHandlerin mode-tracker withpreDialogModetracking for restoration on dialog close;getDialogPrefix()walks DOM child nodes;data-vim-mode="command"/"search"; powerline CSS + Style Settings entries - 5 e2e tests (including rapid
:→Esc→/→Esccycling)
- Plugin:
- Insert-Normal mode indicator — status bar shows the configured insert-normal prompt (default
NORMAL) when<C-o>is pressed in insert mode, then returns toINSERTafter one command. (#45)- Plugin: mode-tracker detects
subMode.startsWith('ctrl-o')→insertNormal;data-vim-mode="insert-normal"; powerline CSS - 2 e2e tests
- Plugin: mode-tracker detects
- All 11 mode prompts configurable — mode prompt text for all modes (normal, insert, visual, v-line, v-block, replace, select, v-replace, command, search, insert-normal) is configurable via Settings UI and vimrc (
let g:mode_prompt_visual_line = "VL", etc.)- Plugin:
ModePromptsinterface expanded; settings UI entries for all modes; vimrcVIMRC_MODE_MAPwith snake_case → camelCase mapping;RELOAD_KEYSupdated
- Plugin:
- Configurable which-key popup delay — the delay before the which-key popup appears is now configurable via Settings → Vim Motions → Which-key hints → Which-key popup delay or
set whichkeydelay=<ms>(aliaswkd) in vimrc. Range 0–2000ms, default 500ms. Set to0for instant display. Once the popup is visible, subsequent keystrokes update it instantly — the delay only applies to the initial appearance. Single-key commands that resolve immediately never trigger the popup regardless of delay setting.src/settings.ts: addedwhichKeyDelay: numbertoVimMotionsSettings(default 500), added toRELOAD_KEYS, added number input control in "Which-key hints" groupsrc/vimrc/loader.ts: addedwhichkeydelay/wkdtoKNOWN_SET_OPTIONS(number, 0–2000)src/ui/which-key.ts: replaced hardcodedSHOW_DELAYwith configurableshowDelayconstructor parameter;onKeyPressGeneralupdates overlay immediately when already visible instead of restarting delay; extractedshowCompletionsIfPartial()helpersrc/ui/global-which-key.ts: same pattern — configurable delay, instant updates when overlay already visiblesrc/main.ts: passessettings.whichKeyDelayto bothWhichKeyOverlayandGlobalWhichKeyOverlayconstructors
Fixed
<C-o>in replace mode returns to insert instead of replace —oneNormalCommandnow saves the pre-Ctrl-O mode state and returns to the correct mode (insert, replace, or virtual replace) after the single normal command. Uses_suppressModeSignalto prevent a spurious{mode:"normal"}event, emitting{mode:"normal", subMode:"ctrl-o"|"ctrl-o-replace"|"ctrl-o-vreplace"}instead. (#45)- Fork:
insertModeReturnArgson vim state;_suppressModeSignalflag inexitInsertMode - 5 fork browser tests, 2 Neovim golden test cases, 2 e2e tests
- Fork:
Rmode<BS>does not restore original character — regular replace mode now maintains a replace stack (same mechanism as virtual replace).<BS>restores the original character under cursor, matching Neovim behavior. Previously,<BS>only moved the cursor left. (#45)- Fork:
handleReplaceModeInputpushes original chars toreplaceStackbefore overwriting; BS pops and restores with explicitsetCursorfor correct positioning - 4 fork browser tests
- Fork:
- Replace/vreplace character I/O only works through DOM events — unified replace mode character handling from
index.ts(DOM-only path) intovim.js(handleReplaceModeInput).Vim.handleKeyis now authoritative for all replace-mode operations — programmatic dispatch, macro replay, and dot-repeat work correctly through both paths. (#45)- Fork:
handleReplaceModeInputinvim.jscalled fromhandleKeyInsertModematch.type == 'none'branch;virtualReplaceChar/virtualReplaceBackspaceadapter methods; removed overwrite block and helpers fromindex.ts - 7 fork browser tests (overwrite, BS restore, dot-repeat, macro replay, Ctrl-H)
- Fork:
Documentation
docs/configuration/status-bar.md: lists all 11 mode indicators, alldata-vim-modeattribute values, all CSS variables, all vimrc directives, fork mode requirement calloutdocs/configuration/settings.md: all 11 mode prompt settings with vimrc equivalentsdocs/guides/style-settings.md: all 20 powerline CSS variables (bg + fg for 10 modes)docs/reference/keybindings.md: select mode (gh,gH,g<C-h>,<C-g>,gV) and virtual replace (gR) sectionsdocs/reference/known-limitations.md: select mode and virtual replace mode limitationsKNOWN_LIMITATIONS.md:selectmode=mouseCM6 limitation,selectmode=key/keymodel=startseldeferred, East Asian Width,gRnewline behaviorDIFFERENCES.md(fork): 7 new sections covering select mode, virtual replace, replace stack, unified char handling, Ctrl-O fix, mapping commands, type changes
Full Changelog: 0.31.0...0.32.0