Added
- Cursor line highlight —
set cursorline/set nocursorlinewithcursorlineopt(number/line/both). Compartment-based runtime switching. - Fold column —
set foldcolumnshows ▸/▾ indicators for foldable regions with click-to-fold. Uses CM6foldable()/foldedRanges()APIs. numberwidthoption —set numberwidth=Ncontrols minimum line number column width (1–20, default: 2).- Mobile gutter width reduction — line number gutter uses smaller font and reduced width on viewports ≤ 600px.
- Configurable line number gutter —
set number,set relativenumber, or both for hybrid mode (absolute on current line, relative on others), matching Neovim's semantics exactly. Uses a custom CM6gutter()withCompartment-based runtime switching —:set number/:set nonumbertake effect instantly without full feature reload. When the plugin's line number gutter is active, Obsidian's native line numbers are suppressed via CSS to prevent duplication. Defaults to off (matching Neovim defaults).- Settings: Settings → Vim Motions → Line numbers — two toggles: Line numbers, Relative line numbers
- Vimrc:
set number/set nonumber(aliasnu),set relativenumber/set norelativenumber(aliasrnu) - Lua:
vim.opt.number = true,vim.opt.relativenumber = true - Plugin:
src/vim/line-number-gutter.ts(new),src/settings.ts,src/vim/options.ts,src/vimrc/loader.ts,src/main.ts,styles.css
- Picker provider API — external plugins can register custom picker sources via
window.VimMotions.picker.registerSource(). The API validates namespaced source names (pluginId:sourceName), wraps external source methods in try/catch with 5-second timeout, caps results at 10,000 items, and emitssource-registered/source-unregisteredevents. Consumer plugins discover the API viawindow.VimMotions.pickerorapp.plugins.plugins['vim-motions'].pickerAPI.- Lifecycle:
vim-motions:picker-readyworkspace event fires after API installation; consumers useonLayoutReady+ event listener pattern for load-order safety. - Type definitions:
src/picker/picker-api.d.tsships standalone types for consumer plugins with full JSDoc and usage examples. - Plugin:
src/picker/api.ts(new),src/picker/picker-api.d.ts(new),src/picker/registry.ts(extended),src/picker/types.ts(metadata fields),src/main.ts(API wiring)
- Lifecycle:
- Meta-picker —
:Picker(no arguments) opens a source browser listing all registered picker sources grouped by "Built-in" / "Extensions", with display names, icons, and keymap bindings shown. Selecting an entry opens that picker.:Picker <source>opens a named source directly.- Plugin:
src/picker/sources/pickers.ts(new),src/workspace/commands.ts(:Pickerex command),src/main.ts(picker-pickersObsidian command)
- Plugin:
- Picker source metadata —
PickerSourceinterface extended with optionaldisplayName,icon,description, andpriorityfields. All 12 built-in sources now include metadata for display in the meta-picker.- Plugin:
src/picker/types.ts,src/picker/sources/*.ts(all 12 source files)
- Plugin:
- Bundled picker integrations — three built-in picker sources that auto-detect and integrate with popular plugins:
- Omnisearch (
omnisearch) — dynamic full-text vault search viaglobalThis.omnisearch.search(). 150ms debounce, min 2-char query. Jumps to first match offset on selection. - Obsidian Tasks (
tasks) — shows all incomplete tasks sorted by due date, grouped by status type. Cached with event-based invalidation viaobsidian-tasks-plugin:cache-update. Jumps to task line on selection. - Dataview (
dataview) — lists all Dataview-indexed pages with tags and aliases in description. Filterable by the picker's fuzzy matcher. - All three are gated by settings toggles in Settings → Vim Motions → Third-party integrations (default: enabled) and by runtime plugin detection via
onLayoutReady. - Plugin:
src/picker/sources/omnisearch.ts(new),src/picker/sources/tasks.ts(new),src/picker/sources/dataview.ts(new),src/main.ts(detection + registration),src/settings.ts(3 toggles)
- Omnisearch (
Fixed
- Obsidian line numbers leaking into table cell editors — when Obsidian's "Show line numbers" setting is enabled, line number gutters appeared inside embedded table cell editors where they shouldn't. Fixed by suppressing
.cm-guttersin cell editors via CSS. (#19)- Plugin:
styles.css
- Plugin:
Changed
enableMarkGuttermigrated tosigncolumn— the boolean toggle is now a dropdown with Auto/Always/Off modes matching Neovim'ssigncolumnoption. Existing settings are auto-migrated.set markgutter/set nomarkgutterremain as backward-compatible aliases.- Mark gutter internals refactored — the mark gutter implementation has been extracted into a dedicated
sign-column.tsmodule. The rendering approach is unchanged (line decorations + CSS::afteroverlay, zero layout shift), but the internal architecture now cleanly separates the sign column field from the refresh scheduling API. No user-facing changes.- Plugin:
src/vim/sign-column.ts(new),src/vim/mark-gutter.ts(refactored to delegate)
- Plugin:
Documentation
docs/configuration/settings.md: addednumberwidth,cursorline,cursorlineopt,signcolumn, andfoldcolumnsettingsdocs/configuration/vimrc.md: added new gutter options andmarkgutteralias to options tablesdocs/configuration/lua-config.md: added new gutter options tovim.opttabledocs/features/marks.md: updated to mentionsigncolumnas the canonical way to toggle mark indicatorsKNOWN_LIMITATIONS.md: added notes onsigncolumnoverlay behavior andcursorlineopt=screenlinesupportdocs/configuration/settings.md: added Line numbers settings groupdocs/configuration/vimrc.md: addednumber/nu,relativenumber/rnuto boolean options tabledocs/configuration/lua-config.md: addedvim.opt.number,vim.opt.relativenumberwith hybrid mode tipKNOWN_LIMITATIONS.md: removednumberandrelativenumberfrom "not implemented" options listdocs/development/picker-api.md: new provider API reference with consumer guide, API surface, integration examples (Omnisearch, Tasks), and lifecycle documentationdocs/development/index.md: added picker provider API linkdocs/reference/keybindings.md: added:Picker/:Pickto ex commands tableKNOWN_LIMITATIONS.md: added picker provider API pop-out window limitationdocs/configuration/settings.md: added Third-party integrations settings groupdocs/development/picker-api.md: added bundled integrations sectioneslint.config.mts: added.obsidian-cacheto global ignores (downloaded community plugin JS files)wdio.conf.mts: added Omnisearch, Tasks, Dataview asenabled: falseplugins for integration testingtest/specs/picker-integration.e2e.ts: 12 e2e tests covering source registration, picker opening, search results, meta-picker listing, and plugin disable/enable lifecycle
Full Changelog: 0.51.1...0.52.0