Changed
- Formatting mark cursor fix rewritten — replaced
RangeSetBuilder.prototypemonkey-patching with a CM6EditorState.transactionFilterthat corrects cursor positioning near formatting marks in Live Preview. The new approach walks the Lezer syntax tree to identify formatting mark nodes and snaps cursor endpoints that land inside mark ranges to the nearest boundary. Includes end-of-line boundary handling to prevent cursor oscillation when formatting marks extend to the line end (e.g.**he**with no trailing content). This eliminates conflicts with obsidian-latex-suite (#32) and fixes formatting marks being visible in live preview (#33). The'always'formatting mark mode has been removed (users are migrated to'cursor').
Added
- Block visual insert (
I/A), change (c/C) —CTRL-Vblock visual mode now supportsI(insert at left column),A(append at right column),c(change block), andC(change to EOL) with multi-cursor editing on all selected lines. Text appears on all lines in real-time as you type (unlike Neovim, where text only appears on the primary cursor until<Esc>). Short lines that don't reach the block column are skipped, matching Neovim behavior. Dot-repeat (.) works for block insert operations. Block visual delete (d), yank (y), paste (p/P), indent (>/<), replace (r), and case toggle (~) were already working.- Fork:
enterInsertModepreserveswasInVisualBlockbeforeexitVisualModeclears the flag - Fork:
selectForInsertskips lines shorter than the block column instead of clipping - Fork:
operators.changeadds avim.visualBlockpath for block change and block change-to-EOL - Fork:
exitInsertModepositions cursor at the block's left column viablockInsertLeftinstead of the standardch - 1, matching Neovim's cursor placement after blockA - Fork:
makeCmSelectionblock mode treatsfromCh === toCh(zero-width block) the same asfromCh < toCh, fixingCon zero-width blocks - Fork:
repeatInsertModeChangesusesblockInsertLeftfor cursor placement after dot-repeat instead of hardcoded+1
- Fork:
- Neovim golden comparison tests for block visual: 13 golden test cases in
test/specs/vim-builtin/visual-block-golden.e2e.tscovering insert, append, change, change-to-EOL, delete, case toggle, replace, short-line handling, block yank/paste, zero-width block C, zero-width block I, A cursor position, and upward selection - Spike test suite
test/specs/spikes/spike-block-insert.e2e.tswith 10 tests covering all block visual insert scenarios - Command index entries:
CTRL-V_I,CTRL-V_A,CTRL-V_c,CTRL-V_C,q,@,@@ - Neovim golden comparison tests for marks: 5 golden test cases in
test/specs/vim-builtin/marks-golden.e2e.tscoveringma/'a,`b,'.,'',`` - Neovim golden comparison tests for macros: 5 golden test cases in
test/specs/vim-builtin/macros-golden.e2e.tscoveringqa/@a,2@a,@@,3@a, insert replay - Expanded register golden tests: 3 new cases (
"Ayyappend,"0pnumbered register,"a/"bindependent) innormal-yank-putsuite - Expanded search/replace golden tests: 2 new cases (
:%sglobal,:2,3srange) inex-commands-builtinsuite - Formatting mark cursor golden tests: 3 new cases (
wthrough**,fpast**,ethrough backticks) innormal-motionssuite
Fixed
- Vimrc
whichkeygroup/whichkeylabelcommands crash on load —defineEx('whichkeygroup', 'wkg', ...)threwError: (Vim.defineEx) "wkg" is not a prefix of "whichkeygroup"becausedefineExrequires the short form to be an actual starting substring of the command name, not an arbitrary abbreviation. Same issue forwhichkeylabel/wkl. Fixed by changing the prefixes to valid substrings:whichkeygandwhichkeyl. User-facing vimrc syntax (whichkeygroup,whichkeylabel) is unchanged. Theset whichkeygrouping/set wkgoption alias (handled by a separateKNOWN_SET_OPTIONSpath) was already correct and unaffected. (#31) - Block visual mode deviations removed — all
CTRL-Vblock visual deviations intest/neovim/deviations.tshave been removed. Block insert/change now matches Neovim output with zero deviations: cursor position afterAexit is correct, short lines are skipped, and zero-width blocks work for all operators. - Golden recording infrastructure —
test/neovim/record-golden.tsnow sends<Esc><Esc>before each test case to reset Neovim to normal mode, preventing stale visual/insert mode state from leaking between test cases. This fixed 5 pre-existing incorrect golden values ing-commands.json(3 mode corrections) andvisual-mode.json(1 mode correction, 1 cursor + mode correction). - Search dispatch in test wrapper —
test/neovim/test-wrapper.tsnow detects/pattern\nand?pattern\nsearch sequences and dispatches the search + post-keys separately with a settle pause, improving reliability for search-dependent golden tests.
Documentation
KNOWN_LIMITATIONS.md: added "Block visual mode (CTRL-V) insert not supported (Fixed)" sectionDIFFERENCES.md(fork): added "Block visual insert (I/A), change (c/C)" section documenting all 6 fork changesREADME.md: added block visual insert/change to recommended setup section
Full Changelog: 0.23.0...0.24.0