Added
- Smart list continuation on
o/O— pressingoorOon a Markdown list line now automatically continues the list marker on the new line. Supports unordered lists (-,*,+), ordered lists (1.,1)), task lists (- [ ],- [x]), ordered task lists (1. [ ]), custom checkbox states (- [!],- [?],- [/], etc.), indented lists, blockquote lists (> -), and nested blockquotes (> > -). Ordered lists increment the number foro(below) and keep the same number forO(above). Checked tasks always continue with an unchecked[ ]. Lines inside fenced code blocks are excluded. Controlled by Settings → Vim Motions → Smart list continuation on o/O (on by default). Disable for plain Neovim behavior.- Fork: added
getAction(name)API to thevimApiobject for action introspection, enabling the save/restore pattern for built-in action overrides - Plugin: added
defineActionOverridemethod toVimRegistrationthat captures the original action before overriding and restores it on plugin unload — ensuringo/Orevert to default vim behavior when the plugin is disabled
- Fork: added
- Fork test count: 1690 (up from 1686, 4 new
getActionAPI tests) - E2E test suite
test/specs/open-line-list.e2e.tswith 35 tests covering all list types, indentation levels, blockquotes, nested blockquotes, code block exclusion, undo, and edge cases
Fixed
Oon first line after frontmatter behaves likeo— pressingOon the first content line below YAML frontmatter inserted the new line into the frontmatter region (swallowed by Obsidian's properties UI) instead of above the current line. Fixed in both the fork and the plugin:- Fork:
newLineAndEnterInsertModeinvim.jscomparedinsertAt.line === cm.firstLine()— always false when frontmatter is present. Now scans past----delimited frontmatter to find the first editable line and usesinsertAt.line <= firstEditableas the boundary check. The insertion point uses{ line: insertAt.line, ch: 0 }instead of hardcodedfirstLine(), so it works for all line types (plain text, headings, etc.) with or without frontmatter. - Plugin: the smart list continuation override in
open-line.tshad the samecurLine === cm.firstLine()issue. AddedfirstEditableLine()helper with the same frontmatter scan, changed the boundary check tocurLine <= firstEditableLine(cm), and updated the insertion point to{ line: curLine, ch: 0 }.
- Fork:
- E2E regression tests for
o/Owith frontmatter:Oon unordered/ordered/task list after frontmatter inserts above,oafter frontmatter inserts below,Oon non-list line after frontmatter inserts above,oon non-list line after frontmatter inserts below,Oon second line after frontmatter uses normal insertion path gkon wrapped line after frontmatter jumps straight to properties — when the first line below the frontmatter wraps across multiple display lines,gknow correctly navigates through the wrapped display lines before entering the properties panel. Previously, thestuckAtBoundarycheck in the fork'sfindPosVtreated display-line movement within a wrapped line as "stuck" (same document line) and immediately firedfocusBefore. The check now also verifies that the cursor offset truly didn't change (range.head === startOffset), distinguishing "cursor moved to a higher display line within a wrapped line" from "cursor is truly stuck at the frontmatter boundary." (#25)let mapleader = " "(space) not working as leader key — space as leader now works regardless of which features are enabled. The default<Space>→lbinding in codemirror-vim's keymap consumed the space keystroke before leader-prefixed sequences could accumulate. Previously,unmapDefaultBinding(leader)was only called insideregisterEasyMotion(), so the fix only applied when EasyMotion was enabled. The plugin now unmaps the leader key's default binding centrally — after vimrc loading, inreregisterLeaderFeatures(), and inreloadFeatures()— so any key used as leader (space, comma, semicolon, etc.) works for all leader-dependent features (table manipulation, hint mode, settings leader bindings) even when EasyMotion is disabled. (#21)- Mislabeled "space as leader" e2e test — the
describe('space as leader')test block was loadinglet mapleader = ","instead oflet mapleader = " ", making it a duplicate of the comma test rather than a true space leader test. Fixed to use space, providing actual cross-platform regression coverage. - E2E regression tests for
gkwrapped-line frontmatter edge case:gknavigates display lines on wrapped first content line,gkenters properties on non-wrapping first content line,kenters properties from first content line
Changed
- Settings tab reorganized — settings are now grouped under section headings for easier navigation: Vim features (text objects, structural navigation, hard-wrap, smart list continuation, table navigation, table widget mode, workspace navigation), Jump navigation (EasyMotion, hint mode, shared label font size), Status bar (mode indicator, chord display, powerline, mode prompts), Cursor shapes, Vimrc & key bindings (vimrc toggle, leader key bindings), Which-key hints (mode, grouping, group labels), Advanced (scrolloff, multi-line scan range). Previously, settings appeared as an undifferentiated list with only a few headings.
- EasyMotion label characters — now exposed as a dedicated text field in the Jump navigation settings section. Previously only configurable by knowing the default value.
Documentation
KNOWN_LIMITATIONS.md: added "Smart list continuation and frontmatter" section documenting theOboundary fixDIFFERENCES.md(fork): added "Frontmatter-awareO(open line above)" section documenting thenewLineAndEnterInsertModefixREADME.md: updated smart list continuation description to mention frontmatter awarenessREADME.md: updated settings list to reflect new section grouping and orderingKNOWN_LIMITATIONS.md: updated "Properties navigation" section with wrapped-linestuckAtBoundaryedge case fixDIFFERENCES.md(fork): updated "Properties navigation" section withrange.head === startOffsetguard
Full Changelog: 0.20.0...0.21.0