0.63.0
Added
- Cross-note vim jump list —
<C-o>and<C-i>now navigate backward/forward through a cross-note jump history. Jumps are recorded when navigating between notes viagd/gD, picker file selection (all 12 sources), harpoon, oil, hint mode,:e/:find/:tabnew/:buffer/:bfirst/:blast, structural buffer cycling (]b/[b), and Luavim.cmd("e ..."). Within-buffer jumps (G, gg, /, ?) continue to use the fork's built-in jump list. Standalone EasyMotion jumps (not operator-pending) are also recorded. The jump list persists across sessions, handles file rename/delete, and supports count prefixes (3<C-o>). New:jumpsex command displays the list. Newjumplist(boolean, default true) andjumplistsize(number, default 200) vim options.- Plugin:
src/vim/jumplist.ts(new:JumpListclass),src/workspace/navigate.ts(new:navigateWithJump/navigateWithJumpFile/navigateWithJumpSetActivewrappers),src/workspace/global-defaults.ts(createJumpListWalkOverride),src/vim/jumplist-bridge.ts(new: CM6 ViewPlugin for fork bridge),src/vim/options.ts(jumplist/jumplistsize),src/easymotion/register.ts(jump recording),src/main.ts(lifecycle, persistence, rename/delete handlers) - 43 navigation call sites migrated across 23 files (goto-definition, picker sources, oil, harpoon, hint mode, global-ex-command, Lua API, buffer cycling, workspace commands, vault search)
- Plugin:
- Table cell vim modality (embedded mode) — cell editors in embedded table widget mode now support a two-Escape pattern: first Escape exits insert → normal mode within the cell editor, second Escape exits the cell editor back to table-nav mode. Entry mode semantics:
i(insert at start),a(append at end),c(clear + insert),s(substitute). Vim registers are shared between cell editors and the main editor. Status bar reflects cell editor vim mode when active.- Plugin:
src/editors/embeddable-editor.ts(mode-aware Escape keymap),src/vim/table-nav-controller.ts(entry mode dispatch viahandleKey),src/vim/mode-tracker.ts(cell editor mode sync)
- Plugin:
ir/artable row text objects —irselects inner row content (between first and last|, excluding pipes),arselects the entire row including pipes. Works in raw markdown mode. Follows the same pattern asi|/a|cell text objects.- Plugin:
src/text-objects/table-row.ts(new),src/text-objects/register.ts
- Plugin:
Fixed
- Hint mode
Fon file explorer and other generic targets opens in current tab instead of new tab — pressingFin hint mode on a file in the left sidebar file explorer (.nav-file-title) opened it in the current tab, identical tof. ThehintOpenNew()function only passedopenInNewPane=trueforlinkandpanetarget types; all other targets (generic,button,input) fell through toopenInNewPane=false, bypassing the existing Ctrl+Meta click path that Obsidian interprets as "open in new tab". SimplifiedhintOpenNew()to always passopenInNewPane=true— the Ctrl+Meta click dispatch at line 344 already handles all non-link, non-pane targets correctly. (#70)- Plugin:
src/ui/hint-mode.ts(hintOpenNewsimplified to unconditionalopenInNewPane=true)
- Plugin:
jumpListWalkaction override lost afterreloadFeatures()— thedefineActionOverride('jumpListWalk', ...)applied duringonload()was wiped byreloadFeatures()(called during vimrc loading) becauseunregisterAll()restored the original action and the override was not re-registered. Fixed by adding the override toreloadFeatures()alongside the existingnewLineAndEnterInsertModeoverride.- Plugin:
src/main.ts(addedjumpListWalkoverride toreloadFeatures())
- Plugin:
- First character swallowed when entering table cell editor — pressing
iin table-nav mode opened the cell editor and immediately dispatchedhandleKey(adapter, 'i'), but the vim extension on the cell editor's CM6 instance hadn't finished initializing. The dispatchediwas either a no-op (vim not ready) or treated as typed text. Fixed by deferring thehandleKeydispatch viasetTimeout(fn, 0).- Plugin:
src/vim/table-nav-controller.ts(deferredhandleKeyinenterCellEdit)
- Plugin:
Tests
- 27 unit tests in
test/unit/jumplist.test.ts:JumpListclass — record, deduplication, jumpOlder/jumpNewer with count, handleRename, handleDelete with index adjustment, serialize/deserialize, max size eviction, forward history truncation, onRecord callback - 10 e2e tests in
test/specs/jump-list.e2e.ts: within-buffer G/gg/count<C-o>, cross-notegd→<C-o>→<C-i>, jump list data structure verification,:jumpsmodal, jumplist setting toggle, deleted file resilience - 4 e2e tests in
test/specs/table-cell-vim-mode.e2e.ts:dir/dar/yirtable row text objects,irno-op on non-table content - 9 skipped e2e tests for embedded table cell editing (two-Escape, entry modes, register sharing) — test-environment limitation where CM6 table widget rendering does not activate through
registerEditorExtensionin WDIO; features verified manually
Documentation
CHANGELOG.md: Added entries for cross-note jump list, table cell vim modality, ir/ar text objects, jumpListWalk override fix, cell editor first-character fix, hint modeFfile explorer fixKNOWN_LIMITATIONS.md: Cross-note jump list → Implemented (with cross-window limitation noted); table cell vim modality → documented two-Escape pattern and entry modes; ir/ar text objects → documented; hint modeF→ updated behavior table (all targets now open in new tab)README.md: Added cross-note jump list to features listCONTRIBUTING.md: Added jumplist.ts, navigate.ts, table-row.ts, jumplist-bridge.ts to codebase structuredocs/reference/keybindings.md: Added<C-o>/<C-i>jump list,:jumps,ir/artext objectsdocs/features/hint-mode.md: UpdatedFaction description to include file explorer and generic targetsdocs/features/tables.md: Added vim modality in cell editors section, table row text objectsdocs/configuration/settings.md: Addedjumplistandjumplistsizesettingsdocs/configuration/vimrc.md: Addedjumplist/jumplistsizeoptions
Full Changelog: 0.62.0...0.63.0