Fixed
- Table cell cursor bounce-back on macOS (continued) — the
MessageChannel-basedscheduleCrossing()from 0.119.0 still raced with Obsidian's table widget focus handlers on macOS Electron. Replaced withrequestAnimationFrame, which defers the cross-cell focus change until after the full event dispatch cycle and paint frame complete — guaranteeing Obsidian's table widget keydown handlers have finished before the plugin changes cell focus. (#136)- Plugin:
src/vim/table-cell-motions.ts(scheduleCrossingnow usesrequestAnimationFrameinstead ofMessageChannel)
- Plugin:
- Table-nav viewport does not follow cursor in long tables — when navigating down through a table taller than the viewport with
enableTableNav=true, the highlighted cell went off-screen becausenavigate()only updated the CSS highlight class without scrolling. CM6 treats the native table widget as an opaque block decoration and cannot scroll to positions within it. Fixed by registering anEditorView.scrollHandlerfacet that intercepts scroll requests during table-nav mode, reads the highlighted cell's DOM bounding rect, and adjustsscrollDOM.scrollTopdirectly — the CM6-sanctioned mechanism for custom scroll behavior that is not overridden by viewport reconciliation. Addedoverflow: visibleCSS override on the table widget during nav mode to prevent the widget'soverflow: auto hiddenfrom blockingscrollIntoViewpropagation. (#136)- Plugin:
src/vim/table-nav-controller.ts(syncCursorToActiveCell,tableNavScrollHandlerextension) - Styles:
styles.css(overflow: visibleon.vim-motions-table-nav-mode.cm-table-widget)
- Plugin:
Added
- Vim/Neovim built-in gap coverage — systematic effort to close ~50 gaps in vim/neovim built-in command coverage across 8 implementation batches.
- Fork:
@:repeat last ex command — newrepeatLastExCommandaction replays the most recent ex command. Added to defaultKeymap.- Fork:
~/Repos/codemirror-vim/src/vim.js(repeatLastExCommandaction + defaultKeymap entry)
- Fork:
- Fork:
&repeat last:son current line — newrepeatLastSubstituteaction re-executes the last:ssubstitution. Added to defaultKeymap.- Fork:
~/Repos/codemirror-vim/src/vim.js(repeatLastSubstituteaction + defaultKeymap entry)
- Fork:
- Fork:
ZZwrite+quit andZQquit without saving — mapped in defaultKeymap viaexArgs: { input: 'wq' }andexArgs: { input: 'q' }respectively.- Fork:
~/Repos/codemirror-vim/src/vim.js(defaultKeymap entries)
- Fork:
- Fork: Insert
<C-a>re-insert previously inserted text — newreinsertPreviousInsertaction replays the last insert-mode text at the cursor.- Fork:
~/Repos/codemirror-vim/src/vim.js(reinsertPreviousInsertaction)
- Fork:
- Fork: Insert
<C-e>copy character from line below — newcopySameColumnBelowaction copies the character at the same column from the line below.- Fork:
~/Repos/codemirror-vim/src/vim.js(copySameColumnBelowaction)
- Fork:
- Fork: Insert
<C-y>copy character from line above — newcopySameColumnAboveaction copies the character at the same column from the line above.- Fork:
~/Repos/codemirror-vim/src/vim.js(copySameColumnAboveaction)
- Fork:
<C-w>w/<C-w>Wcycle panes — cycle focus to the next or previous pane in the workspace.- Plugin:
src/workspace/navigation.ts
- Plugin:
<C-w>pfocus previous pane — jump to the previously accessed pane using leaf ID tracking.- Plugin:
src/workspace/navigation.ts - Plugin:
src/main.ts(previousLeafIdtracking extracted from Harpoon-gated handler into unconditional handler)
- Plugin:
gmgo to middle of screen line — positions cursor at the horizontal midpoint of the visible editor area.- Plugin:
src/workspace/navigation.ts
- Plugin:
gogo to character offset — jumps to the Nth byte offset in the buffer (with count prefix).- Plugin:
src/workspace/navigation.ts
- Plugin:
g8show UTF-8 byte sequence — displays the UTF-8 hex byte values for the character under the cursor.- Plugin:
src/workspace/navigation.ts
- Plugin:
gFgo to file with line number — opens the file path under the cursor, optionally jumping to a line number suffix (e.g.,file.md:42).- Plugin:
src/workspace/navigation.ts
- Plugin:
<C-g>show file info — displays filename, line count, cursor position, and percentage through file in a notice.- Plugin:
src/workspace/navigation.ts
- Plugin:
<C-^>/<C-6>alternate file switching — switch between the current and alternate (previously edited) file, matching Neovim's<C-^>behavior.- Plugin:
src/main.ts(alternateFilePath/lastMarkdownFilePathfields +<C-^>/<C-6>mapping)
- Plugin:
<C-]>follow link under cursor — alias forgd(go to definition).- Plugin:
src/main.ts
- Plugin:
<C-t>pop from link follow — alias for jump list backward navigation.- Plugin:
src/main.ts
- Plugin:
zs/ze/zH/zLhorizontal scroll commands — scroll the viewport horizontally without moving the cursor.- Plugin:
src/workspace/navigation.ts
- Plugin:
- Ex commands for
:move,:copy, and:normal— add:m/:moveline moves,:t/:copy/:coline copies, and:normal/:normal!key dispatch from the ex line.- Plugin:
src/workspace/commands.ts(line transfer helpers +:normalkey feeding)
- Plugin:
:tabmoveno-op registration — registered as a no-op with a notice (Obsidian has no tab reorder API).- Plugin:
src/workspace/commands.ts
- Plugin:
- No-op crash guards — 21 commands registered as no-ops to prevent crashes on unrecognized keys: window commands (
<C-w>=,<C-w>_,<C-w>|,<C-w>r,<C-w>R,<C-w>x), spelling (]s,[s,z=,zg,zw), normalU,<C-l>,g<C-a>,g<C-x>, insert<C-r>=,<C-k>,<C-v>,<C-x>family.- Plugin:
src/workspace/navigation.ts
- Plugin:
Tests
- 1 new e2e spec file:
test/specs/table-nav-scroll.e2e.ts(viewport scrolling in long tables with constrained scroller height, #136) - 1 new fixture file:
test-vault/fixtures/table-nav/LongTable.md(30-row table for scroll testing) - Updated
test/neovim-command-index.yaml— 50 new entries (287→337 total, 313 tested + 21 skip + 3 pending). - 5 new e2e spec files:
test/specs/vim-builtin/new-commands.e2e.ts(11 tests:@:,&,ZZ,ZQ, insert<C-a>/<C-e>/<C-y>)test/specs/vim-builtin/link-nav-window-cycle.e2e.ts(13 tests:<C-^>,<C-]>,<C-t>,<C-w>w/W/p)test/specs/vim-builtin/ex-move-copy-normal.e2e.ts(19 tests::m,:t,:normal)test/specs/vim-builtin/minor-motions-scroll.e2e.ts(18 tests:gm,go,g8,gF,<C-g>,zs/ze/zH/zL)test/specs/vim-builtin/noop-commands.e2e.ts(10 tests: all no-op crash guards)
Documentation
CHANGELOG.mdAGENTS.md: updated fork description with new actions, updated test file organizationKNOWN_LIMITATIONS.md: added:m/:taddress parsing limitationdocs/reference/keybindings.md: added new normal-mode, insert-mode, window, g-prefix, z-prefix, and ex command entriesdocs/features/ex-commands.md: added:m/:t/:normalediting commands sectiondocs/features/workspace-navigation.md: added pane cycling, alternate file, link navigation, and document info sectionsCONTRIBUTING.md: updatedtable-cell-motions.tsandtable-nav-controller.tsdescriptionsKNOWN_LIMITATIONS.md: documented table-nav viewport scrolling fix
Full Changelog: 0.119.0...0.120.0