Fixed
- Vimium-style hint labels overlap on adjacent elements — When two clickable elements were positioned close together (e.g., a link and a collapse icon in the backlinks sidebar), their hint labels rendered at nearly identical coordinates, making the first label inaccessible behind the second. Root cause:
showHints()positioned each label at the target element's top-left corner with no collision detection. AddedresolveOverlaps()— an AABB collision detection pass (same pattern used by EasyMotion's overlay) that tracks placed label bounding boxes and nudges overlapping labels downward. (#144)- Plugin:
src/ui/hint-mode.ts(addedresolveOverlaps()function, called after initial label creation inshowHints())
- Plugin:
- Obsidian hotkeys blocked inside table-nav mode — Ctrl+P (command palette), Ctrl+S (save), and all other Obsidian hotkeys were silently swallowed while the table-nav overlay was active. Three compounding issues: (1) both the nav scope and cell-edit scope were created with
new Scope()(no parent), disconnecting Obsidian's global hotkey bindings from the keymap resolution chain — unhandled keys were dropped instead of falling through to global hotkeys. (2) The keymap handler'sdefaultcase returnedtrue, telling the scope handler that every non-table-nav key was consumed. (3) The scope handler calledstopImmediatePropagation()on all consumed keys, preventing other DOM listeners from seeing them. Fixed by parenting both scopes toapp.scope, returningfalsefor unhandled keys, and removingstopImmediatePropagation. (#146)- Plugin:
src/vim/table-nav-controller.ts(parent bothScopeinstances tothis.app.scope, removestopImmediatePropagation) - Plugin:
src/vim/table-nav-keymap.ts(default: return true→return false)
- Plugin:
Vc(visual-line change) deletes extra line and mispositions cursor —Vto select a line thencdeleted the trailing newline along with the line content, merging the current line with the next. When the next line was empty, it was deleted entirely. The cursor ended up on the start of the next line instead of staying on the current (now-empty) line. Root cause: the fork'schangeoperator had no dedicated linewise visual branch — the catch-all visual path calledcm.replaceSelections([''])with the CM6 selection that had been expanded to include the start of the next line (head = Pos(line+1, 0)), deleting through the newline. Fixed by adding a dedicatedargs.linewisebranch that usescm.replaceRange('', from, to)to clear line content only (col 0 to end of last selected line), preserving newlines, and positions the cursor at(startLine, 0). (#145)- Fork:
~/Repos/codemirror-vim/src/vim.js(operators.change— newargs.linewisebranch for visual-line change)
- Fork:
zz,zt,zbscroll to wrong positions with visible frontmatter properties — In Live Preview mode, when YAML frontmatter was rendered as a properties widget,ztscrolled to center instead of top,zzovershot center, andzbwas similarly mispositioned. Root cause: the codemirror-vim fork'scharCoords(pos, 'local')method usedcontentDOM.getBoundingClientRect()as the vertical coordinate reference, butscrollTo()operates onscrollDOM. In Obsidian, the.metadata-containerwidget sits insidescrollDOMbut outsidecontentDOM, creating a vertical offset between the two reference points. Fixed by splitting the coordinate reference:contentDOMfor horizontal (goalColumn tracking forgj/gk),scrollDOM+scrollTopfor vertical (scroll-content-space matching CM5localmode). The inverse methodcoordsCharwas updated to match. (#143)- Fork:
~/Repos/codemirror-vim/src/cm_adapter.ts(charCoordsandcoordsCharsplit coordinate reference:contentDOMfor horizontal,scrollDOMfor vertical)
- Fork:
Tests
- 2 new e2e tests in
test/specs/hint-mode.e2e.ts: labels for adjacent elements at the same position should not overlap, labels for elements stacked vertically with small gap should not overlap (#144) - 1 new e2e test in
test/specs/table-nav-hotkeys.e2e.ts: Ctrl+P opens command palette while in table-nav mode (#146) - 4 new e2e tests in
test/specs/vim-builtin/visual-mode.e2e.ts:Vcon middle line,Vcbefore empty line preserves it,Vcon last line,Vjcmulti-line change (#145) - 4 new Neovim golden test definitions in
test/neovim/test-definitions.ts+ golden data recorded intest/neovim/golden-data/visual-mode.json(#145) - 3 new e2e tests in
test/specs/vim-builtin/z-commands.e2e.ts:zz/zt/zbordering with frontmatter visible,ztvszzseparation with frontmatter,ztplaces cursor within top 15% of viewport with frontmatter (#143)
Documentation
CHANGELOG.mdKNOWN_LIMITATIONS.md: marked table-nav hotkey passthrough as fixed (#146)- Fork:
~/Repos/codemirror-vim/DIFFERENCES.md(added "Visual-line change operator (Vc)" section, added "Scroll-spacecharCoords/coordsChar" section) - New
docs/guides/plugin-integration.md: community plugin integration guide with Better Paste recipes and genericvim.obsidian.run_commandpattern (#147) - New
docs/guides/lua-recipes.md: copy-paste Lua snippets for common workflows (display-linej/k, clipboard sync, leader bindings, auto-save, per-vault config, mobile overrides, picker, and more) docs/guides/index.md: added links to both new guide pages
Full Changelog: 0.129.0...0.130.0